2011-07-13 9 views
0

私はインターネットを検索しましたが、なぜdecompilersが元のソースコードを生成できないのかという具体的な答えは見つかりませんでした。私は満足できる答えを得ていない。どこかに問題を止めるのに似ていると書かれていましたが、どのように伝えられていますか。では、完璧なデコンパイラを作成する上での理論的、技術的限界は何でしょうか。Decompilerが理論的に元のコードを生成できない理由

+4

何か、コメントなどありますか?実行された可能性があるすべての最適化はどうですか?それらを元に戻すだけですか?冷凍庫に入れて数分茹でた卵から生の卵を得ることができないのはなぜですか? – asawyer

+0

@asawyer:類推を愛してください。 – Gerrat

答えて

4

多分、多対1の問題です。例えば、Cで:コンパイラとオプティマイザが終わったら

b++; 

b+=1; 

b = b + 1; 

は、すべての操作の同じセットにコンパイルされることがあります。それは物事を並べ替え、有効な操作をなくし、コードのセクション全体を書き換えます。それが完了するまでに、あなたが書いたことはまったく分かりません。生CPU(またはvCPU)レベルで、あなたが何を起こそうとしていたかはかなり良いアイデアです。

必要とされていない変数を除去するのに十分であってもスマートです:

{ 
a=5; 
b=func(); 
c=a+b; 
d=func2(c); 
} 
## gets rewritten as: 
REGISTERA=func() 
REGISTERA+=5 
return(func2(REGISTERA)) 
3

まず、プログラムのコンパイル時に変数名が保持されることはありません。 ...できるだけ最高ですあなたの再構成されたプログラム全体で無意味な変数名を使用することです。コンパイルは、一般に一方向変換です(一方向ハッシュ関数のように)。ハッシュと同じように、同じ値にハッシュする可能性のあるものを生成することは可能ですが、逆コンパイルされたプログラムは元のものとまったく同じではありません。

2

コンパイラは、情報を捨てます。ソースコード内のすべての情報がコンパイルされたコード内にあるわけではありません。たとえば、コンパイルされたJavaでは、情報がコンパイラによってのみ使用されるため、パラメータ化されていないジェネリック型とパラメータ化されていないジェネリック型の違いを知ることはできません。一部の注釈はコンパイル時にのみ使用され、コンパイルされた出力には含まれません。つまり、逆コンパイルによって何らかのソースコードを取得できないというわけではありません。それは実際のソースコードと一致しておらず、有益でもありません。

1

通常、ソースコードとコンパイルコードの間には1対1の対応はありません。基本的に無限の数のソースが同じオブジェクトコード(無制限の変数名の長さなど)をもたらす可能性がある場合、デコンパイラはどのようなものを吐き出すのでしょうか?

関連する問題