无论我使用什么语言,源代码都会被翻译成计算机可以理解的相同二进制代码?

时间:2014-11-01 19:31:00

标签: compiler-construction

源代码可以用任何语言编写,但最后IDE(Eclipse,Visual Studio,Pycharm,Dr Scheme)将其转换为计算机可以理解的相同二进制文件。

我说错了吗?源代码最终会被转换为 SAME 二进制可执行文件?

我询问代码编译的“流程”。

2 个答案:

答案 0 :(得分:3)

不完全正确。首先,结果代码将不相同,即使是两个不同的“常规”编译器,因为它们可能以不同方式优化代码等。其次,某些语言不一定直接转换为机器代码。

例如,Java转换为“字节码” - 对于“虚拟机”的指令并不存在。为了执行Java程序,指令必须由“字节码解释器”“解释”,这是一个模拟“虚拟机”的程序。

此外,即使对于生成“真实”机器指令的常规编译器,输出格式也可能有几种不同的形式 - 不同类型的“对象模块”,它们可能无法与“对象模块”一起“工作和播放”。一个不同的编译器(虽然这主要是在当前系统上标准化)。

答案 1 :(得分:3)

不完全。

首先,存在CPU架构和指令集的问题。每个CPU系列都有不同的操作码表和基本指令集,这意味着" flat"为ARM CPU生成的二进制文件与为x86 CPU生成的二进制文件根本不同。

然后,有文件格式的问题。不同的操作系统将它们的实际("平面")二进制指令放在各种包中。 Windows使用Portable Executable标准打包其二进制文件,而Linux使用ELF,OS X使用Mach-O

最后,对于某些语言实现,根本不会生成本机指令。例如,基于JVM的语言使用Java字节码标准来表示虚拟机上与体系结构无关的操作。类似地,Perl和Python有自己的字节码标准,这些标准在运行时被编译,然后被解释。

总的来说,很难保证程序的编译会在多个系统中生成完全相同的二进制文件,即使这些系统共享体系结构也是如此。一般来说,考虑二进制文件的效果而不是实际结构会更好。只要编译器可靠且语言标准清晰,无论结构如何构建,结果程序的行为都应该相同。