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