2012-03-21 18 views
0

私はコンパイラに関する質問、具体的な動作について質問します。私はコンパイラが構文的に異なって記述されているコードに対して同じマシンコードを常にコンパイルすると思いますが、同じことをします。これは本当ですか?構文上の違いにかかわらず、機能的に似たコードが同じ結果にコンパイルされますか?効率的なコンパイラは毎回まったく同じ結果をコンパイルしますか?

int number = 2; 

は同じものにコンパイルします:例えば

と同じになり

int number; 
number = 2; 

またはその

while True: 

(私はここでのpythonを使用しています例として):

while 1: 

私は特に.netコンパイラとインタプリタに興味があります。 JITコンパイラは毎回同じことを「時間内に」コンパイルしますか? Pythonインタプリタのような通訳は、毎回同じコードコードを正確に「解釈」しますか?

ありがとうございました!

+0

どのように2つのループは同じですか? –

+0

「同じことをしていますか?最後の2つのループは、ループ中にiの値が5回ずつループしていても、実際には異なる処理を行います。 – templatetypedef

+1

'for(int i = 0; i <5; i ++)'は特定の状況下で 'for(int i = 1; i <= 5; i ++)と同じオブジェクトコードにコンパイルされる可能性があります。あなたが* '*' '〜' '私がそれ以来望んでいない一般的な場合は、異なる値の範囲を持ちます。 'i'がループ内で使用される場合、その違いは重要です。 –

答えて

1
int number = 2; 

は同じことにコンパイルします。多くの言語では、宣言はコードを生成しません。確かに

for (int i = 1; i <=5; i++) 

ない:

(int i = 0; i < 5; i++) 

ため

またはそれは同じだろう!異なるセマンティクス!

NBこれは「効率的な」考慮事項ではありません。

JITコンパイラは毎回同じことを「時間内に」コンパイルしますか? Pythonインタプリタのようなインタプリタはコードコード を毎回「解釈」しますか?

今、全く別の質問をしているようです。同じソースコードは常に同じ方法でコンパイルされ、モジュロJITエフェクトは同様に解釈されます。コンピュータは決定論的です。

+0

コンピュータは決定論的かもしれませんが、コンパイラは一般的に大きな余裕があります。結果として得られるプログラムが機能的に正しければ、それを達成する方法はかなり公正なゲームです。 C#の仕様は、仕様に準拠したプログラムが許可されているかどうかに関して、C++の仕様よりもはるかに厳しいものです) – LukeH

+0

@LukeH完全に同意します。 OPが最終的なパラで何を求めているのかははっきりしない。 – EJP

+0

ありがとう!私の文言が混乱していたら申し訳ありません –

0

これは、2つの異なる入力に対して同じ出力を生成するためにコンパイラが従う特定の規則が発生するかどうかによって異なります。

コンパイラの作者は、この点に関していかなる保証も行いません。 (私は専門家に近いものではありませんが、2つのプログラムが同じであるかどうかを判断する問題はhalting problemに似ています)。おそらくではなく、確か

int number; number = 2; 

+0

あなたが探している言葉は決まっていません。しかし、多くの場合、同等性を簡単に証明できます。また、常に奇妙なエッジケースがありますが、最適化するために、遅延を作成するためのマイクロコントローラ上のハードウェアループが必要ですか?おそらくそうではありません。 –

+0

@KristopherMicinski:確かに、自明ではない複雑なプログラムは、すぐに推論するのが難しくなります。 –

+0

ループホイストと代数的最適化、より新しい完全プログラム最適化を検討してください。コンパイラの研究と決定プロセスの全分野がこれを中心に構築されています。ベクタライザ、オメガテストなど...これらのツールはすべて、複雑なコードパターンを推論することを可能にします。通常、あるアルゴリズムを別のアルゴリズムに交換することはできませんが、人間が見るものをはるかに超えることができます。 –

0

一般的に - いいえ、その保証を与えたコンパイラは、単純な無限ループ(while(true);)に停止しないプログラムをコンパイルすることができます。

これを行うと、チューリング完全言語では不可能な停止問題の解決策になります。

0

一般的に、コンパイラは、同じコンパイラ設定に対して、与えられた入力の同じオブジェクトコードをに対して発行しようとします。異なるフラグ、特に最適化レベルが出力を変更します。

コンパイラは、一般にツリー(http://lambda.uta.edu/cse5317/notes/node23.html)として提供されたコードの内部表現(中間表現、IR)を生成します。より良いコードを生成するために操作されます。

int number; 
number = 2; 

int number = 2; 

のあなたの例では、良いものです:2つのコードスニペットは、異なるIRを生成しますが、コンパイラは、第1に最初に、より複雑な、IRを変換します。現代のコンパイラは、はるかに洗練された変換を行うことができます。人間が非常に難しい方法でコードを単純化しますが、すべての場合にそれを行うことはできません。常にコンパイルされない2つの意味的に等価なプログラム同じコード。

さらに多くの場合、http://en.wikipedia.org/wiki/Principles_of_Compiler_Designをお読みください。それは魅力的なトピックであり、読んで読む価値があります。

関連する問題