| 原作者 | IF カリー、スーザン G. ボンド、JD モリソン |
|---|---|
| 開発者 | ロイヤルレーダー研究所 |
| 初回リリース | 1970年7月20日 |
| 書かれた | ALGOL 60(オリジナル) ALGOL 68-R(後期) |
| オペレーティング·システム | ジョージ3 |
| プラットフォーム | ICL 1907F |
| サイズ | 34K語 |
| 利用可能 | 英語 |
| タイプ | 編集者、翻訳者 |
| ライセンス | フリーウェア |
| Webサイト | sw.ccs.bcs.org/CCs/g3 |
ALGOL 68-R は、アルゴリズム言語ALGOL 68の最初の実装でした。
1968年12月、アルゴリズム言語ALGOL 68に関する報告書が発表された。1970年7月20日から24日にかけて、国際情報処理連盟(IFIP)が、言語の実装に関する問題を議論するためのワーキングカンファレンスを開催した。 [1]英国王立レーダー研究所(RRE)の小チームが出席し、IF Currie、Susan G. Bond、[2] 、JD Morrisonが作成したコンパイラを発表した。最大7パスのマルチパスコンパイラを 使用して言語を実装するには最大100人年かかると見積もられていたが、彼らは、エンジニアリングや科学研究の用途で既に生産されているワンパスコンパイラを実装した方法について説明した。
コンパイラ
ALGOL 68-R コンパイラは、当初、アドレス操作とリスト処理の拡張機能を備えたALGOL 60のローカル方言で記述されました。パーサーは、JM Foster のSyntax Improving Device (SID)パーサー ジェネレータを使用して記述されました。
このうち約20Kはプログラムであり、大きすぎると感じています。
– Currie [3]
コンパイラの最初のバージョンは34Kワードを占めていました。後にALGOL 68-Rで書き直され、[4]ほとんどのプログラムをコンパイルするのに約36Kワードかかりました。[5]
ALGOL 68-R は、 ICL 1907F上のGeorge 3オペレーティング システムで実装されました。このコンパイラは、 Royal Radar Establishment (RRE)に代わってInternational Computers Limited (ICL)によって無料で配布されました。
コンパイルされた言語の制限
それは道徳の問題です。私たちには聖書があるのに、あなたは罪を犯しているのです!
-マイルー[6]
ワンパスコンパイルを可能にするために、ALGOL 68-Rは元のレポートで定義された言語のサブセットを実装しました: [7]
- 識別子、モード、演算子は使用前に指定する必要があります。
- 自動手続きなし
- 明示的なVOIDモード
- 正式な申告者はいない
- 並列処理なし
- GOTOは省略できません
- 団結は強い立場でのみ有効である
これらの制限の多くは、ALGOL 68 の改訂レポートで採用されました。
使用前の仕様
1 回のパスでコンパイルできるようにするために、ALGOL 68-R では、使用前に すべての識別子を指定(宣言) することが必須でした。
標準プログラム:
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)));
モード(型)の再帰宣言を可能にするために、特別なスタブモード宣言が使用され、次のシンボルが演算子ではなくモードであることをコンパイラーに通知します。
MODE B ; MODE A = STRUCT ( REF B b); MODE B = [1:10] REF A ;
いいえ手続き中
標準言語では、強いコンテキストで、手続き型 強制により、ある型の式をその型を返す手続きに変換できます。これを使用して、名前による呼び出しを実装できます。
proceduring が使用されたもう一つのケースは、次のような宣言における手順の宣言です。
PROC x プラス 1 = INT : x + 1;
右側はx + 1を整数にキャストしたもので、その後整数を返すプロシージャに変換されました。
ALGOL 68-R チームは、これを処理するのが難しすぎると判断し、言語に 2 つの変更を加えました。手続き型強制は削除され、形式mode : expression は手続き表記として再定義され、キャストは明示的なVALシンボルで示されます。
REAL : x CO ALGOL 68 COのREALへのキャスト REAL VAL x CO をALGOL 68-R COのREALにキャストする
名前による呼び出しが有効に使用されるコード (たとえば、Jensen のデバイス) では、単にプロシージャの表記を渡すだけで済みます。
PROC sum = ( INT lo, hi, PROC ( INT ) REAL term) REAL :
BEGIN
REAL temp := 0;
FOR i FROM lo TO hi DO
temp +:= 項(i);
温度
終わり;
印刷 (合計 (1, 100, ( INT i) REAL : 1/i))
改訂されたレポートで定義された言語のバージョンでは、キャストの形式がモード(表現)にわずかに変更されたものの、これらの変更は受け入れられました。
REAL (x) CO改訂版ALGOL 68 COでREALにキャスト
明示的なボイドモード
元の言語では、VOIDモードは空モードで表されていました。
: x := 3.14; CO は(x := 3.14) を void COにキャストします PROC endit = GOTO end; CO void COを返すプロシージャ
ALGOL 68-R チームは、解析を簡素化し、読みやすさを向上させるために、 明示的なVOIDシンボルを使用することを決定しました。
VOID VAL x := 3.14; CO は(x := 3.14) を void COにキャストします PROC endit = VOID : GOTO end; CO void を返すプロシージャCO
この言語の変更は、ALGOL 68 改訂レポートで採用されました。
正式な申告者はいない
形式宣言子は、アイデンティティ宣言の左側のモード、またはプロシージャ宣言で指定されるモードです。元の言語では、配列境界を含めることができ、一致する実際の宣言子が固定、FLEX、またはEITHER のいずれであるかを指定できました。
[ 15 ] INT a; CO実際の宣言者、境界 1:15 CO REF [ 3 : ] INT b = a; COこれはエラーですCO PROC x = ( REF [ 1 : EITHER ] INT a) : ...
私自身は、形式的な宣言者から境界を省略することは合理的だったと思うが、どちらかまたは両方のフレックス
を省略することはひどい犯罪だったと思う -リンジー[8]
ALGOL 68-R チームは、形式宣言子を、バインドされた情報を含まない仮想宣言子と同じになるように再定義しました。これにより、言語の解析における曖昧さが軽減されることがわかり、これは実用的なプログラムで使用される機能ではないと感じました。
プロシージャが引数に対して特定の境界を必要とする場合、UPB (上限) 演算子とLWB (下限) 演算子を使用してプロシージャ自体で境界をチェックできます。
ALGOL 68-R では、上記の例は次のように再コーディングできます (手順内の aの境界は呼び出し元によって異なります)。
[ 15 ] INT a; CO実際の宣言者、境界 1:15 CO REF [] INT b = a [ AT 3]; COスライスを使用してbに境界を持たせる 3:17 CO PROC x = ( REF [] INT a) VOID : ... 呼び出し元COによって指定されたCO境界
ALGOL 68 の改訂レポートでは、正式な境界も削除されましたが、FLEX指示は正式な宣言者に含めることができるように位置が移動されました。
[ 1: FLEX ] INT a; COオリジナル ALGOL 68、または ALGOL 68-R CO FLEX [ 1: ] INT a; CO改訂 ALGOL 68、CO
PROC x = ( REF [ 1: FLEX ] INT a) : ... COオリジナル ALGOL 68 CO PROC x = ( REF [ ] INT a) VOID : ... CO ALGOL 68-R CO PROC x = ( REF FLEX [ ] INT a) VOID : ... CO改訂版 ALGOL 68 CO
並列処理なし
ALGOL 68 では、 PARの後に担保句を記述することでコードを並列実行できます。次に例を示します。
パー 開始 プロデューサー、 消費者 終わり
手続きプロデューサーとコンシューマーは並列に実行されます。並列句の各部分間の同期のために、従来のP(DOWN)およびV(UP )演算子を備えたセマフォ型(SEMA )が提供されています。
この機能は ALGOL 68-R では実装されていません。
ALGOL 68-RTという拡張機能が書かれ、ICL 1900のサブプログラミング機能を使用して、現代のスレッドライブラリに似たセマンティクスを持つALGOL 68-Rプログラムにマルチスレッド機能を提供しました。[9]コンパイラには変更が加えられず、ランタイムライブラリとリンカーのみが変更されました。
gotoは省略できない
ALGOL 68 では、ジャンプから GOTOシンボルを省略できます。
PROC停止 = : ...; ... BEGIN IF x > 3 THEN stop FI ; COジャンプであり、呼び出しではないCO ... 停止: スキップ 終了
ALGOL 68-R はワンパスコンパイラであるため、これは難しすぎたため、GOTOシンボルが必須になりました。
公式サブ言語ALGOL 68Sでも同様の制限が設けられた。[10]
統合は、強いポジション
ALGOL 68 では、結合は構成モードからUNION を生成する強制です。例:
MODE IBOOL = UNION ( INT , BOOL ); CO IBOOLはINTまたはBOOL CO IBOOL a = TRUE ; CO BOOL値TRUEはIBOOL COに結合されます
標準の ALGOL 68 では、結合は堅固なコンテキストまたは強いコンテキストで可能であったため、たとえば、式のオペランドに適用できました。
OP ISTRUE = ( IBOOL a) BOOL : ...; IF ISTRUE 1 CO は1 ( INT ) をIBOOL CO に結合できるため合法です...
ALGOL 68-R の実装者は、これによって曖昧な状況が多すぎることに気づいたため、結合強制を強力なコンテキストに制限しました。
この制限の影響が重要になることはほとんどなく、必要に応じて、キャストを使用してプログラム内の必要なポイントで強力なコンテキストを提供すること で回避できます。
F00L
ALGOL 68-Rコンパイラは未使用のメモリを-6815700という値に初期化した。[11] [12]
この値が選択された理由は次のとおりです。
- 整数としては大きな負の値であった
- アドレスとしては、ICL 1900上の実用的なプログラムの最大アドレスを超えていました。
- 指示としては違法だった
- テキストとして表示される
F00L - 浮動小数点数なのでオーバーフロービットがセットされている
同じ値がNIL を表すために使用されました。
ストロッピング
あなたのサンプルプログラムのいくつかでは、下線やストラッピングが何も施されていないことに気づきました。
– Mailloux [13]
ALGOLファミリー言語では、識別子と言語の基本記号を区別する必要があります。印刷されたテキストでは、通常、基本記号を太字または下線付き (たとえば 、 BEGINまたはbegin ) で印刷することでこれを実現していました。
ソース コードプログラムでは、何らかのストロッピングテクニックを使用する必要があります。ALGOL 68-R より前の多くの ALGOL 系言語では、基本シンボルを一重引用符で囲むことでこれを実現していました (たとえば、'begin')。68-R では、基本シンボルは大文字で記述することで区別でき、小文字は識別子に使用されていました。
ALGOL 68-R は 6ビット バイト(つまり 64 文字セット)のマシンに実装されていたため、非常に複雑で、少なくとも当初は、 Friden Flexowriter を使用して紙のパンチ テープ上にプログラムを作成する必要がありました。
ALGOL 68-R の経験に一部基づいて、ALGOL 68 の改訂レポートでは、UPPER ストロッピングを含む言語のハードウェア表現が指定されました。
ALGOL 68 の拡張
ALGOL 68-R には、個別のコンパイルとマシンへの低レベル アクセスのための拡張機能が含まれていました。
個別コンパイル
ALGOL 68は強く型付けされた言語であるため、ICL 1900システム上の他の言語で使用されている単純なライブラリ機能では不十分でした。ALGOL 68-Rは、アルバムに保存できる別々にコンパイルされたコードセグメント間でモード、関数、変数、演算子を共有できる独自のライブラリ形式とユーティリティとともに提供されました。[14]
他のセグメントで使用可能になるセグメントは、使用可能になる宣言のリストで終わります。
graphlib COセグメント名CO
BEGIN
MODE GRAPHDATA = STRUCT ( ... );
MODE GRAPH = REF GRAPHDATA ;
PROC new graph = ( ... ) GRAPH : ...;
PROC draw graph = ( GRAPH g) VOID : ...;
...
END
KEEP GRAPH、新しいグラフ、グラフの描画
FINISH
そして、グラフ関数は別のセグメントで使用できます。
myprog WITH graphlib FROM graphalbum
BEGIN
GRAPH g = new graph (...);
...
グラフを描く(g)
...
終了
終了
低レベルのシステムアクセス
ALGOL 68 は厳密に型指定された高水準言語であるため、プログラムが低水準ハードウェアに直接アクセスするのを防ぎます。たとえば、アドレス演算用の演算子は存在しません。
ALGOL 68-Rは標準のICLセミコンパイル(リンクレディ)形式にコンパイルされなかったため、通常はアセンブリ言語で記述されるコードを記述するための機能をALGOL 68-Rで提供するために言語を拡張する必要がありました。機械命令はCODE ... EDOCセクション内にインラインで記述でき、アドレス操作演算子INC、DEC、DIF、ASが追加されました。[15]
George peri操作を使用してコマンドを発行する 例:
[1 : 120] CHARバッファ;
INTユニット番号;
STRUCT ( BITSタイプモード、応答、INTカウント、REF CHARアドレス)
制御領域 := (8r47400014,0,120,buff[1]);
...;
コード0,6/ユニット番号; 157,6/タイプモードOF制御領域EDOC
可用性
David Holdsworth (リーズ大学)による、 George 3オペレーティングシステムエミュレーターで実行可能なALGOL 68-Rコンパイラーのコピーは、 GNU General Public License (GPL)の下でソースコードとともに入手可能です。[16]
参考文献
- ^ Peck, JEL, ed. (1970), Proceedings of the IFIP working conference on ALGOL 68 Implementation、ミュンヘン: North-Holland、ISBN 0-7204-2045-8
- ^ Bond, Susan ; Abbate, Janet (2001年9月26日). 「オーラルヒストリー: Susan Bond: 世界初のALGOL 68コンパイラの開発」.エンジニアリングとテクノロジーの歴史Wiki (ETHW) .電気電子技術者協会(IEEE) . 2020年4月22日閲覧– United Engineering Foundation (UEF)経由。
- ^ ALGOL 68 実装、21 ページ
- ^ Currie, IF; Bond, SG ; Morison, JD (1971)、「ALGOL 68-R、その実装と使用」、Proc IFIP Congress 1971 (Information Processing 1971)、リュブリャナ、ユーゴスラビア: North-Holland、pp. 360–363、ISBN 0-7204-2063-6
- ^ 匿名 (1977 年 1 月). Algol 68-R システム – インストールとメンテナンス(PDF) . コンピューティングおよびソフトウェア研究部門 - Royal Radar Establishment . 2011 年 4 月 9 日閲覧。[永久リンク切れ]
- ^ ALGOL 68 実装、294 ページ
- ^ ALGOL 68 実装、21-26 ページ
- ^ ALGOL 68 実装、276 ページ
- ^ Oliver, JR; Newton, RS (1979). 「ALGOL 68-RT の実践的経験」.コンピュータジャーナル. 22 (2): 114–118. doi : 10.1093/comjnl/22.2.114 .
- ^ Lindsey, Charles H. ; van der Meulen, SG (1997). 「付録 4 、サブ言語」。ALGOL 68 の非公式入門 (改訂版)。North-Holland。ISBN 0-7204-0726-5。
- ^ Raymond, Eric S. (1996)。「愚か者」。新しいハッカーの辞書、第 3 版。MIT プレス。p. 200。ISBN 978-0-262-68092-9Algol 68-R コンパイラは、ポインタまたは浮動小数点数として扱うとクラッシュが発生し、整数または文字列として扱うとダンプで非常に認識されやすいため、
ストレージを文字列「F00LF00LF00LF00L...」に初期化していました。
- ^ Algol 68-R システム - インストールとメンテナンス、25 ページ
- ^ ALGOL 68 実装、30 ページ
- ^ Woodward, PM ; Bond, SG (1974). 「14 - プログラムセグメンテーション」ALGOL 68-R ユーザーズガイド. Her Majesty's Stationery Office (HMSO). pp. 87–89. ISBN 0-11-771600-6。
- ^ Algol 68-R システム - インストールとメンテナンス、pp 26-30
- ^ Toal, Graham (2018 年 9 月)。「George3: ICL 1900 のエミュレーション」。ソフトウェア保存とマシン エミュレーション。2020年 4 月 19 日閲覧。
外部リンク
- アルゴル 68 – マルバーン レーダーおよび技術歴史協会
