3番地コードのソースを表示
←
3番地コード
ナビゲーションに移動
検索に移動
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループに属する利用者のみが実行できます:
登録利用者
。
このページのソースの閲覧やコピーができます。
'''3アドレスコード'''({{lang-en-short|'''three-address code'''}})とは、コンピュータ・[[プログラミング言語]]処理系などにおける[[中間表現]]などにおける形式の1パターンである。処理系においては、[[コンパイラ最適化]]などの処理を掛けるのに適している。2つの入力と1つの出力の[[メモリアドレス|アドレス]]([[記憶装置|メモリ]]または[[レジスタ (コンピュータ)|レジスタ]])を指定する形式であるため、3アドレスコードと呼ばれる。[[命令セット]]アーキテクチャにおける「3オペランド」形式の類推とも言える。 == 概要 == この形式における各命令は、形式的に4ツ組で表現すると <code>(オペコード, ソース1, ソース2, デスティネーション)</code> である。より直感的にプログラミング言語における代入と2項演算子による数式っぽく書くと、 :<math>a \oplus b \rightarrow x</math> あるいは、 :<math>x \leftarrow a \oplus b</math> といったようになる(ただし <math>\oplus</math> は、なんらかの演算の2項演算子とする)。「左辺」「右辺」という用語の都合から、ここでは以後、後者の記法を使う。 ここで、a と b は、比較的に具体的な(目的コードに近い)場合は、即値か、レジスタや何らかのアドレスのメモリである。比較的に抽象的な([[ソースコード]]に近い)場合は、定数か、ソースコード中の変数、あるいはソースコード中にはあらわれない、処理系が生成するテンポラリな中間変数である。また、x は、a や b とは違い、それを対象として代入できるもの(左辺値を持つもの)でなければならず、即値や定数にはならない。 ソースコード中に次のような、複数の演算で構成された式を含む代入文となっている、1個の文があったとする。 :<code>x := i + m * n;</code> これをそのまま1命令で表現することはできない<ref>しばしばある、<code>x += m * n</code> のようなソースコードと、積和演算命令に対応した処理系、といったような場合には違ってくるが、ここでは一般的な場合を考えることとする。</ref>。そのため、次のような2つの命令に分解される。 :<math>t \leftarrow m \times n</math><br /><math>x \leftarrow i + t</math> オペランド数が違っていても「3アドレスコード」という呼び方をすることもある。3アドレスコードの要諦は、各命令が基本的に演算命令1個に相当する演算を表現して<ref>ここではロード・ストア命令は考えない。</ref>いなければならずソースやデスティネーションが任意の式ではなく単純な1個の変数などでなければならない点(これは2アドレスコード等でも同様)と、例えば2アドレスコードではデスティネーションをソースの片方と共通としなければならない制限がある(そのオペランドにはメモリが使えずレジスタとするという、より強い制限がしばしば掛かる)のと異なり、任意の組合せが可能な点である。 他に、[[プロセッサ]]の[[命令セット]]における3オペランド形式の場合、[[RISC]]プロセッサで、命令フォーマットから豊富なメモリアドレッシングを排して空いた空間を利用して、従来の[[CISC]]プロセッサに多かった2オペランド形式から、より最適化などに適した3オペランド形式としたRISCプロセッサが多いという経緯がある。また例えば、ゼロレジスタ(例えばDEC AlphaプロセッサのR31)を併用すると、 :<code>y := -x;</code> を、 :<math>y \leftarrow R31 - x</math> とできる、などのように3オペランドに統一できる、といったようなことはRISCらしさと言われている一例である。 == 例 == <syntaxhighlight lang="C"> int main(void) { int i; int b[10]; for (i = 0; i < 10; ++i) { b[i] = i*i; } } </syntaxhighlight> 上記の[[C言語]]プログラムを変換すると、次のようになる。 <pre> i := 0 ; 代入 L1: if i < 10 goto L2 ; 条件付分岐 goto L3 ; 無条件分岐 L2: t0 := i*i t1 := &b ; 演算対象のアドレス t2 := i << 2 ; bは整数型配列なのでオフセットはi*4(=i<<2)バイト t3 := t1 + t2 ; t3 には b[i] のアドレスが設定される *t3 := t0 ; ポインタを通して格納する i := i + 1 goto L1 L3: </pre> == 注 == <references/> == 外部リンク == *[http://cs.wwc.edu/~aabyan/464/Quads.html Three-Address Code and Register Allocation] *[http://www.cs.arizona.edu/classes/cs453/fall07/DOCS/intcode.html CSc 453: A Three-Address Intermediate Code Instruction Set for C--] {{DEFAULTSORT:さんはんちこと}} {{Software-stub}} [[Category:コンパイラ]] [[Category:名数3|はんちこおと]]
このページで使用されているテンプレート:
テンプレート:Lang-en-short
(
ソースを閲覧
)
テンプレート:Software-stub
(
ソースを閲覧
)
3番地コード
に戻る。
ナビゲーション メニュー
個人用ツール
ログイン
名前空間
ページ
議論
日本語
表示
閲覧
ソースを閲覧
履歴表示
その他
検索
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
特別ページ
ツール
リンク元
関連ページの更新状況
ページ情報