为什么用某些编译器编译的程序可以反编译而其他程序(实际上)不能反编译?

时间:2012-09-07 07:35:30

标签: java c++ c bytecode decompiling

我曾经认为Java可以被反编译,因为它编译成字节代码而不是目标代码。这是错误的,因为隐含的假设字节代码是一些如何"更人性化的"比对象代码。为什么用Java编写的程序可以如此容易地反编译,甚至具有相同的标识符(变量名)?我听说在C / C ++中它只能反汇编到汇编但没有反编译成源代码,为什么会这样呢?

1 个答案:

答案 0 :(得分:8)

Java编译器保留大部分原始信息,并在生成字节代码时进行非常少的优化。编译器的任务是验证代码,以便可以动态优化代码。注意:Excelisor编译为本机代码并且想象很难反编译(至少是他们的营销所说的);

尽可能地编译和优化C / C ++,丢弃大量原始信息。 (除了调试信息之外)这使得解开合理的C或C ++变得更加困难。

注意:这些是这些语言常用的编译器的功能。不是语言本身的功能。

就语言的差异而言,你可以说,与C ++相比,Java的功能相对较差。较少的功能使得编译模式较少,无法理解和逆向工程。