a21_opt02
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
* プログラミング言語における最適化について #2
-(by [[K]], 2021.10.08)
** (0)
-この記事は、以下の2つの話からの派生記事です。
--「10日くらいでできる!プログラミング言語自作入門」 → [[...
--HLX-002 → [[a21_hlx002]]
** (1-1)
-「プログラミング言語における最適化について」([[a21_opt]...
--コンパイル時に答えが確定しているものは、定数に置き換え...
-という最適化を紹介しました。これの話の続きです。
-上記では以下のアルゴリズムを紹介しました。
----
-この最適化を実現するアルゴリズムは簡単です。
-プログラムを上から順番に見ていくことにします。
-もし変数に定数が代入されたら、この変数の値は〇〇である、...
-もし定数ではない値が代入されたら、もう変数の値は不定なの...
-テーブルに登録された変数を参照された場合は、それを全部定...
-ラベル定義文やforやwhileの先頭は繰り返しやcontiuneで合流...
-置換の結果(もしくは置換する前から)式の一部または全部が...
-こうして最後までプログラムをチェックし終わったら、それで...
-ちなみにプログラム内で一度でもポインタを取得した変数(p ...
-ここも頑張ればもっと最適化がうまくなるのですが、それをや...
----
-しかしこのアルゴリズムでは、たとえば関数の冒頭で一度だけ...
** (1-2)
-(今考えているアルゴリズム)
-基本的な考え方は、上記に似ています。違うのは、合流可能性...
-ただし、それだと定数ではないものまで定数扱いする恐れがあ...
-合流地点よりあとで定数が代入されたものについては、定数に...
-もし途中で条件分岐などでほかの合流地点に行くときは、その...
-その際に、たとえばもしある地点からの合流では「a=1」とい...
if (...) { a = 1; } else { a = 2; }
// ここは上記のifに対する合流地点。 ここでは a=1 という...
-このように各合流地点に情報がたまってくるので、それを各合...
-最初のうちは定数だと思っていたけど実は定数ではなかった、...
-これを繰り返して、もう新しい変化は起きなくなったら、それ...
//-要するに、変数の状態が「定数が入っている」「それ以外」...
//-プログラムを上から読んでいくのは同じですが、合流可能性...
//-それぞれのコード片について、まず始状態はやはりテーブル...
//-前回のアルゴリズムでは、変数に定数以外を代入した場合に...
** (2-1)
-「プログラミング言語における最適化について」([[a21_opt]...
--結果が利用されない命令は消す。
-という最適化を紹介しました。これの話の続きです。
-上記では以下のアルゴリズムを紹介しました。
----
-この最適化を実現するアルゴリズムは簡単です。
-プログラムを上から順番に見ていくことにします(下から順番...
-何か変数に「代入する命令」があったとき、その直後からその...
-もし誰からも参照されないまま、新しい別の値を代入する命令...
-悩ましいのは分岐命令や条件分岐命令にぶつかったときです。...
-それで、上記の判定で「結果は使われていない」と判断できた...
----
-しかしこのアルゴリズムでは、代入文の後に条件分岐などがあ...
a = 1; // この代入は結局利用されないので不要。
if (b == 0) { c = 1; }
a = 0;
-これを何とかしたいわけです。
** (2-2)
-(今考えているアルゴリズム)
-基本的な考え方は、上記に似ています。違うのは、分岐命令に...
-解析したことのある部分は覚えておいて、重複がないようにし...
-必要か不必要化を判定している命令の直後からトレースして、...
* こめんと欄
#comment
終了行:
* プログラミング言語における最適化について #2
-(by [[K]], 2021.10.08)
** (0)
-この記事は、以下の2つの話からの派生記事です。
--「10日くらいでできる!プログラミング言語自作入門」 → [[...
--HLX-002 → [[a21_hlx002]]
** (1-1)
-「プログラミング言語における最適化について」([[a21_opt]...
--コンパイル時に答えが確定しているものは、定数に置き換え...
-という最適化を紹介しました。これの話の続きです。
-上記では以下のアルゴリズムを紹介しました。
----
-この最適化を実現するアルゴリズムは簡単です。
-プログラムを上から順番に見ていくことにします。
-もし変数に定数が代入されたら、この変数の値は〇〇である、...
-もし定数ではない値が代入されたら、もう変数の値は不定なの...
-テーブルに登録された変数を参照された場合は、それを全部定...
-ラベル定義文やforやwhileの先頭は繰り返しやcontiuneで合流...
-置換の結果(もしくは置換する前から)式の一部または全部が...
-こうして最後までプログラムをチェックし終わったら、それで...
-ちなみにプログラム内で一度でもポインタを取得した変数(p ...
-ここも頑張ればもっと最適化がうまくなるのですが、それをや...
----
-しかしこのアルゴリズムでは、たとえば関数の冒頭で一度だけ...
** (1-2)
-(今考えているアルゴリズム)
-基本的な考え方は、上記に似ています。違うのは、合流可能性...
-ただし、それだと定数ではないものまで定数扱いする恐れがあ...
-合流地点よりあとで定数が代入されたものについては、定数に...
-もし途中で条件分岐などでほかの合流地点に行くときは、その...
-その際に、たとえばもしある地点からの合流では「a=1」とい...
if (...) { a = 1; } else { a = 2; }
// ここは上記のifに対する合流地点。 ここでは a=1 という...
-このように各合流地点に情報がたまってくるので、それを各合...
-最初のうちは定数だと思っていたけど実は定数ではなかった、...
-これを繰り返して、もう新しい変化は起きなくなったら、それ...
//-要するに、変数の状態が「定数が入っている」「それ以外」...
//-プログラムを上から読んでいくのは同じですが、合流可能性...
//-それぞれのコード片について、まず始状態はやはりテーブル...
//-前回のアルゴリズムでは、変数に定数以外を代入した場合に...
** (2-1)
-「プログラミング言語における最適化について」([[a21_opt]...
--結果が利用されない命令は消す。
-という最適化を紹介しました。これの話の続きです。
-上記では以下のアルゴリズムを紹介しました。
----
-この最適化を実現するアルゴリズムは簡単です。
-プログラムを上から順番に見ていくことにします(下から順番...
-何か変数に「代入する命令」があったとき、その直後からその...
-もし誰からも参照されないまま、新しい別の値を代入する命令...
-悩ましいのは分岐命令や条件分岐命令にぶつかったときです。...
-それで、上記の判定で「結果は使われていない」と判断できた...
----
-しかしこのアルゴリズムでは、代入文の後に条件分岐などがあ...
a = 1; // この代入は結局利用されないので不要。
if (b == 0) { c = 1; }
a = 0;
-これを何とかしたいわけです。
** (2-2)
-(今考えているアルゴリズム)
-基本的な考え方は、上記に似ています。違うのは、分岐命令に...
-解析したことのある部分は覚えておいて、重複がないようにし...
-必要か不必要化を判定している命令の直後からトレースして、...
* こめんと欄
#comment
ページ名: