4

以前は、Javaはオブジェクトコードではなくバイトコードにコンパイルされるため、逆コンパイルできると思っていました。これは間違っています。なぜなら、暗黙の仮定のバイトコードは、オブジェクトコードよりも「人間が読める」ものだからです。Javaで書かれたプログラムを簡単に逆コンパイルでき、同じ識別子(変数名)を持つことができるのはなぜですか?C / C ++では、アセンブリに逆アセンブルすることはできますが、ソースコードに逆コンパイルすることはできないと聞きましたが、なぜですか?

4

1 に答える 1

8

Javaコンパイラは、元の情報のほとんどを保持し、バイトコードを生成するときにほとんど最適化を行いません。コンパイラのタスクは、動的に最適化できるようにコードを検証することです。注:Excelisorはネイティブコードにコンパイルされ、逆コンパイルが難しいと想像します(少なくとも彼らのマーケティングが言っていること;)

C / C ++は可能な限りコンパイルおよび最適化され、元の情報の多くが破棄されます。(デバッグ情報を除いて)これにより、賢明なCまたはC++に解きほぐすことがはるかに困難になります。

注:これらは、これらの言語で一般的に使用されるコンパイラーの機能です。言語自体の機能ではありません。

言語の違いに関して言えば、JavaはC++に比べて機能が比較的劣っています。機能が少ないと、コンパイルされたパターンが少なくなり、理解してリバースエンジニアリングできます。

于 2012-09-07T07:37:45.030 に答える