[探讨]如何创建比C语言更快的编程语言?

翻译 2012年03月30日 10:22:09

近日,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, const void* src, size_t count) {  
  2.    while (count--) *dst++ = *src++;  
  3.    return dst;  

根据目标架构,编译器利用代码对此进行大量的优化。比如,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语言更快的编程语言?

【CSDN编译整理】近日,beza1e1上发表了一篇博客《Faster than C》,在Hacker News和Reddit Programming上引发了开发者们的激烈讨论。现将此文编译,我们...
  • szu030606
  • szu030606
  • 2012年04月24日 10:31
  • 438

快排的三种实现,以及三种实现运算速度的比较 c语言

直接上代码: 以下为quick_sort.c文件 #include #include #include #include"stack.h" #define N 2000000 //数组长度 #de...
  • d8c29063
  • d8c29063
  • 2015年01月11日 23:04
  • 305

C语言成为TIOBE 2017年度编程语言

本博客选自于沈阳尚观云科技 每一年的TIOBE的年度编程语言,是程序员需要关注的热点,因为人工智能和嵌入式领域的发展使得C语言这门古老的编程语言有了他的发挥的空间,因为嵌入式的发展离不开C语言这一类...
  • shangguanyun2017
  • shangguanyun2017
  • 2018年01月15日 10:25
  • 240

(笔试前复习)比KMP算法更简单更快的字符串匹配算法

我想说一句“我日,我讨厌KMP!”。 KMP虽然经典,但是理解起来极其复杂,好不容易理解好了,便起码来巨麻烦! 老子就是今天图书馆在写了几个小时才勉强写了一个有bug的、效率不高的KMP,特别是计...
  • kexinmei
  • kexinmei
  • 2012年10月12日 19:19
  • 2444

性能要比快速排序还要快上很多倍的桶排序

本文标签: 桶排序 快速排序 桶排序可以说得上是最简单的排序算法了,但是它的使用范围非常狭窄,不过不可否认的是在其适用范围内,它的性能要比快速排序还要快上很多倍。 没错,桶排序也是一...
  • littlesmallless
  • littlesmallless
  • 2017年03月19日 23:29
  • 705

太极语言出世——比C++更好的语言(续)

太极语言出世——比C++更好的语言(续)(一)先来说一些太极语言中的小技巧。[a;b;str]=[1;0;"taiji"];show([str;a;b;]);猜猜,能看懂这段代码吗?其实就是a=1;b...
  • universee
  • universee
  • 2006年05月18日 07:35
  • 2617

C语言、编程语言发展史

以铜为鉴,可正衣冠;以古为鉴,可知兴替;以人为鉴,可明得失。 了解和学习一门语言、一个系统乃至方方面面的任何东西时,如果不知道其历史和现状而只是一上来就一味地闷头苦学,你就很容易“一叶障目不见泰山”。...
  • u010297957
  • u010297957
  • 2016年05月01日 12:07
  • 12073

学习编程语言最好的方法是什么

每个人都有自己独特的学习模式,我们要做的第一件事,就是发现自己的学习模式。你的方式是什么?...
  • foruok
  • foruok
  • 2016年04月07日 07:24
  • 16387

cin 和scanf,scanf比cin快很多

//#include #include //#include //using namespace std; #define MAXN 501 #define INF 0x3fffff /*Ac...
  • Enigma_hao
  • Enigma_hao
  • 2013年07月05日 08:28
  • 1224

DOM4J 操作 XML的工具类,自己写的,感觉还比较好用

package com.nhncorp.dcas.util;import java.beans.IntrospectionException;import java.beans.Introspecto...
  • aoxiang_y
  • aoxiang_y
  • 2009年03月13日 10:36
  • 1196
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[探讨]如何创建比C语言更快的编程语言?
举报原因:
原因补充:

(最多只允许输入30个字)