每种语言最终都编译成低级计算机语言?

时间:2010-06-06 01:08:49

标签: performance compiler-construction interpreter

是不是每种语言都编译成低级计算机语言?

如果是这样,所有语言都不应该具有相同的性能吗?

只是想知道......

6 个答案:

答案 0 :(得分:15)

正如其他人所指出的,并非每种语言都被翻译成机器语言;一些被翻译成某种形式(字节码,反向波兰语,AST)被解释。

但即使是翻译成机器代码的语言,

  • 有些译员比其他人好。
  • 某些语言功能比其他语言功能更容易转换为高性能代码

比其他语言更好的翻译器的例子是GCC C编译器。它在制作优秀代码方面投入了多年的工作,其翻译的表现优于简单的编译器lcctcc

难以转换为高性能代码的功能示例是C能够进行指针运算和解引用指针:当程序通过指针存储时,编译器很难知道哪些内存位置被影响到的。类似地,当调用未知函数时,编译器必须对堆上分配的对象内容可能发生的情况做出非常悲观的假设。在像Java这样的语言中,编译器可以更好地进行转换,因为类型系统强制在不同类型的指针之间进行更大的分离。在像ML或Haskell这样的语言中,编译器仍然可以做得更好,因为在这些语言中,内存中分配的大多数数据不能通过函数调用来改变。但是,面向对象的语言和函数式语言当然会带来自己的翻译挑战。

最后,图灵完备语言的翻译本身就是一个难题:一般来说,找到程序的最佳翻译是一个NP难题,意味着已知的唯一解决方案可能需要时间指数的程序大小。这在编译器中是不可接受的(不能永远等待编译几千行),因此编译器使用启发式算法。这些启发式方法总有改进的余地。

答案 1 :(得分:14)

将某些语言映射到机器语言比其他语言更容易,更有效。对于这一点我没有简单的比喻。我最接近的是将意大利语翻译成西班牙语,将Khoisan language翻译成夏威夷语。

另一个类比是说“嗯,物理定律是控制每只动物如何移动的原因,那么为什么有些动物比其他动物移动得更快?它们不应该只以相同的速度移动吗?”。

答案 2 :(得分:4)

不,有些语言只是被解释。他们从未真正变成机器代码。因此,这些语言通常比C语言等低级语言运行得慢。

即使对于编译成机器代码的语言,有时编译器产生的内容也不是编写给定程序的最有效方法。因此,通常可以编写程序,比如运行速度比C语言快的汇编语言,以及运行速度比JIT编译的Java等价物快的C程序等。(现代编译器非常好,但事实并非如此)这些天很多问题)

答案 3 :(得分:3)

是的,所有程序最终都会转换为机器代码。但是:

  1. 某些程序在编译期间翻译,而其他程序则由解释程序(例如Perl)或虚拟机(例如原始Java)即时翻译

    显然,后者在跑步过程中花时间翻译时要慢得多。

  2. 可以将不同的语言翻译成不同的机器代码。即使完成相同的编程任务。因此,根据语言的不同,机器代码可能更快或更慢。

答案 4 :(得分:2)

你应该理解编译(翻译)和解释(模拟)之间的区别。您还应该理解用于计算的通用基础的概念。

语言或指令集是通用,如果它可以用于为任何其他语言或指令集编写解释器(或模拟器)。大多数计算机都是电子计算机,但它们可以通过许多其他方式制造,例如通过流体,机械部件,甚至是遵循指示的人。一个好的教学练习是在BASIC中编写一个小程序,然后让一个学生班级按照其步骤“执行”该程序。由于BASIC是通用的(初步近似),您可以使用它来编写模拟任何其他计算机指令集的程序。

所以你可以用自己喜欢的语言编写一个程序,将它编译(翻译)成你最喜欢的机器的机器语言,用BASIC编写的那台机器的解释器,然后(原则上)有一个满是学生的班级“执行“它。以这种方式,首先将其缩减为“快速”机器的指令集,然后由非常非常慢的“计算机”执行。它仍然会得到相同的答案,只会慢一万亿倍。

重点是,普遍性的概念使所有计算机彼此等效,即使有些计算机非常快,而其他计算机非常慢。

答案 5 :(得分:1)

不,某些语言由“软件解释程序”运行为byte code

此外,它还取决于语言在后台的作用,因此不同语言的2个功能相同的程序可能在幕后具有不同的机制,因此实际上运行不同的指令会导致不同的性能。