Compiler construction 不同的源代码能否生成相同的可执行文件/二进制文件?

Compiler construction 不同的源代码能否生成相同的可执行文件/二进制文件?,compiler-construction,Compiler Construction,不同的源代码能否生成相同的可执行文件/二进制文件 这是可能的吗?这取决于您如何定义相似性。在Java或C#中进行微小的更改并生成相同的字节码是可能的 例如,在C语言中,如果我对文字字符串使用预处理命令,或者直接使用文字字符串,则生成的代码将是相同的,但源代码不同。是。编译器可以进行大量优化,不同的源代码可以映射到相同的目标代码。这里有几个简单的例子。请注意,这些是语言相关的 您可以用十进制、十六进制、八进制或二进制表示整数——目标代码中的结果将是相同的 在许多语言中,变量名不会出现在可执行文件

不同的源代码能否生成相同的可执行文件/二进制文件


这是可能的吗?

这取决于您如何定义相似性。在Java或C#中进行微小的更改并生成相同的字节码是可能的


例如,在C语言中,如果我对文字字符串使用预处理命令,或者直接使用文字字符串,则生成的代码将是相同的,但源代码不同。

是。编译器可以进行大量优化,不同的源代码可以映射到相同的目标代码。这里有几个简单的例子。请注意,这些是语言相关的

  • 您可以用十进制、十六进制、八进制或二进制表示整数——目标代码中的结果将是相同的
  • 在许多语言中,变量名不会出现在可执行文件中,您可以在不影响可执行文件的情况下更改变量名
  • 是的。 比如说

    int nabs1(int a){ 
      return -abs(a); 
    }
    
    int nabs2(int a){ 
      return(a<0) ? a : -a;
    }
    

    如果我只是重命名所有变量,那就很简单了。或者你是在问有没有更有意义的更改?因为这两个程序编译为同一个可执行文件,我认为在两个源代码文件中的意图是相同的,所以差异不会太有意义,是吗?只是表达上的差异。除非目标是两个不同的处理器。:-)我的意思是两个做不同事情的程序。只有在不同的处理器或虚拟机上运行时,它们才能具有相同的二进制文件。
     _nabs1:
    pushl   %ebp
    movl    %esp, %ebp
    movl    8(%ebp), %edx
    popl    %ebp
    movl    %edx, %eax
    sarl    $31, %eax
    xorl    %eax, %edx
    subl    %edx, %eax
    ret
    .p2align 4,,15
    .globl _nabs2
    .def    _nabs2; .scl    2;  .type   32; .endef
    _nabs2:
    pushl   %ebp
    movl    %esp, %ebp
    movl    8(%ebp), %edx
    popl    %ebp
    movl    %edx, %eax
    sarl    $31, %eax
    xorl    %eax, %edx
    subl    %edx, %eax
    ret