使用编译器生成的二进制文件取决于哪些因素?
The binary generated using compiler depends on which factors?
我对编译和编译器很陌生,我有一些问题:
编译器A和编译器B生成的二进制文件是否不同? (所有其他条件,例如 os 和体系结构和...都是相同的)。为什么?它们有何不同?
编译A语言生成的二进制文件和编译B语言生成的二进制文件有区别吗? (所有其他条件,例如编译器、os 和体系结构以及...都是相同的)。换句话说,生成二进制文件的源语言之间是否存在任何关系或依赖关系?为什么?如果是,它们有什么关系?
对你所有的问题都是肯定的。
您甚至可以 运行 在同一台计算机上使用相同的源代码编译两次,并且编译器可以生成不同的二进制输出。
does the binary generated by compiler A is different from compiler B?
解决同一个问题有不同的方法。在人类世界,如果要北行一城,东行一城,有两条路可以走。你可以先向北然后向东,或者你可以向东然后向北。走哪条路都无所谓,只要到达目的地就可以了。
同样,如果你告诉编译器将3和5相加,有多种方法可以解决这个问题。编译器做什么并不重要,只要结果相同即可。
编译器A:从3开始,然后添加5。
编译器 B:从 5 开始,然后添加 3。
编译器 C:在编译时计算 3+5=8,然后只需 运行 时间将 8 加载到寄存器中。
编译器 D:从 0 开始,按位取反,左移 3,按位取反,加 1。
所有这些都会产生相同的结果,并且根据计算机体系结构和编译器的设置,将选择一个选项而不是另一个选项。这可能导致不同的设置生成不同的二进制文件。不同的编译器可能会使用不同的默认设置。
does the binary generated from compiling A language differs from the binary generated from compiling B language?
同上原因,除非编译器设置完全一样,而且我们要求编译器解决的问题完全一样,否则我们很可能会有不同的二进制输出。
编辑:
在某些情况下,使用不同的语言会导致对您能做什么和不能做什么的不同假设。例如,在 Fortran 中,假定函数中的每个指针都是唯一的。这允许编译器围绕这个事实进行优化。 (即从 RAM 加载一次,然后将它们保存在缓存中)。 C 没有这种假设,因此如果编译器不能确定指针是唯一的,则经常从 RAM 中重新加载数据。 C99 引入了 restrict
关键字,允许程序员通知编译器像对待 Fortran 指针一样对待 C 指针。
我对编译和编译器很陌生,我有一些问题:
编译器A和编译器B生成的二进制文件是否不同? (所有其他条件,例如 os 和体系结构和...都是相同的)。为什么?它们有何不同?
编译A语言生成的二进制文件和编译B语言生成的二进制文件有区别吗? (所有其他条件,例如编译器、os 和体系结构以及...都是相同的)。换句话说,生成二进制文件的源语言之间是否存在任何关系或依赖关系?为什么?如果是,它们有什么关系?
对你所有的问题都是肯定的。
您甚至可以 运行 在同一台计算机上使用相同的源代码编译两次,并且编译器可以生成不同的二进制输出。
does the binary generated by compiler A is different from compiler B?
解决同一个问题有不同的方法。在人类世界,如果要北行一城,东行一城,有两条路可以走。你可以先向北然后向东,或者你可以向东然后向北。走哪条路都无所谓,只要到达目的地就可以了。
同样,如果你告诉编译器将3和5相加,有多种方法可以解决这个问题。编译器做什么并不重要,只要结果相同即可。
编译器A:从3开始,然后添加5。
编译器 B:从 5 开始,然后添加 3。
编译器 C:在编译时计算 3+5=8,然后只需 运行 时间将 8 加载到寄存器中。
编译器 D:从 0 开始,按位取反,左移 3,按位取反,加 1。
所有这些都会产生相同的结果,并且根据计算机体系结构和编译器的设置,将选择一个选项而不是另一个选项。这可能导致不同的设置生成不同的二进制文件。不同的编译器可能会使用不同的默认设置。
does the binary generated from compiling A language differs from the binary generated from compiling B language?
同上原因,除非编译器设置完全一样,而且我们要求编译器解决的问题完全一样,否则我们很可能会有不同的二进制输出。
编辑:
在某些情况下,使用不同的语言会导致对您能做什么和不能做什么的不同假设。例如,在 Fortran 中,假定函数中的每个指针都是唯一的。这允许编译器围绕这个事实进行优化。 (即从 RAM 加载一次,然后将它们保存在缓存中)。 C 没有这种假设,因此如果编译器不能确定指针是唯一的,则经常从 RAM 中重新加载数据。 C99 引入了 restrict
关键字,允许程序员通知编译器像对待 Fortran 指针一样对待 C 指针。