Pascal-P シリーズについて

# はじめに
**Pascal-P** は CDC 6000 用 コンパイラ作成研究の一環として、チューリッヒ工科大学で 1973 年頃に作られた Pascal のサブセット実装です。

Pascal-P は仮想的なスタックコンピュータ用のオブジェクトコードを生成する **P-Code コンパイラ** と、そのオブジェクトコードを解釈して実行する **P-Code インタプリタ** で構成されています。

スタックマシンとコンパイラの概要レポートとして、K.V. Nori、U. Ammann、K. Jensen、H. Nägeli らによって 1974 年に書かれた **『The PASCAL "P" compiler: Implementation notes』** があります。

**See also:**

 - [The PASCAL "P" compiler: Implementation notes (ETH)](https://www.research-collection.ethz.ch/handle/20.500.11850/68666)
 - [pコードマシン (Wikipedia)](https://ja.wikipedia.org/wiki/P%E3%82%B3%E3%83%BC%E3%83%89%E3%83%9E%E3%82%B7%E3%83%B3)
 - [スタックマシン (Wikipedia)](https://ja.wikipedia.org/wiki/%E3%82%B9%E3%82%BF%E3%83%83%E3%82%AF%E3%83%9E%E3%82%B7%E3%83%B3)
 - [レジスタマシン (Wikipedia)](https://ja.wikipedia.org/wiki/%E3%83%AC%E3%82%B8%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%B7%E3%83%B3)

## より正確な Pascal-P の動作

**「P-Code の "P" って何」** という話ですが、これは **Pseudo** (疑似) を意味するようです。つまり `P-Code` とは仮想マシン用の疑似コードを指します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/09fe1546-14fe-5639-3da6-d9f792e8d9e0.png)

### ・P-Code コンパイラ (PCOM)

Pascal のソースコードを P-Code 用のアセンブラソース (中間形式ファイル) へコンパイルします (翻訳系)。直接 P-Code を吐くものではありません。

### ・P-Code インタプリタ (PINT)

P-Code 用のアセンブラソースを P-Code へとアセンブルし (直訳系)、メモリ上に展開された P-Code を逐次実行します (通訳系)。


# Pascal-P シリーズ

以下 Pascal-P シリーズの概要です。
それぞれのバージョンの概要は『Pascal Users Group Newsletter #4』P.81 に記述があります。

**See also:**

 - [Pascal Users Group Newsletters (standardpascaline.org)](http://www.standardpascaline.org/pug.html)

## ■ Pascal-P1
1973 年リリース。現存しません。時期的に、言語仕様としては **『Revised Report (1973)』** を元にして作成されたのだろうと思われます。

**See also:**

 - [標準 Pascal の規格票と解説書を読んでみる (Qiita)](https://qiita.com/ht_deko/items/091661d6fa3d72700a56)


## ■ Pascal-P2

1974 年リリース。SourceForge でソースコードをダウンロードできます。

 - [pascal-p2 (SourceForge)](https://sourceforge.net/projects/pascal-p2/)

作者名はソースコードのヘッダに次のようにクレジットされています。

| プログラム | 作者名 |
|:---|:---|
| P-Code コンパイラ | U. Ammann|
| P-Code インタプリタ | K. Jensen、N. Wirth |

P-Code インタプリタの方は Scott A. Moore 氏がソースコードに手を加えていますが、これは CDC 6000 の構造に依存している部分を取り除くためだと思われます。

**UCSD Pascal** (Apple II や Apple III の Pascal を含む) は、この **Pascal-P2** を参考としています。**Turbo Pascal** も **UCSD Pascal** を参考にしているため、巡り巡って **Delphi** にも **Pascal-P2** の制限が残っていたりします [^1]。

**See also:**

 - [The P2 compiler (standardpascaline.org)](http://www.standardpascaline.org/p2.html)
 - [UCSD Pascal を触るためだけの UCSD p-System 操作ガイド (Qiita)](https://qiita.com/ht_deko/items/50c0cb0fd3cbafc1f8e1)

## ■ Pascal-P3
1976 年リリース。現存しません。後述する Pascal-P4 と並行して作られたようです。Pascal-P2 との互換性を重視したバージョンだったようです。

## ■ Pascal-P4

1976 年リリース。SourceForge でソースコードをダウンロードできます。

 - [pascal-p4 (SourceForge)](https://sourceforge.net/projects/pascalp4/)

作者名はソースコードのヘッダに次のようにクレジットされています。互換性よりも効率を重視したバージョンです。

| プログラム | 作者名 |
|:---|:---|
| P-Code コンパイラ | U. Ammann、K.V. Nori、Ch. Jacobi|
| P-Code インタプリタ | K. Jensen、N. Wirth、Ch. Jacobi |

`pcomOrg.pas` と `pintOrg.pas` がオリジナルのソースです。`pcom.pas` と `pint.pas` は Scott A. Moore 氏が手を加えたバージョンです。

P4 コンパイラが吐くエラーコードの一覧表は『Pascal User Manual and Report (第 2 版)』または『Pascal の言語処理系』にしか載っていません。

Apple の Lisa に搭載された Pascal は、この Pascal-P4 がベースとなっています。『MCC (マイクロコンピュータ振興センター) Pascal』も Pascal-P4 ベースのようです [^2]。

**See also:**

 - [<2> Clascal のオブジェクト指向拡張 (Pascal へのオブジェクト指向拡張の歴史と Delphi) (Qiita)](https://qiita.com/ht_deko/items/770f2db98c9cf3e8ef7b)
 - [[PDF] PASCAL - User Manual and Report (pascal.hansotten.com)](http://pascal.hansotten.com/uploads/books/Pascal_User_Manual_and_Report_Second_Edition.pdf) - 第 2 版
 - [マイクロコンピュータにおけるPASCALコンパイラ取扱い説明書 (JIPDEC)](https://www.jipdec.or.jp/archives/publications/J0002161.pdf)


### ・Pascal-P4 のソースコードヘッダ

さて、Pascal-P4 のソースコードヘッダには興味深いことが書いてあります。

```pascal
(*$c+,t-,d-,l-*)
 (***********************************************
  *                                             *
  *      Portable Pascal compiler               *
  *      ************************               *
  *                                             *
  *             Pascal P4                       *
  *                                             *
  *     Authors:                                *
  *           Urs Ammann                        *
  *           Kesav Nori                        *
  *           Christian Jacobi                  *
  *     Address:                                *
  *       Institut Fuer Informatik              *
  *       Eidg. Technische Hochschule           *
  *       CH-8096 Zuerich                       *
  *                                             *
  *  This code is fully documented in the book  *
  *        "Pascal Implementation"              *
  *   by Steven Pemberton and Martin Daniels    *
  * published by Ellis Horwood, Chichester, UK  *
  *         ISBN: 0-13-653-0311                 *
  *       (also available in Japanese)          *
  *                                             *
  * Steven Pemberton, CWI/AA,                   *
  * Kruislaan 413, 1098 SJ Amsterdam, NL        *
  * Steven.Pemberton@cwi.nl                     *
  *                                             *
  ***********************************************)
```

**「also available in Japanese」...？** そうなんです、この Pascal-P4 ソースコードには完全な日本語ドキュメントが存在するのです。


### ・書籍『Pascal の言語処理系』

Pascal-P4 の実装を詳細に解説した書籍があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/5e5f9eba-bceb-ef23-a38c-b6c34edb0151.png)

| タイトル | 著者 | ISBN-10<br>(Amazon) |出版年|
|:--|:--|:-:|:-:|
| Pascal Implementation: The P4 Compiler | スティーブン・ペンバートン(著)<br>マーチン・ダニエルズ(著)| [0853123586](https://www.amazon.co.jp/dp/0853123586/)  | 1982/1/1 |
| Pascal Implementation: Compiler and Assembler Interpreter | スティーブン・ペンバートン(著)<br>マーチン・ダニエルズ(著)| [085312437X](https://www.amazon.co.jp/dp/085312437X/)  | 1982/1/1 |
| Pascal Implementation The P4 Compiler / Compiler and Assembler Interpreter | スティーブン・ペンバートン(著)<br>マーチン・ダニエルズ(著)| [0136530311](https://www.amazon.co.jp/dp/0136530311/)  | 1983/1/1 |
| Pascal Implementation: The P4 Compiler / Compiler and Assembler Interpreter  | スティーブン・ペンバートン(著)<br>マーチン・ダニエルズ(著)| [0853125899](https://www.amazon.co.jp/dp/0853125899/)  | 1983/1/12 |
| Pascal の言語処理系 Pascal-P4 / 翻訳系・直訳系/通訳系| スティーブン・ペンバートン(著)<br>マーチン・ダニエルズ(著)<br>武市正人(訳)<br>木村友則(訳)| [47690098X](https://www.amazon.co.jp/dp/47690098X)  | 1984/9/1 |

書籍は函 (はこ) に入った二冊で構成されています。

**・Pascal-P4**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/2e328c95-213a-efeb-bf7d-9e1b583c1298.png)

**・翻訳系・直訳系/通訳系**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/7a00fa9e-b347-087f-8e4b-76ebb10a19fc.png)

本書は **『Pascal Implementation: The P4 Compiler / Compiler and Assembler Interpreter』** の邦訳版のようです。原書は元々、**『The P4 Compiler』** と **『Compiler and Assembler Interpreter』** として別々に販売されていたようです。

#### 書評
『Pascal-P4』が Pascal-P4 のソースコードの解説書、『翻訳系・直訳系/通訳系』が P4 コンパイラとインタプリタのソースコードとなっている。

|  | Pascal-P4 | 翻訳系・直訳系/通訳系 |
|:---|:---|:---|
| P-Code コンパイラ | 第 I 部 | 翻訳系 (コンパイラ) |
| P-Code インタプリタ |  第 II 部 | 直訳系 (アセンブラ)　/ 通訳系 (インタプリタ) |

先述の通り、Pascal-P4 のソースコードは公開されているので、行番号を表示できるテキストエディタがあれば、『翻訳系・直訳系/通訳系』を読む必要はない。

Pascal のソースコードを強調構文表示できるテキストエディタであればなおいい。但し、ソースコードは **ハード 8 タブ** で記述されているので、事前に空白に置換しておいた方がいいかと思う。もちろん **Delphi** や **Lazarus** で開いてもいい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/efbc1af6-0eca-afae-5e8e-2289d5a9f0c3.png)

Pascal-P コンパイラのソースコードの解説なので、大前提として**標準 Pascal (Revised Report)** の知識が必要となる。そして、これは本書のせいではないが、Pascal-P4 の仕様のドキュメントがないため、**標準 Pascal (Revised Report)** との差異が断片的にしか解らない。

この書籍を手に取る前に、ある程度は Pascal 全般についての知識を身に付けておく必要があるように思える。序文に参照すべき文献として **『Pascal User Manual and Report (第 2 版)』** が挙げられているが、多分これだけでは本書を読み解けない。それでも、本書を入手したのなら『J&W 第 2 版』も併せて持っておくべきだとは思う (邦訳版は[『PASCAL (ISBN10: 456300782X)』](https://www.amazon.co.jp/dp/456300782X))。第 3 版以降でも代用は可能だが、年代は合わせたほうがいいように思う。

用語についてはいい意味で「混ざっている」ので、Pascal の日本語書籍の中では読みやすい部類だと思う。

なお、著者であるスティーブン・ペンバートン氏のサイトで、『Pascal Implementation: The P4 Compiler』を読む事ができる。但し、ドラフト扱いという事になっている。

個人的な評価: ★★★★☆

:::note
[『Pascal の言語処理系: Pascal-P4』](https://dl.ndl.go.jp/pid/12631069)と[『Pascal の言語処理系: 翻訳系・直訳系/通訳系』](https://dl.ndl.go.jp/pid/12631134)は国立国会図書館デジタルコレクションで読む事ができます。書籍の閲覧には国立国会図書館の利用者登録 ([本登録](https://www.ndl.go.jp/jp/registration/individuals_official.html)) が必要です。
:::


**See also:**

 - [Pascal Implementation: A Book and Sources](https://homepages.cwi.nl/~steven/pascal/)
 - [Wirth 先生の邦訳本を読んでみる (Qiita)](https://qiita.com/ht_deko/items/3086b7cff08928eca7a9)


### ・Pascal-P4 と標準 Pascal の違い

 1. 手続きパラメータ / 関数パラメータがありません。
 2. goto は `手続き内 goto (Intraprocedural gotos)` であり、手続き/関数の外側へジャンプする事はできません。
 3. text タイプのファイル型のみ使用でき、ファイルは P4 によって定義された `input`, `output` と、P4 がコンパイルできるように定義された 2 つの特別なファイル (`prd`, `prr`) のみが使用できます。任意の外部ファイルは扱えません。
 4. 動的変数の解放のための `Dispose()` の代わりに `Mark()` と `Release()` を使うようになっています。
 5. 中括弧コメント `{}` は実装されていません。
 6. 定義済み識別子 `maxint`, `text`, `round`, `page`, `dispose` およびそれらを示す手続き/関数は存在しません。
 7. `Reset()`, `Rewrite()`, `Pack()`, `Unpack()` 手続きが実装されていません (これらは有効な定義済み手続きとして認識されますが、使用時には 'unimplemented' エラーが表示されます)。
 8. レコード型の可変部は識別されません。
 9. Boolean 型の値を出力 (`Write()` / `Writeln()`) できません。
 10. Real 型を固定小数点フォーマットでは出力 (`Write()` / `Writeln()`) できません。 
 11. 部分範囲型を利用した集合型の定義はできません。
 12. (恐らく) 識別子はすべて小文字である必要があり、大文字/小文字を区別します。

**See also:**

 - [The P4 compiler (standardpascaline.org)](http://www.standardpascaline.org/p4.html)


## ■ Pascal-P5
標準 Pascal (ISO 7185) 準拠の Pascal-P コンパイラ/インタプリタです。SourceForge でソースコードをダウンロードできます。

 - [pascal-p5 (SourceForge)](https://sourceforge.net/projects/pascalp5/)

この Pascal-P5 はチューリッヒ工科大学で作られたものではなく、Scott A. Moore 氏によるものです。

Pascal-P4 を標準 Pascal に準拠するようにした実装は、他にも **『Standard Pascal Model Implementation (SPMI)』** がありますが、こちらは著作権の関係で自由に配布ができないようです。

**See also:**

 - [The P5 compiler (standardpascaline.org)](http://www.standardpascaline.org/p5.html)
 - [A Model Implementation of Standard Pascal (pascal.hansotten.com)](http://pascal.hansotten.com/uploads/welsh/A%20model%20Implementation.pdf)

### ・Pascal-P5 と標準 Pascal の違い
限りなく標準 Pascal (水準 0) に近い実装となっています。制限といえば外部ファイルの扱いに制限があるくらいです。

標準 Pascal の挙動を調べるため (古い書籍にある Pascal で書かれたアルゴリズムの検証など) にとても便利です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/21785/4d1379a5-fb99-d9e6-3360-13fd08ee76fa.png)

**See also:**

 - [割と簡単に '標準 Pascal' を試してみたい (Qiita)](https://qiita.com/ht_deko/items/41e95154e8da2f901698)
 - [標準 Pascal の規格票と解説書を読んでみる (Qiita)](https://qiita.com/ht_deko/items/091661d6fa3d72700a56)
 - [標準 Pascal 範囲内での Delphi 入門 (Qiita)](https://qiita.com/ht_deko/items/e2796788c65c2cda1de5)
 - [Delphi で Pascal-P5 v 1.3 をビルドする (Qiita)](https://qiita.com/ht_deko/items/d40399477ff5a8823a33)
 - [Delphi で Pascal-P5 v 1.4 をビルドする (Qiita)](https://qiita.com/ht_deko/items/0a3a4a7613aa1b6c5296)

### □ Trevor Blight 氏による Pascal p5c / p5x

Pascal p5c / p5x は Trevor Blight 氏による Pascal コンパイラで、Pascal-P5 がベースになっています。p5c は限りなく標準 Pascal (水準 1) に近い実装で、p5x は使い勝手がいいように拡張が施されています。

どちらも中間ファイル (疑似アセンブラ) ではなく、gcc のソースコードを吐きます。つまりは P コードコンパイラではないのですが、Pascal-P5 の派生物という事で紹介しておきます。

**See also:**

 - [Pascal p5c / p5x を試してみたい (Qiita)](https://qiita.com/ht_deko/items/8e99fa611f60cfab06cb)

## ■ Pascal-P6
Pascal-P6 と呼ばれるコンパイラには 2 種類あります。

### □ Scott A. Moore 氏による Pascal-P6
Pascal-P5 の作者である Scott A. Moore 氏によるものです。以前はソースコードのみの提供だったのですが、現在のリポジトリには Windows で動作するバイナリが含まれています。ソースコードからのビルドには **gpc** が必要なようです。

標準 Pascal (ISO 7185) 準拠に加え、

 - デバッグモード
 - 強化された標準チェック
 - 高速な cmach モード
 - ターゲットマシン出力ジェネレータ

など、多くの追加機能を備えています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/597fc6b6-cc4c-6012-49bc-38ac5e1d2d97.png)

**See also:**

 - [Pascal-P6 (SourceForge)](https://sourceforge.net/projects/pascal-p6/)
 - [Pascal-P6 (GitHub)](https://github.com/samiam95124/Pascal-P6)

### □ Richard Sprague 氏による Pascal-P6
ソースコードが Windows 用実行形式バイナリと共に公開されています。

**標準 Pascal (ISO 7185) 水準 1** に対応している事が大きな特徴ですが、元々は作者が **WD** と呼ぶコンパイラを作るためのベースとして作られたもののようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/aeb45d6f-7f34-3a9a-1c00-020f349d8b04.png)

`caesar.pas` をコンパイルして実行するためのコマンドラインは次のようになります。

```
[コンパイル]
pcom < caesar.pas caesar.p6

[実行]
pint caesar.p6
```

**See also:**

 - [Pascal-P6 (wirth-dijkstra-langs.org)](http://wirth-dijkstra-langs.org/)
 - [11.1.2. 整合配列パラメータ (Conformant array parameters))](https://qiita.com/ht_deko/items/b93ac03bfee002f17137#1112-%E6%95%B4%E5%90%88%E9%85%8D%E5%88%97%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF-conformant-array-parameters)


# おわりに
Pascal-P について調べる時のとっかかりにでもなれば幸いです。

[^1]: 手続き内 goto (intraprocedural gotos) とか。
[^2]: 取扱説明書で言っている `標準 Pascal` とは 『Revised Report』の事で、ISO 7185 / JIS X 3008 ではない。