SuperPascal を動かしてみる

# はじめに

パー・ブリンチ・ハンセンが書いた並行処理可能な Pascal に **SuperPascal** (1993 年) があります。今回はこれを動かしてみようという趣旨です。

なお、『データ構造とアルゴリズム』においてアルゴリズムの説明に使われた疑似言語 **Super Pascal** と名前は同じですが別物です。

**See also:**

 - [SuperPascal (brinch-hansen.net)](http://brinch-hansen.net/)
 - [SuperPascal (Wikipedia)](https://en.wikipedia.org/wiki/SuperPascal)
 - [SuperPascal language (pascal.hansotten.com)](http://pascal.hansotten.com/per-brinch-hansen/superpascal-compiler/)
 - [データ構造とアルゴリズム - 培風館の Pascal 関連書籍を読んでみる (Qiita)](https://qiita.com/ht_deko/items/65e84a12e0203da77337#%E3%83%87%E3%83%BC%E3%82%BF%E6%A7%8B%E9%80%A0%E3%81%A8%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0)

# 使い方

## SuperPascal のビルド

本家の **SuperPascal** は Standard Pascal (ISO Pascal) でコンパイルできる事になっていますが、実際にはいくらかの拡張を施された Pascal でないとコンパイルできません。また、オリジナルのアーカイブは `shar` 形式なので、解凍するのが少々面倒です。

`Free Pascal` と `GNU Pascal` でコンパイルできる改変版がそれぞれ GitHub で公開されています。

 - [SuperPascal \[FPC\] (GitHub)](https://github.com/octonion/superpascal)
 - [SuperPascal \[GPC\] (GitHub)](https://github.com/samplx/SuperPascal)

上記リポジトリのファイルを少し改変したものが `pascal.hansotten.com` で公開されています。`zip` 形式のアーカイブとなっており、特に理由がなければこちらのアーカイブを使う事をオススメします。

 - [SuperPascal \[FPC\] (pascal.hansotten.com)](http://pascal.hansotten.com/uploads/pbh/superpascal%20fpc.zip)
 - [SuperPascal \[GPC\] (pascal.hansotten.com)](http://pascal.hansotten.com/uploads/pbh/superpascal%20gnu.zip)

しかしながら、いずれにせよ UNIX 系の環境でないと正しくコンパイルできないと思われます。

### ■ GPC (Linux)
普通に動作します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/457d120e-d43b-6fbb-31c3-ea2cd79b7318.png)

#### ビルド

```bash
$ ./configure
$ make install
```

### ■ GPC (MinGW) (Windows)
動作しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/a12c0482-c2d2-c619-bdd0-412a1b19da4b.png)

#### ビルド

MSYS を使う場合は次のようになります。

```bash
$ ./configure
$ make install
```

GPC で直接コンパイルする場合には次のようになります。

```bash
gpc --classic-pascal-level-0 --no-warnings --transparent-file-names --no-range-checking -o sr.exe interpret.p
gpc --classic-pascal-level-0 --no-warnings --transparent-file-names --no-range-checking -o sc.exe compile.p
```

### ■ FPC (Linux)
普通に動作します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/3aa3a924-1092-b287-c62e-bad6edd39760.png)

#### ビルド

```bash
$ fpc -O3 -Miso -Fabaseunix -osr interpret.p
$ fpc -O3 -Miso -osc compile.p
```

### ■ FPC (Windows)
Free Pascal (Windows) でコンパイルする場合には `fptime()` を実装する必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/7f45ce83-cef9-3234-2eb8-7a08aa33ece3.png)
#### ビルド

次のユニットを用意します。

```pascal:baseunix.pp
unit baseunix;
{$mode objfpc}
interface

uses
  DateUtils, SysUtils;

function fptime(var tloc: Int64): Int64;

implementation

function fptime(var tloc: Int64): Int64;
begin
  tloc := DateTimeToUnix(Now);
  fptime := tloc;
end;
end.
```

```bash
fpc -O3 -Miso -Fabaseunix -osr.exe interpret.p
fpc -O3 -Miso -osc.exe compile.p
```

## SuperPascal の使い方

**SuperPascal** の文法や使い方に関しては次のドキュメントを参考にしてください。

 - [The Programming Language SuperPascal (pascal.hansotten.com)](http://pascal.hansotten.com/uploads/pbh/report.pdf)
 - [The SuperPascal User Manual (pascal.hansotten.com)](http://pascal.hansotten.com/uploads/pbh/user.pdf)

### ■ sc
`sc` は **SuperPascal** コンパイラです。ソースコードを正しくコンパイルできると、中間形式ファイルを出力します。

| 入力項目 | 意味 |
|:---|:---|
| source  | ソースコード名 |
| code | 中間形式ファイル名 |

### ■ sr
`sr` は **SuperPascal** インタプリタです。中間形式ファイルを解釈し実行します。

| 入力項目 | 意味 |
|:---|:---|
| code | 中間形式ファイル名 |
| select files? | `no` = 入力はキーボード、出力はスクリーン。<br>`yes` = 入力ファイルと出力ファイルを指定。 |

# おわりに

**SuperPascal** には [Occam 2](https://ja.wikipedia.org/wiki/Occam) を参考に導入された **parallel** や、

```pascal
parallel
    source() |
    sink()
end
```

**forall** 等のシンプルな並列実行文が用意されていて面白いですね。

```pascal
forall i := 0 to 10 do
    something()
```

**Concurrent Pascal** も試せるとよかったのですが...。

**See also:**

 - [付録 (Delphi コンカレントプログラミング) (Qiita)](https://qiita.com/ht_deko/items/2f8d55f69d30ba622d3b)