| 原作者 | IF カリー、JD モリソン |
|---|---|
| 開発者 | 王立信号・レーダー局 |
| 初回リリース | 1977年8月 |
| 安定版リリース | algol68toc 1.14 / 2012年8月25日 |
| 書かれた | アルゴル68 |
| オペレーティング·システム | 仮想マシン |
| プラットフォーム | ICL 2900 シリーズ、Multics、VAX |
| 利用可能 | 英語 |
| タイプ | 編集者、翻訳者 |
| ライセンス | フリーウェア、パブリックドメイン(一部) |
| Webサイト | 出典: algol68.sourceforge.net |
ALGOL 68RSは、王立信号・レーダー研究所(RSRE)のIF CurrieとJD Morrisonによって書かれた2番目のALGOL 68 コンパイラです。[1] 以前のALGOL 68-Rとは異なり、移植性を考慮して設計されており、改訂レポートの言語を実装しました。
ALGOL 68RSのバージョンは、ICL 2900シリーズ、Multics、およびVMSを実行するVAX用に書かれました。[2] [3]
その後、このコンパイラの一部は、ハードウェア記述言語ELLAの公開リリースの一部として、 ALGOL 68 からCへのトランスレータとしてパブリック ドメインにリリースされました。これも RSRE によるものです。
歴史
IF Currie、JD Morrison、SG Bondによって書かれたALGOL 68-Rコンパイラは大きな成功を収めたものの、2 つの大きな問題を抱えていました。それは、ほぼ時代遅れとなったICL 1900コンピュータ用に書かれたことと、ALGOL 68 の改訂レポートが利用可能になる前にリリースされたため、言語の古いバージョンを実装していたことです。
RSRE では、さまざまな社内プロジェクト用に新しいコンパイラが必要だったため、Currie と Morrison のチームは、マシン間のクロスプラットフォーム ソフトウェア移植性を実現する新しいコンパイラを作成しました。このコンパイラは、ALGOL 68 の解析を処理し、ストリーム言語と呼ばれる高水準の中間言語を生成し、その後、トランスレータによってマシン コードにコンパイルされます。コンパイラは、さまざまなオブジェクト マシンデータ タイプのサイズと、使用可能な文字エンコード(セット)のみを認識する必要がありました。
コンパイラは ALGOL 68 で記述され、最初は ALGOL 68-R コンパイラを使用して ブートストラップされました。
オックスフォード大学コンピューティングサービスの2人のプログラマーのチームがICL 2900シリーズ用のコードジェネレーターを作成しました。[4]サウスウェスト大学地域コンピュータセンター(SWURCC)の マーティン・トーマスは、このシステムがインターナショナル・コンピューターズ・リミテッド(ICL)によって後援され、公式のICL製品として販売されるように手配しました。[5]
その後、Multicsの主要ユーザーであるAvon Universities Joint Computer Centreが、SWURCC チームに ALGOL 68RS の Multics バージョンの作成を依頼しました。Digital Equipment Corporation (DEC) VAXコンピューター用のバージョンも作成されました。
最終的に、SWURCC のチームはPraxis という会社を設立し、当初は ALGOL 68RS の Multics バージョンをサポートしました。
RSRE は、 Flex マシンや ELLA ハードウェア設計言語などの社内プロジェクトにも ALGOL 68RS コンパイラを使用していました。ELLA を自由に利用できるようにすることが決定されたとき、Praxis はALGOL 68RS コンパイラに基づいて ctransというALGOL 68 からCへのトランスレータを作成するよう依頼されました。
コンパイルされた言語の制限
以前の ALGOL 68-R コンパイラと同様に、ALGOL 68RS はワンパス コンパイラであり、コンパイルされる言語にいくつかの制限が必要でした。
使用前の申告
ALGOL 68 プログラム:
PROC even = ( INT number) BOOL : ( number = 0 | TRUE | odd ( ABS (number - 1))); PROC odd = ( INT number) BOOL : ( number = 0 | FALSE | even ( ABS (number - 1)));
次のように書き直す必要があります。
PROC ( INT ) BOOL奇数; PROC偶数 = ( INT数値) BOOL : ( 数値 = 0 | TRUE | 奇数 ( ABS (数値 - 1))); 奇数 := ( INT数値) BOOL : ( 数値 = 0 | FALSE | 偶数 ( ABS (数値 - 1)));
モード(型)の再帰宣言を可能にするために、特別なスタブモード宣言を使用して、次のシンボルが演算子ではなくモードであることをコンパイラーに通知します。
モード B、
A = STRUCT ( REF B b)、
B = [1:10] REF A ;
並列処理
ALGOL 68-R と同様に、演算子PAR句と、それに関連するUP、DOWN、およびLEVEL を含むSEMAモードは省略されました。
ALGOL 68 の拡張
矯正
ALGOL 68 の大きな欠点の 1 つは、標準のトランスプット(入力/出力) プロシージャを純粋な ALGOL 68 で記述できないことです。たとえば、印刷プロシージャは、任意のモードの印刷対象項目の配列を受け取り、それをストレートニングというプロセスによって印刷可能な単純な値に変換します。たとえば、次のようになります。
構造体( INT a, REAL b) c := ...;
print(c); { 魔法のように print ((a OF c, b OF c)); に変換されます }
ALGOL 68RS の作者は、ストレート化を言語の一部として利用できるようにすることを決定しました。STRAIGHTモードは配列に似ていますが、項目のコンポーネントをモードに強制変換できる場合は項目を STRAIGHT モードに強制変換できるという特別な機能があります。例:
構造体( INT a, REAL b) c; ストレート UNION ( INT , REAL )z=c;
Cの両方のフィールドはUNION ( INT、REAL )に強制変換できるため、フィールド "a OF c" は z[1] としてアクセスでき、 "b OF c" は z[2] としてアクセスできます。
標準の印刷手順は次のように宣言できます。
MODE PRINTMODE = UNION ( INT , REAL , ... STRAIGHT PRINTMODE ); PROC print = ([] PRINTMODE引数 ) VOID : ...;
効率的な配列処理
ALGOL 68 配列モードは非常に強力で、複数の次元、定義された上限と下限、トリミング (配列の連続したサブセットを取得して新しい配列を作成する)、スライス (配列から 1 つの次元を削除して新しい配列を作成する)、およびローイング (既存の配列に次元を追加して新しい配列を作成する) などの機能があります。
例えば:
[5:23, -7:7] INT a; { 2次元配列 }
REF [,] INT b = a [ 6:21, 0:3 ] { a のスライス }
REF [] INT c = a [5] { a の1行のみ }
コンパイラはあらゆるケースで最適なコードを生成するためにあらゆる努力を払いましたが、いくつかのより単純な機能を追加することで、場合によってはより優れたコードが生成されると考えられました。この目的のために、ALGOL 68RS には、インデックス可能な構造体(i-struct)、ベクトル、およびFORALLステートメントが含まれていました。
インデックス可能な構造
ALGOL 68 には、ワードベースのマシンで文字とビット データを効率的に処理するための固定長構造、 BYTES モードとBITSモードがすでに含まれていました。BYTES変数は 1 つのマシン ワードの文字を保持し、BITS変数は 1 つのマシン ワードのビットを保持しました。
ALGOL 68RS はこれらのアイデアを一般化しました。STRUCT 4 CHAR変数は正確に 4 文字を保持します。サイズは型の一部です。ほとんどの ALGOL 68RS システムでは、モードBYTESはSTRUCT 4 CHARと同等でした。
MODE BYTES = STRUCT 4 CHAR ; OP ELEM = ( INT index, BYTES val) CHAR : val[index]; ... バイトb = "abcd"; ... 印刷 (2要素b);
ALGOL 68RS コンパイラは、任意の文字列定数を適切なSTRUCT n CHARにコンパイルします。
VECTORまたは配列が必要なコンテキストでは、i-struct を適切なVECTORまたは配列型に拡張できます。
ベクトル
VECTORは、次元が 1 つだけで下限が 1 に固定された簡略化された配列です。
VECTOR [4] INT a; { [1:4] INT a;
と同様}
配列が必要なあらゆるコンテキストでは、VECTOR を配列に変換できます。
FORALL ステートメント
FORALLステートメントを使用すると、配列の要素を効率的にステップ実行できます。
[12] INT a := ...; FORALL xa IN a DO xa := xa * 2 OD
xa は、 aの各要素への参照になります。FORALL は複数の配列を並列に処理することができ、WHILE句によって制御されます。
[12] INT a、b;
...
xa をaで割った場合、
xbがb
にあり、 xa > xb
であるとき
関数 f(xa,xb)
外径
個別コンパイル
ALGOL 68RS は、 ALGOL 68-Rの個別のコンパイル機能に似たライブラリを構築するメカニズムと、 ALGOL 68Cに似たトップダウン方式でプログラムを構築するメカニズムを提供しました。
宣言モジュール
ALGOL 68RS のライブラリは、MODE、変数、演算子、およびプロシージャ宣言のシーケンスと、その後に続く、どの宣言が他のセグメントに表示されるかを定義するkeep リストで構成される宣言モジュールを使用して記述されます。
次に、ライブラリ ユーザーは、1 つ以上の宣言ライブラリのシンボルをプログラムで使用できるようにするようコンパイラに指示する USEヘッダーを追加します。
たとえば、グラフィックス ライブラリは次のように記述されます。
DECS graphlib 他のライブラリを使用する MODE GRAPHDATA = STRUCT ( ... ); MODE GRAPH = REF GRAPHDATA ; PROC new graph = ( ... ) GRAPH : ...; PROC draw graph = ( GRAPH g) VOID : ...; ... グラフを保持、新しいグラフ、グラフを描画 終了
このライブラリを使用するユーザー プログラムは次のようになります。
プログラムmyprog
USE graphlib
BEGIN
GRAPH g = new graph (...);
...
グラフを描く(g)
...
終了
終了
ネストされたモジュール
トップダウン プログラミング スタイルをサポートするために、ALGOL 68RS はHEREおよびCONTEXT機能を提供しました。
プログラムは、後で埋める部分をHEREタグでマークし、その後に利用可能にする宣言の キープリストを記述して作成できます。
PROGRAM (pass1, pass2) コンパイラー
BEGIN
STRING source := ...;
TREE parsetree;
...
HERE pass1 (ソース、パースツリー);
...
手順insts;
ここではpass2 (parsetree, insts);
...
終了
終了
HEREタグのコンテキストで実行されるコードは次のように記述されます。
プログラムpass1 実装
CONTEXT pass1 INコンパイラ
BEGIN
... { "source" と "parsetree" を使用したコード }
終了
終了
HERE はALGOL 68C ENVIRONに似ており、CONTEXT はALGOL 68C USINGと同等です。
コードとエイリアンのアクセス
ALGOL 68RS は、低レベルのシステム プログラミングに使用できるように設計されました。これを可能にするために、マシン コードと非 ALGOL 68RS オブジェクトにアクセスするための機能が含まれていました。
CODE構造を使用してコードが挿入されました:
SOMEMODE CODE ( item1、item2、 ...) 「...コード...」
ここで、itemはコード挿入に使用できる ALGOL 68RS 値であり、SOMEMODE は返されるモードです。コードが値を返さない場合は、モードを省略できます。
ALIEN挿入により、ALGOL68 以外のオブジェクトへのアクセスが可能になりました。
SOMEMODE 名= ALIEN "外部名"
任意の単純な ALGOL 68RS オブジェクトは、SPELL演算子を使用して文字のVECTORに変換できます。
構造体( INT a, REAL b) c = ...;
print (("内部repr = ", SPELL c, 改行));
単純なオブジェクトとは、配列やVECTORを含まないオブジェクトです。
可用性
Praxis が ELLA システム用に作成した ALGOL 68 から C へのトランスレータには、ALGOL 68RS コンパイラのほとんどが含まれています。注目すべき例外は、 FORMATを処理するコードです。
2020年9月現在[アップデート]、ALGOL 68RSはSourceForgeから入手可能である。[6]
参考文献
- ^ Bond, SG ; Woodward, PM (1977年8月). 「RS ポータブル ALGOL 68 コンパイラの紹介」.テクニカルノート(802). 2012年12月14日時点のオリジナルよりアーカイブ。
- ^ Woodward, PM ; Bond, SG (1983). RS システム ユーザー向け ALGOL 68 ガイド. Edward Arnold (Publishers) Ltd. ISBN 978-0-7131-3490-2。
- ^ Lindsey, CH (1998年8月). 「実行可能なALGOL 68実装の調査」ALGOL速報(52):5–8. ISSN 0084-6198.
- ^ 「Multics サイトの歴史: エイボン」。
- ^ Lindsey, CH (1980年12月). 「ALGOL 68実装: ICL 2900コンパイラ」. ALGOL Bulletin (46): 7–8. ISSN 0084-6198.
- ^ ファン・デル・ヴィール、マルセル;ネビルDNZ。 「オープンソースの ALGOL 68 実装」。ソースフォージ。2020 年9 月 18 日に取得。
