5.4 中間言語 (1)中間言語とは 中間コード(intermediate code) 原始プログラムを目的プログラムに変換する際、途中経 過として作成される中間的なプログラム 中間言語( intermediate language ) 中間コードを記述する言語 (2)中間言語の種類 さまざまな種類がある ① 字句の列(字句解析を済ませたもの) 古い BASIC 言語 ② 解析木(構文解析を済ませた解析木あるいはそれと同 等) 構文木、ポーランド記法 ③ アセンブラコードに近いもの 仮想機械アセンブラソースコード ④ 機械語に近いもの 三つ組みの列、四つ組の列、仮想機械コード ③の場合、仮想機械アセンブラソースコードと対象機械マクロ定義を組み 合わせて対象機械目的プログラムを生成する方式もある (C言語におけるWhite Smithの方法) (3)構文木(Syntax tree) 木の葉(leaf)に被演算子(operand) 木の節(node)に演算子(operation) 【例】(A+B)*C * + A C B 【注】解析木と混同しないこと (3)後置記法等 ①前置記法(prefix notation)+ A B 演算子の後に被演算子。Lispの記法でもある。 ポーランド記法(Polish Notation)ともいう。 ②中間記法(infix notation)A + B 演算子の間に被演算子。通常の数学的な記法。 括弧を使わないと式の計算順序を決められない。 ③後置記法(postfix notation)A B + 被演算子の後に演算子。日本語的な記法。 逆ポーランド記法( Inverse Polish Notation)とも いう。 ①と②は論理的には構文木のテキスト表現ともいえる。 後置記法が最もよく使われる。 後置記法等の例 前置記法 中間記法 後置記法 * + A B C (A + B) * C A B + C * (AとBを加えた結果にCを乗じる) 【例】(A+B)*C * + A C B (4)三つ組(triple) 2つの被演算子の間の演算 (2番地命令:two address codeともいう) 番号(演算子, 被演算子1,被演算子2 ) 【例】A = 1. ( /, 2. ( *, 3. ( -, 4. ( =, 20 / B - C * D 20, B) C, D) @1, @2) @3, A) (要求駆動型データフローマシンのコードに類似する) (5)四つ組(quadruple) 演算子と2つの被演算子、結果の変数の組 解析木を最も小さな単位の木に分解したものといえる、 (3番地命令:three address codeともいう) (演算子, 被演算子1,被演算子2,結果の変数 ) 【例】A ( /, ( *, ( -, = 20 / B - C * D 20, B, R1) C, D, R2) R1, R2,A) (6)後置記法と四つ組の比較 【後置記 法】 ①括弧を使用しなくても計算順序のあいまいさなしに表 現できる。 ②この記法からのコード生成が容易である。 ③直接実行のインタプリタがスタックマシンとして表現 可能。 ④四つ組等に比べて表現に融通性がなく変形しにくいの でコード最適化に向いていない。 【四つ組】 ①同じ計算結果を与えるなら順序を入れ替えてもよい。 ②順序入替え操作が容易である。 ③大型計算機のFORTRAN等に用いられている。 (7)四つ組における最適化の例 A = ( X + Y - Z ) / ( X + Y ) 【最適化】 (+, (-, (+, (/, X, r1, X, r2, Y, Z, Y, r3, r1) r2) r3) A ) (+, X, Y, r1) (-, r1, Z, r2) (/, r2, r1, A )
© Copyright 2024 ExpyDoc