【CSDN编译整理】近日,beza1e1上发表了一篇博客《Faster than C》,在Hacker
News和Reddit Programming上引发了开发者们的激烈讨论。现将此文编译,我们一起来探讨下。
单从编程语言特性来判断,虽然Fortran语言也以快而著称,但开发者们还是将C语言称之为领导者。开发者创建新一门语言通常以C语言为参照对象,将语言编译时间与C语言进行对比,会因比C语言慢多少而引以自傲。然而,很少有语言能够击败C。
那么,什么样的语言才能比C更快呢?
更好的别名机制(Better Aliasing Information)
别名实际上是指两个引用指向同一个内存位置。例如,典型的内存复制(not memcpy from stdlib.h!)
- void*memcopy(void*dst,constvoid*src,size_tcount){
- while(count--)*dst++=*src++;
- returndst;
- }
根据目标架构,编译器利用代码对此进行大量的优化。比如,X86利用SSE指定MOVDQU,它可以复制16字节,而非4字节(sizeof(void*))。然而,因为Aliasing(别名),dst中以src+1为例,在这种情况下,结果在dst出现的第一句一定是*src,由于C语义的原因,编译器不允许使用MOVDQU。
在C99中新增了限制性关键字,我们在这里使用的编码src和dst与其他地方引用的不同。在某些情况下这种机制比较受用,能够起到帮助,但在我们的例子中却不受用。
Fortran语义称函数参数从未有过别名(alias ),Fortran中单独有数组类型,而在C中,数组实质上是指针。这就是为什么Fortran经常比C更快的原因以及为什么依然要在Fortran中编译数值库的原因,当然它还涉及到指针算法的成本问题。
因此,想要创建一门比C更快的语言应该提供更容易被编译器处理的别名机制。
在编译阶段完成运算(Push Computation to Compile-Time)
在编译时应当减少运行时间,当然,在C编译器像1+2这样的案例,加法运算在编译阶段就完成了。编程语言利用完美的元编程语言能够使程序员可以做一些特定优化的应用。一个简单的实例,比如fib(20)可以写成6765。一个真实的例子,Eigen C++ library for linear algebra通过使用C++模板来避免复制和一些计算指令 。Lisp是宏观系统技术之父。比如,一个学生使用Scheme的编码奇闻。基本上,程序员可以在编译过程中修改抽象的语法树,用这样的元编程特性来权衡是很复杂的。程序员往往会低估了如何编译正确宏的困难性如同他们会低估如何编译正确的并发程序一样。
一门语言的设计者应该好好思考下元编程。在编译的时候多思考要像C++ 模板那样能够提供多种益处的性能。
运行优化(Runtime Optimization)
在运行时,有动态信息显示不适用于静态编译器,C语言可以复制任何一个特定的示例,一般情况下,它是不可行的。该技巧只解决了问题的一小部分。
运行时优化whole-world变得相当的容易。尽管这可能是静态的,C语义(编译单元)和强制性的预处理器使其编译起来更难,尽管Python通过inlining across file borders(PyPy)击败了C。
当然也有使用JIT,但在嵌入式系统语言是不适宜的。虽然Java,C#或者是其他语言击败了C,但它们不会威胁到C的用户群。
结束语:
想要创建一门比C要快的新的语言,更好的别名机制是我唯一确定能提高语言速度的方法,因为在C中无法实现Fortran的速度,另外就是思考如何用更简单的方法编写出更快的程序。
分享到:
相关推荐
C语言和其他编程语言相比有什么优点,并举例说明C语言编写代码的过程 C语言是一种通用的高级编程语言,它可以被用于开发各种类型的应用程序。由于其高效性和广泛应用的情况,它在操作系统、嵌入式系统、游戏开发、...
C++是一种高级编程语言,是C语言的一种扩展和改进。C++最早是由Bjarne Stroustrup在20世纪80年代初期开发的,主要目的是为了扩展C语言的功能,使其能够支持面向对象的编程。因此,C++包括了C语言的所有特性,同时还...
在simulink中采用C语言实现锁相环,不是matlab编程语言if end 、for end,而是C语言,与DSP和32编程中的语言一样,整个仿真没有一个模块,只有C需要写的锁相环函数,程序的运行频率和实际的开关频率一致。...
FPGAs能让你开发电⼦硬件⽽⽆需实际⽣产出⼀块硅芯⽚,对于⼀些开发来说这是更快 更简易的选择。 2、Assembly Assembly让你能在0和1数位上进⾏编程。基本上这是最底层的编程语⾔。随着Arduino和其它如微控制器的崛起...
C语言初级阶段的相关概念和知识点,可以帮助初学者更深层次的学习C语言的基础,帮助新手小白更快的入门,C语言是学习编程最基本的语言,掌握好C语言的知识点,对于学习其他的编程语言就会相对于轻松,因为大多数的...
Python编程语言是一种高级、解释型、面向对象的编程语言。它有许多特点,其中最突出的是简洁易读的语法,这使得它易于学习和使用。Python的语法非常清晰和简单,使用者可以很容易地理解代码的含义,减少编写代码时...
C 语言编程常见问题解答 【作者】[美]Paul S.R. Chisholm 译:张芳妮 吕 波 【出版社】清华大学出版社 C语言编程常见问题解答(目录) 第l章 C语言 1. 1 什么是局部程序块(local block)? 1. 2 可以把变量保存...
这是因为C语言可以提供高效率和更快的运行速度,同时也可以更好地控制硬件资源。此外,像MySQL这样的流行数据库管理系统也是用C语言编写的。C语言可以通过直接操作内存和硬件资源来提高数据库系统的性能和效率。 ...
用zig 编程语言编写的简单俄罗斯方块克隆 。 控件 左/右/下箭头 - 左/右/下移动棋子。 向上箭头 - 顺时针旋转部件。 Shift - 逆时针旋转工件。 空间 - 立即放下一块。 左 Ctrl - 按住棋子。 R - 开始新游戏。 P - ...
C语言的特点: 1.简单而高效:C语言的语法简单明了,一些常见的编程操作可以很...许多游戏引擎和游戏开发工具都使用C语言作为主要的编程语言。 4.数据科学:C语言和C++语言结合使用可以使数据科学家更好地利用C++的对
C语言的学习需要从编程题入手,大量编程题的练习才能更快的获得进步。一开始应该从一些简单的,常见的编程题入手,这样一来可以提高自己的算法能力,二来能够让自己对学习C程序设计有更浓厚的兴趣。
大多数单片机学习者起初学习单片机都是用汇编语言,但个人感觉用C语言可以摆脱单片机枯燥的内部电路学习,更快入门
C++是一种高级编程语言,它是在C语言基础上发展出来的,继承了C语言的基本语法和功能,同时增加了许多新的特性,最重要的是面向对象编程(OOP)特性,这一特性让C++成为一种非常强大和灵活的编程语言。 面向对象编程...
对于某些应用场景,更高级的语言可能会更适合,因为它们提供了更高的抽象级别和更快的开发速度。例如,对于Web开发,Python、JavaScript或Ruby等语言可能更为流行。 因此,要确定“最好”的编程
1. 初识Go语言 1.1 Go语言介绍 1.1.1 Go语言是什么 2009年11月10日,Go语言正式成为开源编程语言家庭的一员。 Go语言(或称Golang)是云计算时代的C语言。Go语言的诞生是为了让程序员有更高的生产效率,Go语言专门...
与许多其他编程语言相比,C语言提供了一套更有限的特性集合。(在K&R第2版的参考手册中仅用49页就描述了整个C语言。)为了保持少量的特性,C语言在很大程度上依赖一个标准函数"库"。 C语言是一种包容性语言。 ...
不要只读程序,要通过上机实践来学习程序设计。 这个 C 语言的 CAI系统讲座例举了许多例子。 为了更好地理解这些例子, 你应该在机器上实际地输入这些...如果你肯积极地上机实践, 你一定会更快, 更深地掌握 C 语言。
将编程应用和学习同时进行将会更快掌握这么语言
本书是编程语言先驱者Ivor Horton的经典之作,是C语言方面最畅销的图书品种之一,在世界范围内广受欢迎,口碑极佳。 本书的目标是使你在C语言程序设计方面由一位初学者成为一位称职的程序员。 内容简介 本书是...
PHP(Hypertext Preprocessor)是一种广泛使用的开源脚本编程语言,特别适用于Web开发。本文将深入介绍PHP语言的起源、特性、应用领域以及未来发展方向。希望通过本文,读者能够对PHP有更深入的了解。 一、起源和...