2016-10-01 8 views
1

私は現在Cにコンパイルする言語を書いています。私がILと言うときは、C言語のように、別のCコンパイラでアセンブリを生成するコードを記述します。例えばgccまたはclang。中間言語としてのCに関する質問

私が生成するCコードは、それがより有益になります:私はいくつかの簡単なオプトパスした場合は

  • (定数伝播、デッドコード除去を、...)は、この作業量を削減します本当に人間のCコードではないので、Cコンパイラはやらなければならないのですか?
  • 3アドレスコードやSSAなどのフォームをコンパイルし、これを関数、ラベル、変数を含むCプログラムに与えると、Cコンパイラが最適化するのが容易になるか、難しくなりますか?どの一緒にリンクの種類は、次の質問を形成する

...

  • Cにコンパイル言語から良いCコードを生成するための最適な方法は何ですか?
  • すべての最適化を行い、それをコンパイラに任せておく価値はありますか?

答えて

0

一般に、ピープホール型の最適化を行うのはあまり意味がありません。これは、Cコンパイラが単純にそれらを行うためです。高価なのは、a)浪費された、または不要な「ギフトラッピング」操作、b)メモリアクセス、c)分岐予測ミスである。

a)の場合、Cが定数伝搬を行いますが、実際には2つのバッファが同じ基礎データのエイリアスであることを検出できる限度があるため、あまりにも多くのデータを渡していないことを確認してください。 b)機能を短くし、同じデータを操作し合うようにし、ヒープメモリーの使用を制限してキャッシュのパフォーマンスを向上させます。 c)では、コンパイラはループについて理解していますが、gotoループは理解できません。だから、

for(i=0;i<N;i++) 

は通常、ループ本体を取ることを把握し、それは文句を言わない

if(++i < N) goto do_loop_again 

は通常のジャンプを取ることを把握します。

本当にルールは、自動コードをできるだけ人間のようにすることです。それは人間のようなものでも、あなたの言語が提供しなければならないことの問題を提起しますが、C言語以外の言語のポイントは、Cソースのなかのスパゲッティを作成することです。入力スクリプト。

+0

「非C言語の全体点は、gotos_のスパゲッティを作成することです」はナンセンスです!私はgaccを使わずに完全に良いCを生成するyaccで言語を書いた。 –

+0

これらの操作が高価な理由を詳しく説明できますか?誰かがCにコンパイルする前に悪いコードを書いていた場合、これらを最適化できると思いますか?私はヒープメモリの使用を制限することはできないと思う。なぜなら、この言語は比較的低レベルなのでGCがないからプログラマがメモリ管理をするからだ。 –

+0

メインメモリの読み込みと書き込みには、プロセッサからデータを渡して戻す作業が含まれ、プロセッサ内部で行われる処理よりもはるかに高価です。一緒に使用されるアイテムが近くにあり、同じデータに作用する操作が互いに接近するようにデータを配置することによって、それらを最小限に抑えます。 –

関連する問題