はじめに
パー・ブリンチ・ハンセンが書いた並行処理可能な Pascal に SuperPascal (1993 年) があります。今回はこれを動かしてみようという趣旨です。
なお、『データ構造とアルゴリズム』においてアルゴリズムの説明に使われた疑似言語 Super Pascal と名前は同じですが別物です。
See also:
- SuperPascal (brinch-hansen.net)
- SuperPascal (Wikipedia)
- SuperPascal language (pascal.hansotten.com)
- データ構造とアルゴリズム - 培風館の Pascal 関連書籍を読んでみる (Qiita)
使い方
SuperPascal のビルド
本家の SuperPascal は Standard Pascal (ISO Pascal) でコンパイルできる事になっていますが、実際にはいくらかの拡張を施された Pascal でないとコンパイルできません。また、オリジナルのアーカイブは shar
形式なので、解凍するのが少々面倒です。
Free Pascal
と GNU Pascal
でコンパイルできる改変版がそれぞれ GitHub で公開されています。
上記リポジトリのファイルを少し改変したものが pascal.hansotten.com
で公開されています。zip
形式のアーカイブとなっており、特に理由がなければこちらのアーカイブを使う事をオススメします。
しかしながら、いずれにせよ UNIX 系の環境でないと正しくコンパイルできないと思われます。
■ GPC (Linux)
ビルド
$ ./configure
$ make install
■ GPC (MinGW) (Windows)
ビルド
MSYS を使う場合は次のようになります。
$ ./configure
$ make install
GPC で直接コンパイルする場合には次のようになります。
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)
ビルド
$ fpc -O3 -Miso -Fabaseunix -osr interpret.p
$ fpc -O3 -Miso -osc compile.p
■ FPC (Windows)
Free Pascal (Windows) でコンパイルする場合には fptime()
を実装する必要があります。
ビルド
次のユニットを用意します。
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.
fpc -O3 -Miso -Fabaseunix -osr.exe interpret.p
fpc -O3 -Miso -osc.exe compile.p
SuperPascal の使い方
SuperPascal の文法や使い方に関しては次のドキュメントを参考にしてください。
- The Programming Language SuperPascal (pascal.hansotten.com)
- The SuperPascal User Manual (pascal.hansotten.com)
■ sc
sc
は SuperPascal コンパイラです。ソースコードを正しくコンパイルできると、中間形式ファイルを出力します。
入力項目 | 意味 |
---|---|
source | ソースコード名 |
code | 中間形式ファイル名 |
■ sr
sr
は SuperPascal インタプリタです。中間形式ファイルを解釈し実行します。
入力項目 | 意味 |
---|---|
code | 中間形式ファイル名 |
select files? |
no = 入力はキーボード、出力はスクリーン。yes = 入力ファイルと出力ファイルを指定。 |
おわりに
SuperPascal には Occam 2 を参考に導入された parallel や、
parallel
source() |
sink()
end
forall 等のシンプルな並列実行文が用意されていて面白いですね。
forall i := 0 to 10 do
something()
Concurrent Pascal も試せるとよかったのですが...。
See also: