As it currently stands, this question is not a good fit for our Q&A format. We expect answers to be supported by facts, references, or expertise, but this question will likely solicit debate, arguments, polling, or extended discussion. If you feel that this question can be improved and possibly reopened, visit the help center提供指导。




已关闭8年。




我曾经认为Java可以反编译,因为它可以编译为字节代码而不是目标代码。这是错误的,因为隐式假设字节码比目标码在某种程度上更“人类可读”。为什么用Java编写的程序如此容易反编译,甚至具有相同的标识符(变量名)?我听说在C / C++中它只能反汇编为汇编,而不能反汇编为源代码,为什么呢?

最佳答案

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

C / C++会尽可能地进行编译和优化,从而丢弃大量原始信息。 (除调试信息外)这使得解开明智的C或C++变得更加困难。

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

就语言的差异而言,您只能说Java与C++相比在功能上相对较差。更少的功能使更少的编译模式易于理解和反向工程。

07-24 09:50
查看更多