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

Compilation 使用编译器生成的二进制文件取决于哪些因素?,compilation,binary,compiler-construction,binaryfiles,Compilation,Binary,Compiler Construction,Binaryfiles,我对编译和编译非常陌生,我有一些问题: 编译器A生成的二进制文件与编译器B不同吗?(所有其他条件,例如操作系统、体系结构和……都是相同的)。为什么?它们有何不同 编译A语言生成的二进制文件与编译B语言生成的二进制文件是否不同?(所有其他条件,例如编译器、操作系统和体系结构以及……都是相同的)。换句话说,生成二进制文件的源语言之间是否存在任何关系或依赖关系?为什么?如果是,它们之间的关系如何 你所有的问题都可以回答 您甚至可以使用相同的源代码在同一台计算机上运行编译器两次,并且编译器可以生成不

我对编译和编译非常陌生,我有一些问题:

  • 编译器A生成的二进制文件与编译器B不同吗?(所有其他条件,例如操作系统、体系结构和……都是相同的)。为什么?它们有何不同

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


  • 你所有的问题都可以回答

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

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

    解决同一问题有不同的方法。在人类世界中,如果你需要北行一个街区和东行一个街区,有两条可能的路径。你可以先北后东,也可以先东后北。不管你走哪条路,只要你到达目的地就行

    类似地,如果您告诉编译器添加3和5,则有多种方法可以解决此问题。编译器做什么并不重要,只要结果是相同的

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

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

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

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

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

    编译A语言生成的二进制文件与编译B语言生成的二进制文件是否不同

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

    编辑:


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

    因此,对于每种语言,我们应该编写一个特定的编译器,以考虑该语言的考虑因素。对吗?没错。我们可以声明一个C结构的结构,而不是析构函数和C++版本的同一个结构,它具有析构函数。然后,我们可以生成一个使用Stutt的函数,可以在C和C++上编译。如果我们要查看编译后的二进制文件,函数的C版本将在完成时弹出结构栈,而C++二进制调用调用析构函数,然后弹出结构。我们将有不同的二进制代码用于相同的函数源代码,因为C和C++编译器对程序员如何使用结构做出不同的假设。