\r\n\r\n
コンピュータ・プログラムは、あるタスクを実行するために使用される命令の集合体です。これらのプログラムのほとんどは、コンピュータが理解できない高級言語で書かれている。そこで、これらの命令を機械語やターゲットコードに変換するために、コンパイラが使われます。いくつかの段階を経て、ターゲットコードを構築します。コードの最適化もその一つです。最適化技術には、マシン依存型とマシン非依存型のコード最適化などがある。機械依存コード最適化と機械独立コード最適化の主な違いは、機械依存最適化がオブジェクトコードに適用されるのに対して、機械独立コード最適化は中間コードに使用されることです。
1. 概要と主な相違点 2. 機械依存のコード最適化とは 3. 機械独立のコード最適化とは 4. 機械依存と機械独立のコード最適化の類似点 5. 横並びの比較 - 表形式での機械依存コード最適化と機械独立コード最適化 6. 要約
ソースコードをターゲットコードやオブジェクトコードに変換する際、コンパイラはいくつかの段階を経ます。まず、ソースコードが字句解析器に供給され、トークンが生成される。この出力は構文解析に渡され、生成されたトークンが論理的な順序で並んでいるかどうかをチェックする。この出力はセマンティックパーサーに提供される。p=q+rという符号があるとする。
ここで、p,qは整数、rは浮動小数点数である。意味解析器を用いて、c の整数型変数を float に変換している。意味解析の出力は、中間コード生成器に送られる。中間コードが返され、それがコードオプティマイザに送られる。コードの最適化とは、実際のソースコードの意味を変えることなく、不要なプログラム文を削除することである。強制的な最適化ではありませんが、ターゲットコードの実行速度を向上させることができます。コードオプティマイザーの出力はコードジェネレーターに提供され、最終的にターゲットコードを生成する。
図01:コンパイラのステージ
マシン依存型コード最適化では、十分なリソースを割り当てることで、プログラムの実行効率が向上するようにソースコードを最適化する。
中間コードの最適化を行う場合、マシンインディペンデントコード最適化と呼ばれる。機械に依存しないコード最適化の実装には、さまざまな手法があります。以下の例で説明します。
次のコードの行を読んでください。
for (j+; j=10+){の場合。
b = x + 2 とする。
a[j]=5*j.
}
上記のコードによると、各反復で b = x + 2 が繰り返し計算される。一旦 b が計算されると、それは変化しない。そこで、この行は次のようにループの外側に配置することができます。
b=x+2である。
for (j=0; j<10; j++)
{a[j]=5*j.
}
これをコードムーブといいます。
次のコードの行を読んでください。
j=5.
If (j==10) {
a = b + 20.
}
上記のコードでは、jの値が10になることはなく、5で初期化されているため、ifブロックは実行されない。 したがって、ifブロックを削除することができる。この技法がデッドコードエリミネーションです。
また、もう一つのアプローチとして、原単位削減があります。乗算などの算術演算は、より多くのメモリ、時間、CPUサイクルを必要とします。これらの高価な式は、b = a*2 のように安価な式に置き換えることができます。また、b = a + a のように足し算で置き換えることもできます。
以下のコードを参照してください。
for (j=1; j<=5; j++){。
値=j*5。
}
乗算の代わりに、次のようにコードを変更することができます。
内部温度=5.
for (j=1; j<=5; j++){。
温度=気温+5.
値=温度。
}
これは定数折りたたみと呼ばれ、b[j+1] = c[j+1]のように表現できる。
その代わり、次のように変更することができます。
n=j+1である。
b[n] = c[n]とする。
次のようなサイクルが可能です。
for (j=0; j<5; j++){の場合。
printf("a\n").
}
for (j=0; j<5; j++){の場合。
printf("bēng")。
}
aとbを同じ繰り返し回数で表示する。両者は以下のようにforループにまとめることができる。
for (j=0; j<5; j++){の場合。
printf("a\n").
printf("bēng")。
}
もう一つの重要なテクニックは、同じ式を変数に置き換えて計算を行う汎用部分式消去である。
a = b*c + k となります。
d = b*c + m。
このコードは、次のように変換できます。
温度=b*c。
a = 温度 + k。
d = 温度 + m。
b*cを繰り返し計算する必要がなく、掛け算の値を変数に格納して再利用することができる。
マシン関連コードの最適化 vs. マシンに依存しないコードの最適化 | |
ターゲットコードに機械関連のコード最適化を適用する。 | 中間コードは、マシンに依存しないコードを用いて最適化されます。 |
ハードウエア関連 | |
マシン関連の最適化には、CPUレジスタや絶対メモリ参照などがあります。 | マシンに依存しないコード最適化では、CPUレジスタや絶対的なメモリ参照は関係ありません。 |
コード最適化には、マシン依存型コード最適化とマシン非依存型コード最適化という2種類の最適化技術があります。機械依存コード最適化と機械非依存コード最適化の違いは、機械依存コード最適化がターゲットコードに適用されるのに対し、機械非依存コード最適化は中間コードに適用される点である。
本記事のPDF版をダウンロードし、オフラインで使用する場合は、引用の指示に従ってください。PDF版のダウンロードはこちら マシン依存型とマシン非依存型のコード最適化の違い
1. "コンパイラの設計|コードの最適化"GeeksforGeeks。ここで2点、チュートリアル。"コンパイラの設計-コードの最適化"Www.tutorialspoint.com ウェブサイト、チュートリアルポイント、2017年8月15日。ここで入手可能 3. Estudies4you. "JNTUH CSE Learning Materials", 機械関連とスタンドアローンでのコード最適化の違いについて。こちらで購入可能です 2.エッセンシャルズ、チュートリアル。"コンパイラの設計-コードの最適化"Www.tutorialspoint.com ウェブサイト、チュートリアルポイント、2017年8月15日 3.あなたを勉強してください。"JNTUH CSE学習教材" 機械関連とスタンドアローンのコード最適化の違い。