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

标签 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/

相关文章:

java - Java中一旦线程抛出异常,扫描器就不会读取用户输入

c++ - double C++

c++ - 发送/接收套接字阻塞问题

c - Scanf 用于两个字符串和一个 float

c - 尝试理解 c 中的 for 循环和 getchar()

java - 哪些版本的 Tomcat 和 JBoss 服务器支持 CDI 集成?

java - 使用 Cognito 联合身份进行身份验证

Java 到 C# - BigInt.modPow

c++ - 如何在 OpenGL 屏幕上同时显示图形和文字?

C Regex - 获取匹配的字符串