PL/0とは
PL/0(ピーエルゼロ)は、
プログラミング言語の一つで、主に教育目的で使用される言語です。大きく分けて2種類のPL/0が存在しますが、ここで解説するのは、
Pascalをベースに簡略化されたバージョンです。このPL/0は、
コンパイラの設計・開発を学ぶための実例として活用されています。
1975年にニクラウス・ヴィルトが著書「Algorithms + Data Structures = Programs」で発表しました。PL/0は、言語の構成要素が非常に小さく、実数をサポートせず、算術演算子も必要最小限に限定されています。制御構文も「if」と「while」のみと非常にシンプルです。そのため、実用的なプログラムを作成するには不向きですが、
コンパイラ自体は非常に小さく単純に作成できるという特徴があります。
PL/0の文法
PL/0の文法は、
EBNF(拡張バッカス・ナウア記法)によって定義されています。この単純な文法は、再帰下降パーサを学生が実装するのに適しており、世界中の教育機関でPL/0
コンパイラが広く利用されています。学生は、元のPL/0の機能が少ないため、言語や
コンパイラを拡張することに時間を使えます。例えば、以下のような拡張が一般的です。
`REPEAT ... UNTIL` 構文の導入
プロシージャへの引数渡し機能の実装
配列、文字列、浮動小数点数などのデータ型の追加
1976年12月、ヴィルトはPL/0
コンパイラの全ソースコードを含む
コンパイラ構築に関する書籍を出版しました。この書籍で示された構文規則は、ヴィルトの著作「Compilerbau」の初版に掲載されたものです。しかし、その後の版では、ヴィルトの研究の進展に伴い、PL/0の文法が変更されています。例えば、`const`や`procedure`などのキーワードが大文字に変更され、
Modula-2に似た外観になりました。
また、ヴィルトの友人である
アントニー・ホーアが、通信プリミティブの記法として感嘆符`!`と疑問符`?`を導入し、ヴィルトもこれをPL/0に取り入れました。ただし、書籍ではこれらの記法の意味については詳しく解説されていません。
使用例
以下は、PL/0を拡張したPL/0Eという言語による例です。
VAR i,sq;
BEGIN
i := 1;
WHILE i <= 10 DO
BEGIN
sq := i i;
! sq;
i := i + 1
END
END.
このプログラムは、1から10までの数の二乗を出力します。教育現場では、感嘆符の代わりに`WriteLn`プロシージャを使用することが一般的です。
PROGRAM Squares(output);
VAR i,sq: INTEGER;
BEGIN
i := 1;
WHILE i <= 10 DO
BEGIN
sq := i i;
writeln(sq)
i := i + 1
END
END.
上記の例は、ヴィルトの著書「Compilerbau」の第2版(1986年、ドイツ)に掲載されたものです。
ヴィルトは、
コンパイラ構築に関する書籍の第3版(最新版)で、PL/0の代わりに
Oberon-0を使用しています。
Oberon-0はPL/0よりも機能が豊富で、配列、レコード、型宣言、プロシージャ引数などを備えています。ヴィルトの書籍の出版社は、彼の書籍を絶版としましたが、ヴィルト自身が2005年に第3版を完成させ、オンラインで公開しています。
関連事項
コンパイラ
Oberon、
Oberon-2
Pascal
再帰下降構文解析
Pコードマシン
ニクラウス・ヴィルト
参考文献
ニクラウス・ヴィルト, 「Algorithms + Data Structures = Programs」
ニクラウス・ヴィルト, 「Compilerbau」
外部リンク
Compilerbau 第一版より
Pascalで書かれた
コンパイラ
ロチェスター大学での PL/0 利用に関する論文
COSC230 ニュージーランド、カンタベリー大学の講義ノート。C言語、
Pascal、Java で書かれた
コンパイラがある。
Burry Kurtz アパラチアン州立大学の講義ノート。配列、パラメータ、関数などをPL/0に追加することを説明している。
PL/0 のリファレンス本 "Algorithms + Data Structures = Programs" のホームページ [1]
* rosettacode.orgのPL/0に実装されている多くのタスク