当前位置: 首页 > news >正文

C语言比Java、Python高效

首先:语言最终都是在机器上执行,需要编译成机器可以识别的二进制可执行文件。

C语言能和汇编指令几乎能直接翻译,而机器语言和汇编又能直接翻译。C是最快的语言因为它是最靠近及其底层的语言。

在写C语言的时候,代码的效率几乎是用机器语言的效率。不过具体还要取决于具体的编译器,不同的编译器对代码的翻译是不一样的,有的编译器会理解代码中无用的语句进行删除。C语言在开发之初就是为弥补汇编语言不能跨平台和模块化不好等原因。

C语言在开发操作系统是非常适用的,因为C语言有指针,C语言可以直接操作内存地址,使得我们不用使用汇编,但是汇编也是少不了的,不过只有很少的一部分我们需要用汇编,因为C语言没有直接的语句与之对应。比如LGDT等指令。

Java和Python是基于Java虚拟机和py解析器的语言,并非最终生成机器语言

C语言没有什么特别,这就是它快速的秘诀。

新的语言支持更多的特性,比如,垃圾回收(garbage collection),动态类型(dynamic typing)等等。这些新加入的特性让出学者们更容易上手。

问题的关键就在于,这些新的功能增加了处理开销(processing overhead),也就降低了程序性能。而C语言中没有这些功能,它不需要这些额外的开销,这也意味着程序员自己要分配和释放内存,时刻注意内存泄露问题,处理静态类型的变量。

C语言的设计者权衡了利弊,把速度的需求放在了安全之上。C语言不会:

  • 检查数组索引是否越界
  • 检查未初始化的变量。
  • 检查内存泄露。
  • 检查空的指针的解引用。

当你在JAVA中使用数组索引时,虚拟机中有一些方法调用来检查索引越界和其他的合理性问题。但在C语言中即使是再微小的事情都有安全隐患。它不是用来编写大型的商业软件的。

但这些设计上的决定并不是bugs。这些设计的初衷是为了让编译器和库的编写者可充分利用计算机每一个bit的计算能力。

即便如此,许多语言和平台,例如Java(和它的虚拟机),.NET(和它的通用语言运行库),随着即时编译(从字节码产生本地机器码)等技术的出现,这些年的运行速度也有了很大的提高。

C语言的精神和理论解释:

C语言的不可移植。尽管C语言允许程序员编写可移植的代码,委员会并没有强迫程序员编写可移植的代码,把C语言当成高级汇编语言。能够编写特定机器的语言是C语言的特征之一。

保持C语言的精神。委员会这么做的主要目的也是为了继承C语言的传统精神。这项精神有很多方面,但最根本的是C语言基本原则产生的社区情感,这种社区情感被使用C语言的人所共有。C语言的一些精神可以总结如下:

  • 信任程序员。
  • 不阻止程序员做任何必要的操作。
  • 保持语言的简洁和简单。
  • 一种操作只提供一种方法。
  • 保持速度,即使牺牲可移植性。

稍稍解释一下最后一条,产生高效代码的潜能是C语言最重要的能力。为了力求对一个简单的操作不会出现代码爆发(简单操作需要大量代码),许多操作定义为目标机器的硬件如何操作而不是一般化的抽象规则。这种与机器配合的意愿例子有很多,比如在规定表达式中字符对象的宽度时,字符对象的值是转换为有符号还是无符号类型完全取决于哪种类型在目标机器中计算起来更快。

总之就是:如果想要更高的执行速度那就得牺牲语言操作的简便性,二者不可兼得。

相关文章:

  • C语言-比较字符串是否相等
  • C语言里指针和引用的区别
  • 大数据平台数据集市
  • 认证SQL基础知识
  • Caused by: java.lang.IllegalArgumentException:LoggerFactory is not a Logback LoggerContext but Logba
  • C语言-快速排序
  • JAVA实现-URL短网址生成算法
  • JAVA-字符串连续出现字母进行压缩
  • C语言-字符串连续出现字母进行压缩
  • C语言数组引用
  • c语言中二维数据的存储方式
  • C语言-注释符
  • C语言%d%c%f
  • C语言-定义一个字符串
  • 2019
  • 【刷算法】从上往下打印二叉树
  • 78. Subsets
  • Angular Elements 及其运作原理
  • Angular数据绑定机制
  • CAP理论的例子讲解
  • create-react-app项目添加less配置
  • ECMAScript入门(七)--Module语法
  • HTML5新特性总结
  • MD5加密原理解析及OC版原理实现
  • SpringBoot 实战 (三) | 配置文件详解
  • webgl (原生)基础入门指南【一】
  • 力扣(LeetCode)56
  • 利用阿里云 OSS 搭建私有 Docker 仓库
  • 排序(1):冒泡排序
  • 树莓派用上kodexplorer也能玩成私有网盘
  • # .NET Framework中使用命名管道进行进程间通信
  • $.proxy和$.extend
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (html5)在移动端input输入搜索项后 输入法下面为什么不想百度那样出现前往? 而我的出现的是换行...
  • (TipsTricks)用客户端模板精简JavaScript代码
  • (二)正点原子I.MX6ULL u-boot移植
  • (附源码)ssm智慧社区管理系统 毕业设计 101635
  • (附源码)计算机毕业设计ssm高校《大学语文》课程作业在线管理系统
  • (免费分享)基于springboot,vue疗养中心管理系统
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • (收藏)Git和Repo扫盲——如何取得Android源代码
  • (学习日记)2024.01.19
  • (一) storm的集群安装与配置
  • ******之网络***——物理***
  • .h头文件 .lib动态链接库文件 .dll 动态链接库
  • .NET 4 并行(多核)“.NET研究”编程系列之二 从Task开始
  • .NET MVC第五章、模型绑定获取表单数据
  • .NET Standard / dotnet-core / net472 —— .NET 究竟应该如何大小写?
  • .NET 跨平台图形库 SkiaSharp 基础应用
  • .net/c# memcached 获取所有缓存键(keys)
  • .NET开发人员必知的八个网站
  • .sys文件乱码_python vscode输出乱码
  • @Builder用法
  • @cacheable 是否缓存成功_Spring Cache缓存注解
  • @JoinTable会自动删除关联表的数据