没有比C更快的高级语言实现,这是一种误解吗?

没有比C更快的高级语言实现,这是一种误解吗?,c,performance,compiler-construction,programming-languages,scheme,C,Performance,Compiler Construction,Programming Languages,Scheme,虽然很难按速度对语言进行排名,但人们普遍认为,在今天的实践中,使用C语言可以获得最快的程序。我一直认为,没有一种高级语言能够像它那样快,至少在一段时间内是如此。除了我刚刚了解到的。正如我们所知,Scheme是一种没有类型注释的高级函数式语言。然而,该编译器声称生成程序的速度是C语言中直接等价程序的1.5到100倍 我没有意识到它的存在,这让我担心我的信仰。首先,这怎么可能是真的?其次,这不可能是唯一的例外。有没有其他高级或低级语言的编译器可以生成比C更快的代码,我也不知道?您应该阅读注释 不错,

虽然很难按速度对语言进行排名,但人们普遍认为,在今天的实践中,使用C语言可以获得最快的程序。我一直认为,没有一种高级语言能够像它那样快,至少在一段时间内是如此。除了我刚刚了解到的。正如我们所知,Scheme是一种没有类型注释的高级函数式语言。然而,该编译器声称生成程序的速度是C语言中直接等价程序的1.5到100倍


我没有意识到它的存在,这让我担心我的信仰。首先,这怎么可能是真的?其次,这不可能是唯一的例外。有没有其他高级或低级语言的编译器可以生成比C更快的代码,我也不知道?

您应该阅读注释

不错,但是C版本速度慢的部分原因是你使用的是abs而不是fabs。abs将int作为参数(这应该是编译器警告!)——传递非零的double总是返回一个大数字。C版本基本上是迭代的,直到错误低于double的分辨率


printf(“%d,%d\n”,abs(0.0001)任何给定语言的特定编译器可能会生成一个输出汇编程序,该程序的速度比特定硬件目标的特定C编译器的汇编输出速度快

是的,存在一些编程语言的实现,对于某些硬件,对于某些程序,它们生成的程序集比“等效”C程序运行的时间要短

据我所知,没有任何一种“高级”语言能够为所有由专业C程序员用C编写的程序生成比好的C编译器更好的汇编程序

因此:

  • 存在用于高级语言的编译器,其中 至少一个编译时比C程序快的程序

  • 存在用于高级语言的编译器,其中 至少有一个程序在编译时比专家C快 节目

  • 存在用于高级语言的编译器,可用于 一些程序在编译时比C程序快

  • 没有适用于大多数高级语言的编译器 编写的程序生成的代码比同等的专家C语言快 节目

使这个问题无法回答的事情:

  • “高级语言”的定义
  • “大多数程序”的定义——你真的是指在一种语言中可以枚举的所有程序的50%以上吗
  • “优于C”的定义——优于天真的C?优于专家C
  • 目标的定义——在所有体系结构上?某些特定的硬件上
参考资料:


C—当使用编译器优化时—生成非常快的代码。我有一个好的C编译器为时间非常关键的中断创建的后优化汇编代码。当知道约束条件(例如,输入值始终在某个范围内)时,仍然可以使代码快25%编译器不知道。但是方案编译器也不知道

这意味着理论上可以编写比C编译器生成的代码快1.3倍的代码,但是不可能再加快代码的速度

另一种速度相当快的语言是Pascal,因此现代Pascal变体(如FreePascal)的运行时和内存消耗可能与C编译器相同

Scheme是一种声明式编程语言,而C是一种命令式编程语言。简单的问题是:“直接等价”是什么意思

考虑以下方案代码:

(define (example a) (+ (if (> a 1)  (example (- a 1)) 0) (somefunc a)))
在C中,您可以这样实现它:

double iffunc(int a,double b,double c)
{
    return a?b:c;
}
double example(int a)
{
    return iffunc(a>1,example(a-1),0)+somefunc(a);
}
double example(int a)
{
    int i;
    double b;
    for(i=1;i<=a;i++) b+=somefunc(i);
    return b;
}
但您也可以这样实现它:

double iffunc(int a,double b,double c)
{
    return a?b:c;
}
double example(int a)
{
    return iffunc(a>1,example(a-1),0)+somefunc(a);
}
double example(int a)
{
    int i;
    double b;
    for(i=1;i<=a;i++) b+=somefunc(i);
    return b;
}
双重示例(int a)
{
int i;
双b;

对于(i=1;i有人应该提到Fortran,它在数值应用中通常优于C。也许这有帮助:


这不是真的

在特定的平台上,C永远不会比汇编快,因为C使用汇编作为中介,因此理论上C不可能创建比其实现者手工所能做到的更高效的代码

对于编译成C的所有其他语言,您不能期望该语言的性能优于同一作者编写的C代码。斯大林就是这样一种语言,因为它的输出是生成的C代码。如果斯大林的作者用C编写sqrt iter,它的速度将与他的Scheme编译器生成的C代码的速度一样快。斯大林创造了更多的eC代码比Justin Domke手工编写的代码效率更高,但这并不能证明斯大林比C更快。这只能证明斯大林的作者比Justin Domke更擅长C,因为他的知识在Scheme编译器中

如今,C编译器使用静态分析、死代码消除、循环展开和各种优化技术。对于普通程序员来说,C编译器可能拥有比低级代码更好的代码,而且代码更短、更直观。高级语言将不必要的元素抽象掉,如内存管理、寄存器大小、指针和语法使您的代码更小,更易于调试。这会带来成本,通常是速度,但在许多情况下,速度有时是内存使用率,但它们不如效率重要。您可能听说过

最后,不同的编程语言将更适合不同的任务。选择的算法是一个很好的例子。你真的会这样做
sqrt
?我曾经这样做过,但那是在一种只有递增、递减和数学运算符的语言中

最后,我喜欢斯大林。这是一个很好的和平计划代码,来自一个非常熟悉C语言的人。它应该被研究,但如果你真的