【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语言是一种面向过程的编程语言,由贝尔实验室的Dennis Ritchie在1972年开发。它的设计目标是提供一种既高效又灵活的语言,用于编写操作系统和系统级软件。C语言的特点包括简洁的语法、低级特性(如指针...
C语言是一种高级编程语言,具有可移植性强、语法简洁、易于理解等特点,广泛应用于各种软件开发,包括单片机编程。然而,尽管C语言提供了许多抽象层,但在某些特定场合,如处理硬件中断、进行低级内存操作或者优化...
然而,随着信息技术的快速发展,特别是云计算和大数据的崛起,Python编程语言凭借其易学、易用和易扩展的特性逐渐受到关注。Python的语法简洁明了,更适合初学者,而且在数据分析、科学计算、Web开发等领域有广泛...
在探讨高校非计算机专业学生编程入门课程的选择时,C语言、Visual Basic (VB)和Python这三种编程语言常常成为比较的对象。每种语言都有其独特的特点和适用领域,而高校在选择编程语言作为课程教学内容时,需要考虑多...
在探讨单片机编程语言的选择时,我们首先需要了解单片机编程语言的分类,以及它们各自的特点和适用场景。单片机编程语言主要可以分为三大类:机器语言、汇编语言和高级语言。 机器语言是最底层的编程语言,它由一...
汇编语言是介于机器语言和高级语言之间的一种编程语言,每条指令对应单片机硬件的一个操作。虽然汇编语言编写代码的工作量较大,但它提供了对硬件的直接控制,对于优化性能、节省资源至关重要。在处理时间敏感的任务...
C语言是一种广泛使用的高级编程语言,其结构化特性使得程序易于理解和维护。在单片机开发中,C语言可以快速构建复杂的逻辑和数据结构,减少开发时间。然而,对于一些需要直接访问硬件寄存器、实现中断服务程序或者...
5. **兴趣**:个人兴趣也是选择编程语言的重要考量,兴趣是最好的老师,选择自己喜欢的语言会更愿意投入时间和精力。 综上所述,高校在为非计算机专业学生选择编程入门课程时,应综合考虑各种因素,为学生提供最...
通常情况下,C语言的学习路径是从C语言本身开始,随后过渡到C++,理想情况下还应该具备汇编语言和微机原理的基础,最后才进入Visual C++的学习阶段。这种学习路线虽然全面,但对于初学者而言,耗时较长且要求较高。...
高级语言是一种更接近自然语言的编程语言,它提供了更多的抽象级别,使得程序员能够更专注于解决问题而不是具体的底层细节。常见的单片机高级语言包括C语言、Basic语言和PL/M语言。 ###### 2.3.1 C语言 C语言是...
C语言是一种高级编程语言,具有丰富的数据类型、结构化控制语句和函数调用,使得编程更加简洁、易于理解和维护。然而,C语言在处理某些底层硬件操作时效率较低,如直接访问I/O端口、中断服务程序等。这时,汇编语言...
【C语言6.0编程设计软件】 C语言6.0是一种经典的编程环境,它为开发者提供了编写高效、...通过结合键盘和鼠标的操作,用户可以在Windows XP环境下轻松地编写、调试和运行C语言程序,从而深入理解这门强大的编程语言。
C语言和汇编语言是两种在单片机开发中最常用的编程语言,它们各自具有独特的优势和局限性。 汇编语言是一种低级编程语言,它使用助记符来代表机器语言指令。汇编语言与机器语言非常接近,因此直接操作硬件的能力...
- **发展趋势:**目前,FPGA技术已经进入了软硬件协同设计的时代,通过使用C语言这样的高级编程语言来编写应用程序,并将其自动转换为适用于FPGA的硬件描述代码。 #### 四、ImpulseC:C-to-FPGA工具 **概述:** -...
C语言是一种强大的、通用的编程语言,被广泛应用于系统编程、软件开发、设备驱动、嵌入式系统等各个领域。对于初学者来说,理解和掌握C语言的基本编程方法是至关重要的。以下是一些关于C语言入门的关键知识点: 1. ...
C语言是基础且强大的低级编程语言,它的语法简洁,对内存管理有直接控制,因此在系统编程、嵌入式开发和游戏引擎等领域有广泛的应用。然而,由于C语言没有内置的类型检查和垃圾回收机制,初学者可能需要花费更多时间...
如果你想进行网络编程,你需要了解更多的Windows API函数,比如`socket()`、`bind()`、`listen()`、`accept()`和`send()`/`recv()`等,这些都是用于创建和管理套接字以及进行数据传输的函数。此外,你还需要学习TCP/...
C语言是一种强大的、低级别的编程语言,它提供了对硬件的直接访问,因此在Unix系统中尤其受欢迎。C语言的基础包括变量、数据类型、运算符、控制结构(如if语句、for循环、while循环)、函数、数组和指针等。理解这些...