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

Cel*_*tas 4 c c++ java decompiling bytecode

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

Pet*_*rey 8

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

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

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

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