编译器是否将编程语言转换为机器代码?
Are programming languages converted in machine code by compilers?
如果是这样,为什么用不同语言编写的不同程序执行速度不同?
尽管用不同语言编写的程序最终都会被转换成机器码,但不同的语言有不同的实现来表达同样的事情。
你可以拿人类的语言类比,比如英文语句I am coming home.
被翻译成中文是我未来的家。
,你可以看到中文更简洁,虽然并不总是正确的;同样的概念也适用于编程语言。
所以在编程语言的情况下,机器代码 X 可以用编程语言 A 编写为 2X-X
,编程语言 B 为 X/2 + X/2
...但是执行机器代码 X
和 2X-X
将产生相同的结果,尽管它们的性能不会相同(这是假设的例子,但希望它有意义。)
基本上不能保证用不同编程语言编写的具有相同输出的程序会产生相同的机器码,但是转换成给出相同输出的机器码,这就是差异所在。
但是this会给你详尽的信息
简单的回答:他们不生成相同的机器码。他们可能会生成不同的机器代码,这些机器代码仍然会产生相同的副作用(相同的最终结果),但是通过不同的机器指令。
假设您有两名口译员(假设是男性和女性只是为了区分他们)将您所说的内容翻译成其他语言。他们都可以将您所说的正确翻译成所需的语言,但他们不一定同样有效。他们中的一个人可能觉得有必要解释更多你的意思,一个人可能会非常简洁并以一种非常简短和亲切的方式翻译你所说的内容。
性能不仅仅因语言而异。对于相同的编程语言,它们在编译器之间有所不同。
例如,对于 C,GCC 和 Tiny-C 之间的性能差异大约是 2 到 3 倍,而 Tiny-C 大约慢 2-3 倍。
这是因为即使在相同的编程语言 (C) 中,GCC 和 Tiny-C 也不会生成相同的机器指令。就 Tiny-C 而言,它经过优化以快速编译,而不是生成运行速度同样快的代码。例如,它没有充分利用机器可用的最快形式的内存(寄存器)并将更多数据溢出到堆栈中(堆栈使用从 L1 到 DRAM 的任何内容,具体取决于访问模式)。因为它不需要花哨的寄存器分配,Tiny-C 可以很快地编译代码,但生成的代码效率不高。
如果你想要更深入的答案,那么你应该从龙书开始研究编译器设计
因为 1) 编译器是由不同的人编写的,因此它们生成的机器代码是不一样的,并且 2) 它们利用预先存在的 运行-time 例程库来进行数学运算,输入-输出、内存管理等,出于同样的原因,这些库也不相同。
一些编译器不生成机器码,因为生成的代码不能移植到不同的机器上,因此它们为虚拟的通用计算机生成代码。
然后在任何特定的机器上,该代码要么由解释程序直接解释,要么被翻译成该机器的代码,或者这些代码的组合(查找即时(JIT)编译器)。
如果是这样,为什么用不同语言编写的不同程序执行速度不同?
尽管用不同语言编写的程序最终都会被转换成机器码,但不同的语言有不同的实现来表达同样的事情。
你可以拿人类的语言类比,比如英文语句I am coming home.
被翻译成中文是我未来的家。
,你可以看到中文更简洁,虽然并不总是正确的;同样的概念也适用于编程语言。
所以在编程语言的情况下,机器代码 X 可以用编程语言 A 编写为 2X-X
,编程语言 B 为 X/2 + X/2
...但是执行机器代码 X
和 2X-X
将产生相同的结果,尽管它们的性能不会相同(这是假设的例子,但希望它有意义。)
基本上不能保证用不同编程语言编写的具有相同输出的程序会产生相同的机器码,但是转换成给出相同输出的机器码,这就是差异所在。
但是this会给你详尽的信息
简单的回答:他们不生成相同的机器码。他们可能会生成不同的机器代码,这些机器代码仍然会产生相同的副作用(相同的最终结果),但是通过不同的机器指令。
假设您有两名口译员(假设是男性和女性只是为了区分他们)将您所说的内容翻译成其他语言。他们都可以将您所说的正确翻译成所需的语言,但他们不一定同样有效。他们中的一个人可能觉得有必要解释更多你的意思,一个人可能会非常简洁并以一种非常简短和亲切的方式翻译你所说的内容。
性能不仅仅因语言而异。对于相同的编程语言,它们在编译器之间有所不同。
例如,对于 C,GCC 和 Tiny-C 之间的性能差异大约是 2 到 3 倍,而 Tiny-C 大约慢 2-3 倍。
这是因为即使在相同的编程语言 (C) 中,GCC 和 Tiny-C 也不会生成相同的机器指令。就 Tiny-C 而言,它经过优化以快速编译,而不是生成运行速度同样快的代码。例如,它没有充分利用机器可用的最快形式的内存(寄存器)并将更多数据溢出到堆栈中(堆栈使用从 L1 到 DRAM 的任何内容,具体取决于访问模式)。因为它不需要花哨的寄存器分配,Tiny-C 可以很快地编译代码,但生成的代码效率不高。
如果你想要更深入的答案,那么你应该从龙书开始研究编译器设计
因为 1) 编译器是由不同的人编写的,因此它们生成的机器代码是不一样的,并且 2) 它们利用预先存在的 运行-time 例程库来进行数学运算,输入-输出、内存管理等,出于同样的原因,这些库也不相同。
一些编译器不生成机器码,因为生成的代码不能移植到不同的机器上,因此它们为虚拟的通用计算机生成代码。 然后在任何特定的机器上,该代码要么由解释程序直接解释,要么被翻译成该机器的代码,或者这些代码的组合(查找即时(JIT)编译器)。