セシィ–ウルマン法のソースを表示
←
セシィ–ウルマン法
ナビゲーションに移動
検索に移動
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループに属する利用者のみが実行できます:
登録利用者
。
このページのソースの閲覧やコピーができます。
'''セシィ–ウルマン法'''([[英語|英]]: '''Sethi–Ullman algorithm''')とは、[[コンパイラ]]において数式に対応したコードを生成する際に、必要な命令数やレジスタ数を最小にする[[アルゴリズム]]である。ただし前提条件として、数式内の各演算に[[交換法則]]と[[結合法則]]が成り立たなければならない。[[分配法則]]は成り立たなくてもよい。[[交換法則]]や[[結合法則]]が成り立たない場合もこのアルゴリズムを適用可能だが、その場合、数式の変形はできない。 == 単純なセシィ–ウルマン法 == セシィ–ウルマン法は次のように動作する([[RISC]]の場合)。 # [[抽象構文木]]を先頭からか最後尾から見ていく。 ## 定数でない葉ノードについて、1 を割り当てる(すなわち、その変数などを保持するのにレジスタが1つ必要であることを示す)。定数の葉ノードについては、0 を割り当てる。 ## 葉でないノード ''n'' について、''n'' 配下の部分木の評価に必要なレジスタ数を割り当てる。左側の部分木に必要なレジスタ数(''l'')が、右側の部分木に必要なレジスタ数(''r'')と異なる場合、現在見ているノード ''n'' が必要とするレジスタ数は ''max(l,r)'' となる。''l == r'' の場合、現在ノードが必要とするレジスタ数は ''l + 1'' となる。 # コード展開 ## ノード ''n'' の左側の部分木の計算に要するレジスタ数が右側の部分木で必要なレジスタ数より大きい場合、先に左側の部分木を評価する(対応するコードを生成する)。これは、右側を先に評価すると、その結果を保持するためのレジスタが余分に必要となって、レジスタが足りなくなる可能性が大きくなるためである。右側の部分木が左側よりもレジスタ数を多く必要とする場合、同様に右側を先に評価する。両側の必要とするレジスタ数が同じ場合、評価する順序はどちらでもよい。 === 例 === 数式 <math>a = (b + c) * (d + 3)</math> は、[[抽象構文木]]では次のように表される。 = / \ a * / \ / \ + + / \ / \ b c d 3 このアルゴリズムを適用するに当たって、数式の右辺 <math>(b + c) * (d + 3)</math> のみを考慮する。すなわち、代入 '=' の右の部分木のみを参照する。 * / \ / \ + + / \ / \ b c d 3 木構造を(とりあえず先頭から)見ていき、各部分木の評価に必要なレジスタを割り当てていく(<math>(b + c) * (d + 3)</math> の最後の被加数は定数であることに注意)。 *<sub>'''2'''</sub> / \ / \ +<sub>'''2'''</sub> +<sub>'''1'''</sub> / \ / \ b<sub>'''1'''</sub> c<sub>'''1'''</sub>d<sub>'''1'''</sub> 3<sub>'''0'''</sub> この木構造から、'*' の左の部分木の計算には2つのレジスタが必要だが、右の部分木の計算には1つのレジスタだけでよいことが分かる。従って、この式を計算する時点で使っていないレジスタが2つしかない可能性もあるので、先に左側の計算を行うコードを生成する。レジスタを1つしか必要としない右側の部分木を計算するコードを先に生成すると、左側の計算をする間、右の計算結果を保持しておくレジスタが必要となり、全部で3つのレジスタが必要となってしまう。先に左側を計算するには2つのレジスタが必要だが、結果の保持には1つのレジスタがあればよいので、右の計算に必要な1つのレジスタと合わせても、2つのレジスタがあれば全体を計算可能である。 == 改良版 == セシィ-ウルマン法の改良として、使われている演算の代数的性質を利用して、数式を最初に変換する手法がある。 == 外部リンク == *[http://portal.acm.org/citation.cfm?doid=321607.321620 The Generation of Optimal Code for Arithmetic Expressions] Ravi Sethi, J. D. Ullman, Journal of the [[Association for Computing Machinery|ACM]], Vol. 17, No. 4, October 1970, pp. 715-728 *[http://lambda.uta.edu/cse5317/fall02/notes/node40.html Code Generation for Trees] {{DEFAULTSORT:せしいうるまんほう}} [[Category:コンパイラ]] [[Category:アルゴリズム]] [[Category:数学に関する記事]]
セシィ–ウルマン法
に戻る。
ナビゲーション メニュー
個人用ツール
ログイン
名前空間
ページ
議論
日本語
表示
閲覧
ソースを閲覧
履歴表示
その他
検索
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
特別ページ
ツール
リンク元
関連ページの更新状況
ページ情報