编程语言是否在机器代码中转换了编程语言?

时间:2015-11-14 09:51:31

标签: performance compiler-construction

如果是这样,为什么用不同语言编写的不同程序具有不同的执行速度?

3 个答案:

答案 0 :(得分:2)

简单回答:他们不会生成相同的机器代码。它们可能会生成不同的机器代码,这些代码仍会产生相同的副作用(相同的最终结果),但是通过不同的机器指令。

想象一下,你有两个口译员(让我们说男性和女性只是为了区分他们)将你说的话翻译成其他语言。他们俩都可以将你说的正确翻译成所需的语言,但他们不一定能同样有效率。其中一个人可能觉得有必要解释更多你的意思,一个人可能非常简洁,并以非常简短的方式翻译你所说的内容。

性能并不仅仅因语言而异。它们在相同编程语言的编译器之间有所不同。

例如,对于C,GCC和Tiny-C之间的性能差异可能是2到3倍,而Tiny-C大约慢2-3倍。

这是因为即使在相同的编程语言(C)中,GCC和Tiny-C也不会产生相同的机器指令。在Tiny-C的情况下,它被优化为快速编译,而不是生成快速运行的代码。例如,它没有充分利用机器可用的最快形式的存储器(寄存器),并将更多数据溢出到堆栈中(根据访问模式使用从L1到DRAM的任何内容)。因为注册分配并不那么花哨,所以Tiny-C可以很快地编译代码,但结果代码并不高效。

如果您想要更深入的答案,那么您应该从Dragon Book开始学习编译器设计。

答案 1 :(得分:1)

虽然用不同语言编写的程序在一天结束时被转换为机器代码,但是不同的语言具有不同的实现来说同样的事情。

您可以从人类语言中进行类比,例如英语声明I am coming home.被翻译为中文我未来的家。,因为您可以看到中文更简洁,但并非总是如此;同样的概念适用于编程语言。

因此,在编程语言的情况下,机器代码X可以用编程语言A编写为2X-X,编程语言B编写为X/2 + X/2 ...但是执行机器代码X2X-X会产生相同的结果,虽然它们的表现不一样(这是假设的例子,但希望它有意义。)

基本上不能保证用不同编程语言编写的具有相同输出的程序产生相同的机器代码,但是转换成提供相同输出的机器代码,差异来自哪里。

this会为您提供详尽的信息

答案 2 :(得分:1)

因为1)编译器是由不同的人编写的,所以他们生成的机器代码是不一样的; 2)他们利用预先存在的运行时例程库来进行数学,输入输出,内存管理和因为同样的原因,这些库也不一样。

有些编译器不生成机器代码,因为生成的代码不能移植到不同的机器上,因此它们会为虚构的通用计算机生成代码。 然后在任何特定的机器上,代码由解释器程序直接解释,或者将其转换为该机器的代码,或者这些代码的组合(查找实时(JIT)编译器)。