繁体   English   中英

使用编译器生成的二进制文件取决于哪些因素?

[英]The binary generated using compiler depends on which factors?

我对编译和编译器很陌生,我有一些问题:

  1. 编译器 A 生成的二进制文件是否与编译器 B 不同? (所有其他条件,例如 os 和 architecture 和...都是相同的)。 为什么? 它们有何不同?

  2. 编译 A 语言生成的二进制文件与编译 B 语言生成的二进制文件有区别吗? (所有其他条件,例如编译器、操作系统和体系结构......都是相同的)。 换句话说,生成二进制文件的源语言之间是否存在任何关系或依赖关系? 为什么? 如果是,它们是如何相关的?

是的,你所有的问题。

您甚至可以使用相同的源代码在同一台计算机上运行编译器两次,并且编译器可以生成不同的二进制输出。

编译器 A 生成的二进制文件与编译器 B 不同吗?

有不同的方法来解决同样的问题。 在人类世界中,如果你需要向北走一街区,向东走一街区,有两种可能的路径。 您可以 go 向北然后向东,或者您可以 go 向东然后向北。 只要您到达目的地,go 的哪条路都没有关系。

同样,如果你告诉编译器将 3 和 5 相加,有多种方法可以解决这个问题。 编译器做什么并不重要,只要结果是一样的。

编译器 A:从 3 开始,然后添加 5。

编译器 B:从 5 开始,然后添加 3。

编译器 C:在编译时计算 3+5=8,然后在运行时将 8 加载到寄存器中。

编译器 D:从 0 开始,按位反转,左移 3,按位反转,加 1。

所有这些都会产生相同的结果,并且根据计算机体系结构和编译器的设置,将选择一个选项而不是另一个选项。 这可能会导致不同的设置生成不同的二进制文件。 并且不同的编译器可能会使用不同的默认设置。

编译 A 语言生成的二进制文件与编译 B 语言生成的二进制文件有区别吗?

出于与上述相同的原因,除非编译器设置完全相同,并且我们要求编译器解决的问题完全相同,否则我们可能会有不同的二进制输出。

编辑:

在某些情况下,使用不同的语言会导致围绕你能做什么和不能做什么的不同假设。 例如,在 Fortran 中,假设 function 中的每个指针都是唯一的。 这允许编译器围绕这个事实进行优化。 (即从 RAM 中加载一次,然后将它们保存在缓存中)。 C 没有此假设,因此如果编译器无法确定指针是唯一的,则经常从 RAM 重新加载数据。 C99 引入了restrict关键字以允许程序员通知编译器将 C 指针视为 Fortran 指针。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM