<分区>
我以前认为 Java 可以反编译,因为它编译成字节代码而不是目标代码。这是错误的,因为隐含的假设字节代码比目标代码“更易于阅读”。为什么用Java写的程序可以这么容易被反编译,甚至有相同的标识符(变量名)?听说C/C++只能反汇编成汇编,不能反编译成源码,为什么?
标签 java c++ c bytecode decompiling
<分区>
我以前认为 Java 可以反编译,因为它编译成字节代码而不是目标代码。这是错误的,因为隐含的假设字节代码比目标代码“更易于阅读”。为什么用Java写的程序可以这么容易被反编译,甚至有相同的标识符(变量名)?听说C/C++只能反汇编成汇编,不能反编译成源码,为什么?
最佳答案
Java 编译器保留了大部分原始信息,在生成字节码时只做了很少的优化。编译器的任务是验证代码,以便可以对其进行动态优化。注意:Excelisor 编译为 native 代码,想象一下很难反编译(至少他们的营销是这么说的;)
C/C++尽可能编译优化,舍弃了很多原有的信息。 (调试信息除外)这使得理清 C 或 C++ 变得更加困难。
注意:这些是这些语言常用的编译器的特性。不是语言本身的特征。
在语言的差异上,只能说Java相对于C++来说功能比较差。更少的功能使得更少的编译模式来理解和逆向工程。
关于java - 为什么用某些编译器编译的程序可以被反编译而其他的(实际上)不能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12313758/