不同的源代码可以生成相同的可执行/二进制文件吗?

时间:2009-09-10 04:30:19

标签: compiler-construction

不同的源代码可以生成相同的可执行文件/二进制文件吗?

这可能吗?

3 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:4)

是。 例如

int nabs1(int a){ 
  return -abs(a); 
}

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

gcc -O6生成相同的代码:

 _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

答案 2 :(得分:1)

这取决于你如何定义相似的。可以在Java或C#中进行微小的更改,并使其生成相同的字节码。

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