1.1 オートマトンと状態遷移図

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 )