`
xpp02
  • 浏览: 1013869 次
社区版块
存档分类
最新评论

如何创建比C语言更快的编程语言?

 
阅读更多

【CSDN编译整理】近日,beza1e1上发表了一篇博客《Faster than C》,在Hacker NewsReddit Programming上引发了开发者们的激烈讨论。现将此文编译,我们一起来探讨下。

单从编程语言特性来判断,虽然Fortran语言也以快而著称,但开发者们还是将C语言称之为领导者。开发者创建新一门语言通常以C语言为参照对象,将语言编译时间与C语言进行对比,会因比C语言慢多少而引以自傲。然而,很少有语言能够击败C。

那么,什么样的语言才能比C更快呢?

更好的别名机制(Better Aliasing Information)

别名实际上是指两个引用指向同一个内存位置。例如,典型的内存复制(not memcpy from stdlib.h!)

  1. void*memcopy(void*dst,constvoid*src,size_tcount){
  2. while(count--)*dst++=*src++;
  3. returndst;
  4. }

根据目标架构,编译器利用代码对此进行大量的优化。比如,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的速度,另外就是思考如何用更简单的方法编写出更快的程序。


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics