アルゴリズム言語に関する改訂レポート – Algol 68 編集者: A. van Wijngaarden 他、1973 年 9 月[1] | |
| パラダイム | マルチパラダイム:並行、命令型 |
|---|---|
| 家族 | アルゴル |
| デザイン: | A. ファン ワインガルデン、BJ マイルー、JEL ペック、CHA コスター他 |
| 初登場 | 最終報告書: 1968年r0 |
| 安定版リリース | Algol 68/RR / 改訂報告書: 1973 r1 |
| タイピングの規律 | 静的、強力、安全、構造的 |
| 範囲 | 語彙 |
| 主な実装 | |
| ALGOL 68C、 Algol 68 Genie (最近)、ALGOL 68-R、ALGOL 68RS、ALGOL 68S、FLACC、 Алгол 68 Ленинград/レニングラードユニット、Odra ALGOL 68 | |
| 方言 | |
| ALGOL 68/FR (最終レポートr0 ) | |
| 影響を受けた | |
| アルゴル 60、アルゴル Y | |
| 影響を受けた | |
| C、[3] [5] C++、[6] Bourneシェル、KornShell、Bash、Steelman、Ada、Python、[7] Seed7、Mary、S3 | |
ALGOL 68 ( Algorithmic Language 1968の略) は、ALGOL 60プログラミング言語の後継として考案された命令型 プログラミング言語であり、より広い適用範囲と、より厳密に定義された構文とセマンティクスを目標に設計されています。
数百ページに及ぶ非標準用語で埋め尽くされた言語定義の複雑さにより、コンパイラの実装が困難になり、「実装もユーザーもいない」と言われました。これは部分的にしか真実ではありません。ALGOL 68 は、 International Computers Limited (ICL) のマシンで人気があった英国など、いくつかのニッチ市場で使用され、教育の役目も果たしました。これらの分野以外では、使用は比較的限られていました。
それでも、ALGOL 68 がコンピュータサイエンスの分野にもたらした貢献は深く、広範囲で、永続的なものでした。ただし、これらの貢献の多くは、その後開発されたプログラミング言語に再び現れたときに初めて公に認識されました。多くの言語は、言語の複雑さに対する対応として特別に開発されました。最も有名なのはPascalですが、Adaのように特定の役割のために再実装された言語もありました。
1970 年代の多くの言語は、その設計を特に ALGOL 68 に遡らせており、一部の機能を選択し、与えられた役割に対して複雑すぎる、または範囲外であると見なされた他の機能を放棄しています。これらの言語の 1 つであるC言語は、特にその強力な型付けと構造において ALGOL 68 から直接影響を受けています。ほとんどの現代言語は、少なくとも一部の構文を C または Pascal に遡らせており、したがって直接的または間接的に ALGOL 68 に遡らせています。
概要
ALGOL 68 の機能には、式ベースの構文、ユーザー宣言型と構造体/タグ付き共用体、変数と参照パラメータの参照モデル、文字列、配列、行列のスライス、および並行性が含まれます。
ALGOL 68 は、国際情報処理連盟(IFIP) のアルゴリズム言語および計算に関するIFIP ワーキング グループ 2.1によって設計されました。1968 年 12 月 20 日に、この言語はグループによって正式に採用され、その後 IFIP の総会で公開が承認されました。
ALGOL 68 は、Adriaan van Wijngaardenによって発明された2 レベルの形式文法である形式主義を使用して定義されました。Van Wijngaarden 文法は文脈自由文法を使用して、特定の ALGOL 68 プログラムを認識する無限の生成セットを生成します。特に、他の多くのプログラミング言語の技術標準ではセマンティクスと呼ばれ、曖昧になりやすい自然言語の散文で表現され、その後、形式言語パーサーに添付されたアドホックコードとしてコンパイラーに実装される必要がある種類の要件を表現できます。
ALGOL 68 は、実装前に完全な正式な定義が行われた最初の (そしておそらく最後の) 主要言語でした。
ALGOL 68 の主な目的と設計原則:
- 説明の完全性と明確さ[9]
- デザインの直交性[10]
- セキュリティ[11]
- 効率性: [12]
- 静的モードのチェック
- モードに依存しない解析
- 独立したコンパイル
- ループの最適化
- 表現 – 最小限およびより大きな文字セット
ALGOL 68 は、 C 、 S-algol、 Pascal などの意図的に単純な同時代の言語 (および競合言語)とは対照的に、 ALGOL 60の単純さを放棄し、複雑または過度に一般的なアイデアの媒体となり、コンパイラ作成者の作業をほとんど容易にしなかったとして、 CAR HoareやEdsger Dijkstraなどの設計委員会の一部のメンバーによって最も批判されてきた。
1970 年、ALGOL 68-R はALGOL 68 用の最初の実用的なコンパイラになりました。
1973年の改訂では、手続き、ゴム[13]、形式的な境界などの特定の機能が省略されました。[14] Cf 改訂前の報告書の言語。r0
欧州の防衛機関(英国では王立信号レーダー局(RSRE))は、セキュリティ上の利点が期待できるため ALGOL 68 の使用を推進しましたが、NATO 同盟国の米国側は、別のプロジェクトである言語Ada を開発し、米国の防衛契約ではその使用を義務付けることを決定しました。
ALGOL 68 はソ連にも顕著な影響を与えており、その詳細はアンドレイ・テレホフの 2014 年の論文「ALGOL 68 とそのソ連とロシアのプログラミングへの影響」[15]および「Алгол 68 и его влияние」に記載されています。ありがとうございますСССР и России」。[16]
ALGOL 68 改訂委員会の一員であったSteve Bourneは、そのアイデアの一部をBourne シェル(および、Bashなどの後継Unix シェル) とC (および、 C++などの後継) に採用しました。
このプロジェクトの完全な歴史はCH Lindseyの「A History of ALGOL 68」に記載されています。[17] [18]
この言語の完全な解説については、Sian Mountbatten博士の「Programming ALGOL 68 Made Easy」[19] 、または改訂版レポートを含むMarcel van der Veerの 「Learning ALGOL 68 Genie」[20]を参照してください。
歴史
起源
ALGOL 68 は、その名前が示すように、1960 年に初めて公式化されたALGOL言語の後継です。同年、国際情報処理連盟(IFIP) は ALGOL ワーキング グループ (WG2.1) を結成し、開始しました。このグループは、1962 年 4 月にローマで更新された ALGOL 60 仕様を発表しました。1964 年 3 月のフォローアップ会議で、グループが 2 つの後継標準の作業を開始することが合意されました。1 つは、言語にいくつかの追加を加えて再定義するALGOL Xで、もう 1 つは言語LISPのスタイルで独自のプログラムを変更できるALGOL Yです。[21]
定義プロセス
ALGOL Xグループの最初の会議は1965年5月にプリンストン大学で開催されました。会議の報告書には、強力な型付けの導入と、コレクションを扱うためのオイラーの「ツリー」や「リスト」の概念への関心という2つの広く支持されたテーマが記されていました。[22]
10月にフランスで行われた第2回会議では、3つの正式な提案が発表された。ニクラウス・ヴィルトのALGOL WとCAR (トニー) ホーアによるレコード構造に関するコメント、ゲルハルト・ゼーグミュラーによる類似の言語、そしてアドリアーン・ファン・ウィンガーデンによる「形式言語の直交設計と記述」に関する論文である。後者は、ほとんど解読不能な「W文法」で書かれていたが、言語の進化において決定的な転換点となった。会議は、ファン・ウィンガーデンがヴィルト/ホーアの提案を自身のW文法で書き直すことで合意して終了した。[22]
この一見単純な作業は、結局予想以上に困難であることが判明し、フォローアップ会議は6か月延期された。1966年4月にクートゥイクで開かれた会議では、ファン・ウィンガーデンの草案は未完成のままで、ヴィルトとホーアはより伝統的な記述を用いたバージョンを提示した。彼らの論文は「間違った形式主義における正しい言語」であることが一般的に認められた。[23]これらのアプローチが検討されるにつれて、パラメータの記述方法に違いがあり、それが現実世界に影響を与えることが明らかになり、ヴィルトとホーアはこれ以上の遅延は際限がないかもしれないと抗議したが、委員会はファン・ウィンガーデンのバージョンを待つことにした。ヴィルトはその後、現在の定義をALGOL Wとして実装した。[24]
1966年10月にワルシャワで開催された次の会議では、[25]オークリッジ国立研究所とイリノイ大学で会合したがまだあまり進展がなかったI/O小委員会からの最初の報告があった。前回の会議の2つの提案が再び検討され、今度はポインタの使用について新たな議論が浮上した。ALGOL Wではポインタをレコードを参照するためだけに使用していたが、van Wijngaardenのバージョンでは任意のオブジェクトを指すことができた。さらに混乱を招いたのは、John McCarthyが演算子のオーバーロードとandまたは構造を連結する機能に関する新しい提案を提示し、Klaus Samelsonが匿名関数を許可したいと考えたことである。その結果生じた混乱の中で、全体の取り組みを放棄するという議論もあった。[24]混乱は、 1967年5月にザントフォールトで開催されるはずだったALGOL Y会議まで続いた。[22]
出版物
1968 年 2 月にようやく草案が発表された。この草案は「衝撃、恐怖、反対」に見舞われた[22]。その主な原因は、数百ページに及ぶ読みにくい文法と奇妙な用語だった。チャールズ H. リンゼイは「その中に隠された言語」を解明しようと試みた[26]。この作業には 6 人週の労力がかかった。その結果生まれた論文「ALGOL 68 の涙の少なさ」[27]は広く配布された。1968年 5 月にチューリッヒで開かれたより広範な情報処理会議では、出席者は言語が強制されていると不満を述べ、会議はほぼ非公開で正式なフィードバック メカニズムがなかったため、IFIP が「この不合理な状況の真の悪者」であると述べた。ヴィルトとピーター ナウアは、その時点で WG2.1 の執筆者としての地位を正式に辞任した[26]。
次の WG2.1 会議は 1968 年 6 月にティレニアで開催されました。当初はコンパイラのリリースやその他の問題について議論するはずでしたが、言語に関する議論に発展しました。van Wijngaarden は、レポートのもう 1 つのバージョンのみをリリースすると発言 (または脅迫) して応答しました。この時点で Naur、Hoare、Wirth は作業から離脱し、さらに数名が離脱すると脅迫していました。[28]その後、1968 年 8 月にノース バーウィック、12 月にミュンヘンで会議が開かれ、1969 年 1 月に公式レポートがリリースされましたが、議論の多い少数派レポートも作成されました。最終的に、 1969 年 9 月にアルバータ州バンフで、プロジェクトは概ね完了したとみなされ、議論は主に正誤表とレポートの大幅に拡張された序文について行われました。[29]
この取り組みには5年かかり、コンピュータサイエンスの巨匠の多くが疲弊し、定義とグループ全体の問題で行き詰まることも多かった。ホーアはすぐに「ALGOL 68の批評」を発表し[30] 、これは多くの著作で広く参照されている。ワースはALGOL Wのコンセプトをさらに発展させ、1970年にこれをPascalとして発表した。
実装
アルゴル68-R
1968年後半の報告書草案に基づくこの標準規格の最初の実装は、 1970年7月に英国の王立レーダー研究所によってALGOL 68-Rとして導入された。しかし、これは完全な言語のサブセットであり、報告書の最終編集者であるバリー・マイルーは「これは道徳の問題だ。私たちには聖書があるのに、あなたは罪を犯しているのだ!」と冗談を言った。[31]それでもこのバージョンはICLマシンで非常に人気となり、特に英国で軍事コーディングで広く使用される言語となった。[32]
68-R の変更点の 1 つに、すべての変数を最初に使用する前に宣言する必要があるという要件があります。これには、アクティベーション レコード内の変数用のスペースが使用される前に確保されるため、コンパイラが 1 パスで済むという大きな利点があります。ただし、この変更には、 PROCを 2 回宣言する必要があるという副作用もあります。1回は型の宣言として、もう 1 回はコード本体として宣言する必要があります。もう 1 つの変更点は、想定されるVOIDモード (他の言語ではステートメントと呼ばれます)が削除され、想定される場所にVOID という単語を追加する必要があることです。さらに、68-R では、 PARに基づく明示的な並列処理コマンドが削除されました。[31]
その他
この言語の最初の完全な実装は、1974年にCDCオランダによってControl Dataメインフレームシリーズ用に導入されました。これは限られた使用しかなく、主にドイツとオランダでの教育に使用されました。[32]
68-Rに似たバージョンは、1976年にカーネギーメロン大学から68Sとして導入されました。これもまた、オリジナルのさまざまな簡略化に基づいたワンパスコンパイラであり、DEC PDP-11などの小型マシンでの使用を目的としていました。これも主に教育目的で使用されました。[32]
IBMメインフレーム用のバージョンは、1978年にケンブリッジ大学からリリースされるまで利用できませんでした。これは「ほぼ完成」していました。リンジーは1984年にIBM PCを含む小型マシン用のバージョンをリリースしました。[32]
オープンソースのAlgol 68実装としては3つが知られている: [33]
- a68g、GPLv3、Marcel van der Veer によって書かれました。
- algol68toc は、ALGOL 68RSのオープンソース ソフトウェアポートです。
- Jose E. Marchesiによって書かれたGCC用の実験的なAlgol68フロントエンド。 [34]
タイムライン
- 「アルゴル 68 の短い歴史」
- ALGOL 68 – 第3世代ALGOL
アルゴリズム言語 ALGOL 68 レポートとワーキンググループメンバー
- 1968 年 3 月: アルゴリズム言語 ALGOL 68 に関する報告書草案[42] – 編集者: Adriaan van Wijngaarden、Barry J. Mailloux、John Peck、Cornelis HA Koster。
「ヴァン・ワインガーデンはかつて、4人の著者をやや冗談めかして次のように特徴づけた。コスター:変換者、ペック:構文作成者、マイルー:実装者、ヴァン・ワインガーデン:党思想家。」 – コスター。
- 1968年10月:アルゴリズム言語ALGOL 68に関する最終から2番目のドラフトレポート — 第1章-第9章[43]第10章-第12章[44] — 編集者: A. van Wijngaarden、BJ Mailloux、JEL Peck、CHA Koster。
- 1968 年 12 月: アルゴリズム言語 ALGOL 68 に関するレポート — Numericsche Mathematik、14、79-218 (1969) からの抜粋。スプリンガー・フェルラーク。[45] — 編集者: A. van Wijngaarden、BJ Mailloux、JEL Peck、CHA Koster。
- 1970 年 3 月: 少数意見報告書、ALGOL Bulletin AB31.1.1 — Edsger Dijkstra、Fraser Duncan、Jan Garwick 、 Tony Hoare、 Brian Randell、Gerhard Seegmüller、Wlad Turski、および Mike Woodgerが署名。
- 1973 年 9 月: アルゴリズム言語 Algol 68 に関する改訂報告書 — Springer-Verlag 1976 [46] — 編集者: A. van Wijngaarden、B. Mailloux、J. Peck、K. Koster、Michel Sintzoff、Charles H. Lindsey、Lambert Meertensそしてリチャード・G・フィスカー。
- ALGOL 68 の設計に積極的な他の WG 2.1 メンバー: [18] フリードリヒ L. バウアー• ハンス ベキッチ • ゲルハルト グース • ピーター ジラヒー インガーマン •ピーター ランディン•ジョンマッカーシー • ジャック マーナー •ピーター ナウル• マンフレッド ポール •ウィレム ファン デル ポール•ダグ ロス•クラウス・ザメルソン•ニクラス・ヴィルト•米田信夫。
標準化のタイムライン
1968年:1968年12月20日、「最終報告書」(MR 101)が作業部会で採択され、その後ユネスコのIFIP総会で出版が承認されました。この規格はロシア語、ドイツ語、フランス語、ブルガリア語に翻訳され、その後日本語と中国語にも翻訳されました。[47]この規格は点字でも利用可能になりました。
1984年: TC 97はALGOL 68を「新規作業項目」TC97/N1642 [2][3]として標準化することを検討した。西ドイツ、ベルギー、オランダ、ソ連、チェコスロバキアは標準の準備に参加する意向があったが、ソ連とチェコスロバキアは「適切なISO委員会の適切なメンバーではなかった」[4]ため、ALGOL 68のISO標準化は行き詰まった[5]。
1988 年: その後、ALGOL 68 はロシアの GOST規格の 1 つになりました。
- GOST 27974-88 プログラミング言語 ALGOL 68 — Язык программирования АЛГОЛ 68 [48]
- GOST 27975-88 プログラミング言語 ALGOL 68 拡張 — Язык программирования АЛГОЛ 68 раслиренный [49]
注目すべき言語要素
太字の記号と予約語
標準言語には約 60 個の予約語が含まれており、通常は印刷時に太字で表示されます。また、一部の予約語には「簡易記号」が使用されています。
MODE、OP、PRIO、PROC、 FLEX、HEAP、LOC、LONG、REF、SHORT、 BITS、BOOL、BYTES、CHAR、COMPL、INT、REAL、SEMA、STRING、VOID、 CHANNEL、FILE、FORMAT、STRUCT、UNION、 AT "@"、EITHER r0、IS ":=:"、ISNT IS NOT r0 ":/=:" ":≠:"、OF "→" r0、TRUE、FALSE、EMPTY、NIL "○"、SKIP "~"、 CO "¢"、COMMENT "¢"、PR、PRAGMAT、 CASE ~ IN ~ OUSE ~ IN ~ OUT ~ ESAC "( ~ | ~ |: ~ | ~ )"、 FOR ~ FROM ~ TO ~ BY ~ WHILE ~ DO ~ OD、 IF ~ THEN ~ ELIF ~ THEN ~ ELSE ~ FI "( ~ | ~ |: ~ | ~ | ~ )"、 PAR BEGIN ~ END "( ~ )"、GO TO、GOTO、EXIT "□" r0。
単位: 式
言語の基本構成要素はユニットです。ユニットは、数式、囲み節、ルーチン テキスト、または技術的に必要ないくつかの構成要素 (割り当て、ジャンプ、スキップ、無) のいずれかです。囲み節という専門用語は、他の現代の言語でブロック、do ステートメント、switch ステートメントとして知られる、本質的に括弧で囲まれた構成要素の一部を統合します。キーワードを使用する場合、一般に、導入キーワードの逆の文字列が囲みを終了するために使用されます (例: ( IF ~ THEN ~ ELSE ~ FI、CASE ~ IN ~ OUT ~ ESAC、FOR ~ WHILE ~ DO ~ OD ))。このガード コマンド構文は、一般的なUnix Bourne シェルでStephen Bourneによって再利用されました。式は、付随節によって他の値から構築された複数の値を生成することもできます。この構成要素は、プロシージャ呼び出しのパラメーター パックのように見えます。
モード: 宣言
基本的なデータ型( modeAlgol 68 の用語では と呼ばれます) は、、real(複素数)、、、およびです。例:
intcomplboolcharbitsbytes
INT n = 2; CO n は定数 2 に固定されます。CO INT m := 3; CO m は新しく作成されたローカル変数で、その値は最初に 3 に設定されます。 CO COこれはref int m = loc int := 3 の略です。 CO REAL avogadro = 6.0221415⏨23; CO Avogadro 数CO long long real long long pi = 3.14159 26535 89793 23846 26433 83279 50288 41971 69399 37510; COMPLマイナス 1 の平方根 = 0 ⊥ 1;
ただし、宣言は のREAL x;単なる構文糖です。つまり、 は実際には、新しく生成されたローカルREAL変数への参照の定数識別子です。
REF REAL x = LOC REAL;x
floatさらに、とdouble、またはとint、longおよびなどの両方を定義する代わりにshort、ALGOL 68 では修飾子が提供されるため、現在一般的な は、たとえばLONG REALまたはLONG LONG REALdoubleと記述されます。プレリュード定数および は、プログラムをさまざまな実装に適応させるために提供されています。
max realmin long int
すべての変数は宣言する必要がありますが、最初の使用の前に宣言する必要はありません。
プリミティブ宣言子: INT、REAL、COMPL、COMPLEX G、BOOL、CHAR、STRING、BITS、BYTES、FORMAT、FILE、PIPE G、CHANNEL、SEMA
- BITS – BOOLの「パックされたベクター」。
- BYTES – CHARの「パックされたベクター」。
- STRING – CHARの柔軟な配列。
- SEMA – OP erator LEVELで初期化できるSEMAフォア。
さまざまな型コンストラクタを使用して、単純な型から複雑な型を作成できます。
- REF mode – C/C++の&やPascalのREFに似た、mode型の値への参照
- STRUCT – C/C++のSTRUCTやPascalのRECORDのような構造体を構築するために使用されます。
- UNION – C/C++やPascalのような共用体を構築するのに使われる
- PROC – C/C++ の関数や Pascal のプロシージャ/関数などのプロシージャを指定するために使用されます。
いくつかの例については、「ALGOL 68 と C++ の比較」を参照してください。
その他の宣言シンボルには、 FLEX、HEAP、LOC、REF、LONG、SHORT、EVENT Sなどがあります。
- FLEX – 配列が柔軟であることを宣言します。つまり、必要に応じて配列の長さを拡張できます。
- HEAP – グローバル ヒープから変数に空き領域を割り当てます。
- LOC – 変数にローカル スタックの空き領域を割り当てます。
- LONG – INT、REAL、またはCOMPL をLONG のサイズとして宣言します。
- SHORT – INT、REAL、またはCOMPL をより短いサイズとして宣言します。
モード (型) の名前は、C/C++ のTYPEDEFや Pascal のTYPEに似たMODE宣言を使用して宣言できます。
INT max=99;
MODE newmode = [0:9][0:max] STRUCT (
LONG REAL a, b, c, SHORT INT i, j, k, REF REAL r
);
これは次の C コードに似ています。
const int max = 99 ; typedef struct { double a , b , c ; short i , j , k ; float * r ; } newmode [ 9 + 1 ][ max + 1 ];
ALGOL 68 の場合、NEWMODEモード表示のみが等号の左側に表示され、最も重要な点は、優先順位に関係なく左から右に構築され、読み取ることができることです。また、 Algol 68 配列の下限はデフォルトでは 1 ですが、- max intからmax intまでの任意の整数にすることができます。
モード宣言により、型を再帰的に定義できます。つまり、型自体を直接または間接的に定義できます。これにはいくつかの制限があります。たとえば、次の宣言は無効です。
モード A = REF A モード A = STRUCT ( A a, B b) モード A = PROC ( A a) A
これらは有効です:
モード A =構造体( REF A a, B b) モード A = PROC ( REF A a) REF A
強制:キャスト
強制は、強制を適用する前の強制の事前モード、それらの強制後に必要な強制の事後モード、および強制の構文上の位置または「種類」という 3 つの基準に従って、強制対象から強制対象を生成します。強制はカスケードできます。
6 つの可能な強制は、 deproceduring、dereferencing、uniting、widening、rowing、およびvoidingと呼ばれます。 unitingを除く各強制は、関連付けられた値に対して対応する動的な効果を規定します。したがって、多くの基本的なアクションは、強制によって暗黙的にプログラムできます。
コンテキストの強さ – 許可される強制:
- ソフト – 手続き解除
- 弱い – 逆参照または逆手続き、名前を生成する
- meek – 逆参照または逆手続き
- 堅固 – 柔和、そして団結
- 強い – 固い、続いて広がる、漕ぐ、または空になる
強制階層の例
ALGOL 68 には、プログラムの特定の時点で使用できる強制の種類を決定するコンテキストの階層があります。これらのコンテキストは次のとおりです。
プライマリ、セカンダリ、ターシャリ、クォータナリの詳細については、演算子の優先順位を参照してください。
pr & co: プラグマットとコメント
プラグマットはプログラム内の 指示であり、通常はコンパイラへのヒントです。新しい言語では、これらは「プラグマ」(「t」なし)と呼ばれます。例:
プラグマットヒープ=32プラグマット PRヒープ=32 PR
コメントはさまざまな方法で挿入できます。
¢ プログラムにあなたの意見を付け加えるオリジナルの方法 ¢ COMMENT "bold" comment COMMENT COスタイル i comment CO # スタイル ii コメント # £ これはイギリスのキーボードのハッシュ/ポンドコメントです。£
通常、ALGOL 68 ではコメントをネストすることはできません。この制限は、異なるコメント区切り文字を使用することで回避できます (たとえば、一時的なコード削除にはハッシュのみを使用します)。
式と複合文
ALGOL 68 は式指向プログラミング言語であるため、代入文によって返される値は宛先への参照です。したがって、次のコードは有効な ALGOL 68 コードです。
REAL半円周率、1円周率; 1円周率 := 2 * ( 半円周率 := 2 * arc tan(1) )
この概念は、 CやPerlなどに存在します。Algol 60やFORTRANなどの以前の言語と同様に、識別子にスペースが許可されているため、単一のhalf pi識別子になります(したがって、アンダースコアとキャメルケースとすべて小文字の問題を回避できます)。
別の例として、i=1 から n までの合計という数学的な概念を表現するにはf(i)、次の ALGOL 68整数式で十分です。
( INT合計 := 0; FOR i TO n DO合計 +:= f(i) OD ; 合計)
前述のコード ブロックは整数式であるため、整数値を使用できるあらゆるコンテキストで使用できることに注意してください。コード ブロックは、最後に評価した式の値を返します。この考え方は、他の言語の中でも Lispに存在します。
複合文はすべて、特徴的な閉じ括弧で終了します。
- IF選択節:
IF条件THEN文[ ELSE文] FI 「簡潔な」形式: ( 条件 | ステートメント | ステートメント )
IF条件1 THEN文ELIF条件2 THEN文 [ ELSE文 ] FI 「簡潔な」形式: ( 条件1 | ステートメント |: 条件2 | ステートメント | ステートメント )
この方式は、ぶら下がっている else の問題を回避するだけでなく、埋め込みステートメントBEGINシーケンスでand を使用する必要も回避します。
END
- CASE選択句:
CASEスイッチIN文、文、... [ OUT文 ] ESAC 「簡潔な」形式: ( switch | ステートメント、ステートメント、... | ステートメント )
CASE switch1 INステートメント、ステートメント、... OUSE switch2 INステートメント、ステートメント、... [ OUTステートメント ] ESAC CASEステートメント の「簡潔な」形式: ( switch1 | ステートメント、ステートメント、... |: switch2 | ステートメント、ステートメント、... | ステートメント )
簡潔な記号を使用した選択節の例:
PROC月の日数 = ( INT年, 月) INT :
(月|
31,
(年÷×4=0 ∧ 年÷×100≠0 ∨ 年÷×400=0 | 29 | 28 )、
31、30、31、30、31、31、30、31、30、31
);
太字記号を使用した選択節の例:
PROC月の日数 = ( INT年, 月) INT :
CASE月IN
31,
年MOD 4 EQ 0かつ年MOD 100 NE 0 または 年MOD 400 EQ 0の場合29 ELSE 28 FI、
31、30、31、30、31、31、30、31、30、31
ESAC ;
太字と簡潔な記号を組み合わせた選択節の例:
PROC月の日数 = ( INT年, 月) INT : CASE月IN ¢1月¢ 31、 ¢2月¢ ( 年MOD 4 = 0かつ年MOD 100 ≠ 0 または 年MOD 400 = 0 | 29 | 28 )、 ¢3月¢ 31、30、31、30、31、31、30、31、30、31 ¢ から 12月¢ ESAC ;
Algol68 では、スイッチをINT型 または(一意に) UNION 型のいずれかにすることができます。後者では、 UNION変数に強い型付けを強制できます。たとえば、以下の union を参照してください。
- doループ句:
[ FORインデックス ] [ FROM最初 ] [ BY増分 ] [ TO最後 ] [ WHILE条件 ] DO文OD 「ループ句」の最小形式は次のようになります。DO文OD
これは「ユニバーサル」ループと見なされ、完全な構文は次のとおりです。
iが1から-22まで、 i×i≠4444で-333までの場合DO ~ OD
この構造には、いくつかの珍しい側面があります。
- DO ~ OD部分のみが必須であり、その場合、ループは無限に繰り返されます。
- したがって、句TO 100 DO ~ OD は100 回だけ繰り返されます。
- WHILE 「構文要素」により、プログラマーはFORループを早期に終了できるようになりました。例:
INT合計 sq:=0;
FOR i
WHILE
print(("これまでのところ:",i,newline));
合計平方≠70↑2
する
合計sq+:=i↑2
外径
標準 Algol68 のその後の「拡張」により、TO構文要素をUPTOとDOWNTOに置き換えて、小さな最適化を実現できるようになりました。同じコンパイラには、次の機能も組み込まれています。
- UNTIL (C) – ループの遅延終了用。
- FOREACH (S) – 配列を並列に処理します。
さらに詳しい例については、以下のコード例をご覧ください。
struct、union & [:]: 構造体、共用体、配列
ALGOL 68 は任意の次元数の配列をサポートし、行または列の全体または一部を スライスすることができます。
MODE VECTOR = [1:3] REAL ; # ベクトルMODE宣言 (typedef) # MODE MATRIX = [1:3,1:3] REAL ; # 行列MODE宣言 (typedef) # VECTOR v1 := (1,2,3); # 配列変数最初は (1,2,3) # [] REAL v2 = (4,5,6); # 定数配列、型はVECTORと同等、境界は暗黙的に指定 # OP + = ( VECTOR a,b) VECTOR : # バイナリOP演算子定義 # ( VECTOR out; FOR i FROM ⌊a TO ⌈a DO out[i] := a[i]+b[i] OD ; out); MATRIX m := (v1, v2, v1+v2); print ((m[,2:])); # 2列目と3列目のスライス #
行列はどちらの方法でもスライスできます。例:
REF VECTOR row = m[2,]; # 2行目へのREF (ポインタ)を定義します # REF VECTOR col = m[,2]; # 2列目へのREF (ポインタ)を定義します #
ALGOL 68 は、複数のフィールド構造 ( STRUCT ) と統合モードをサポートしています。参照変数は、配列スライスや構造体フィールドを含む 任意のMODEを指すことができます。
これらすべての例として、従来のリンク リスト宣言を次に示します。
MODE NODE = UNION ( VOID、REAL、INT、COMPL、STRING )、
LIST = STRUCT ( NODE val 、REF LIST next )。
NODEのUNION CASEの使用例:
proc: 手順
プロシージャ ( PROC ) 宣言では、パラメータと結果 (ない場合はVOID ) の両方の型指定が必要です。
PROC実数の最大値 = ( REAL a, b) REAL :
IF a > b THEN a ELSE b FI ;
または、条件文の「簡潔な」形式を使用します。
PROC実数の最大値 = ( REAL a, b) REAL : (a>b | a | b);
a の戻り値はproc、プロシージャ内で最後に評価された式の値です。プロシージャへの参照 ( ref proc ) も許可されます。参照呼び出しパラメータは、仮引数リストで参照 ( などref real) を指定することによって提供されます。次の例では、配列の各要素に関数 (パラメータとして指定) を適用するプロシージャを定義します。
PROC適用 = ( REF [] REAL a、PROC ( REAL ) REAL f ):
iがLWB aから UPB aへDO a[i] := f(a[i]) OD
このコードのシンプルさは、ALGOL 68 の前身であるALGOL 60では実現できませんでした。
op: 演算子
プログラマーは新しい演算子を定義することができ、それらの演算子と定義済みの演算子の両方をオーバーロードしたり、優先順位を変更したりできます。次の例では、2 項バージョンと 1 項バージョンの両方で演算子を定義しますMAX(配列の要素をスキャンします)。
優先 順位最大値= 9;
OP MAX = ( INT a,b) INT : ( a>b | a | b );
OP MAX = ( REAL a,b) REAL : ( a>b | a | b );
OP MAX = ( COMPL a,b) COMPL : ( ABS a > ABS b | a | b );
OP MAX = ([] REAL a) REAL :
( REAL out := a[ LWB a];
FOR i FROM LWB a + 1 TO UPB a DO ( a[i]>out | out:=a[i] ) OD ;
外)
配列、プロシージャ、逆参照、強制変換操作
これらは技術的には演算子ではなく、「名前に関連付けられた単位」と見なされます。
モナド演算子
関連する優先順位を持つ二項演算子
具体的な詳細:
- 三次変数にはNILと○という名前が含まれます。
- LWS : Algol68 r0では、配列の次元の下位の状態が固定されている場合、演算子LWSと ⎩ ... は両方ともTRUEを返します。
- UPS演算子と ⎧ 演算子は上位状態では類似しています。
- LWBおよびUPB演算子は、異なる順序(およびモード)の配列のUNIONで自動的に使用できます。例:
union([]int, [,]real, flex[,,,]char)
割り当てと同一関係など
これらは技術的には演算子ではなく、「名前に関連付けられた単位」と見なされます。
注: 四項式にはSKIPおよび ~ という名前が含まれます。
:=:(またはIS ) は 2 つのポインタが等しいかどうかをテストします。(またはISNT ) は 2 つのポインタが等しくないかどうかをテストします。
:/=:
なぜ:=:とが:/=:必要なのか
整数へのポインタとして宣言された次の変数のような 2 つのポインタ値を比較してみることを検討してください。
REF INT ip, jp
ここで、これら2つが同じ場所を指しているかどうか、またはどちらかがNILを指しているかどうかを判断する方法を考えてみましょう。次の式
ip = jp
両方のポインタをINT型の値に逆参照し、それらを比較します。これは、=演算子がINTに対して定義されているが、REF INTに対しては定義されていないためです。 REF INT 型とINT型のオペランドに同時に= を定義することは不正です。適用できる暗黙的な強制により、呼び出しがあいまいになるためです。オペランドをREF INTのままにして、そのバージョンの演算子を呼び出す必要がありますか? または、さらにINTに逆参照して、代わりにそのバージョンを使用する必要がありますか? したがって、次の式は決して有効になりません。
ip = NIL
したがって、オペランドから演算子への通常の強制ルールに従わない別の構造が必要になります。しかし、落とし穴があります。次の式:
ip :=: jpip :=: NIL
は合法ではあるが、期待どおりには動作しない可能性が高い。これらは常にFALSE を返す。なぜなら、変数とが指すアドレスではなく、実際のアドレスを比較しているからである。正しい効果を得るには、次のように書く必要がある。
ipjp
ip :=: REF INT(jp)ip :=: REF INT(NIL)
特殊文字

APL シンボル付きIBM 2741キーボード
Algol の「特殊」文字 (⊂、≡、␣、×、÷、≤、≥、≠、¬、⊃、≡、∨、∧、→、↓、↑、⌊、⌈、⎩、⎧、⊥、⏨、¢、○、□) のほとんどは、APL 「ゴルフボール」プリントヘッドが挿入されたIBM 2741キーボードにあります。これらは、ALGOL 68 が起草されていた 1960 年代半ばに利用可能になりました。これらの文字はUnicode標準の一部でもあり、そのほとんどはいくつかの一般的なフォントで利用できます。
トランスプット: 入力と出力
トランスプットは、ALGOL 68 の入出力機能を指す用語です。これには、フォーマットされていない、フォーマットされた、およびバイナリのトランスプット用の定義済みプロシージャが含まれます。ファイルおよびその他のトランスプット デバイスは、一貫性があり、マシンに依存しない方法で処理されます。次の例では、フォーマットされていない出力を標準出力デバイスに出力します。
print ((newpage, "タイトル", newline, "i の値は ",
i, "そしてx[i]は ", x[i], 改行))
事前定義された手順newpageとnewline引数として渡される手順に注意してください。
書籍、チャンネル、ファイル
TRANSPUTは、BOOKS、CHANNELS、およびFILESから構成されると考えられます。
- 書籍はページ、行、文字で構成されており、ファイルによってバックアップされる場合があります。
- を呼び出すと、特定の書籍を名前で見つけることができます
match。
- を呼び出すと、特定の書籍を名前で見つけることができます
- CHANNELは、カードパンチやプリンターなどの物理デバイスに対応します。
- スタンドインチャネル、スタンドアウトチャネル、スタンドバックチャネルの 3 つの標準チャネルが区別されます。
- FILEは、何らかのチャネルを介して開かれたブックとプログラムの間で通信する手段です。
- ファイルの MOOD は、読み取り、書き込み、char、bin、およびオープンが可能です。
- トランスプット手順には次のものが含まれます
establish, create, open, associate, lock, close, scratch。 - ポジションに関するお問い合わせ:
char number, line number, page number. - レイアウト ルーチンには次のものが含まれます。
space、、、。backspacenewlinenewpageget good line, get good page, get good book、 そしてPROC set=(REF FILE f, INT page,line,char)VOID:
- ファイルにはイベント ルーチンがあります。例
on logical file end, on physical file end, on page end, on line end, on format end, on value error, on char error:
フォーマットされた転送
ALGOL 68のトランスプットにおける「フォーマットされたトランスプット」には独自の構文とパターン(関数)があり、FORMATが2つの$文字の間に埋め込まれています。[50]
例:
printf (($2l"合計は:"x, g(0)$, m + n)); ¢ は以下と同じものを出力します: ¢ print ((新しい行、新しい行、「合計は:」、スペース、整数 (m + n、0))
par: 並列処理
ALGOL 68 は並列処理のプログラミングをサポートしています。キーワードPAR を使用すると、副次節が並列節に変換され、アクションの同期はセマフォを使用して制御されます。A68G では、ホストオペレーティング システムで利用可能な場合、並列アクションはスレッドにマップされます。A68S では、並列処理の異なるパラダイムが実装されました (以下を参照)。
PROC
eat = VOID : ( muffins-:=1; print(("Yum!",new line))),
話す = VOID : ( words-:=1; print(("Yak...",新しい行)));
INTマフィン := 4、単語 := 8;
SEMA口 =レベル1;
PAR BEGIN
WHILEマフィン > 0口を下に向けます
。
食べる;
UP口
OD、
WHILE単語 > 0 DO口
DOWN ;
話す;
上口OD
端
その他
ALGOL 68 は技術的に複雑なため、何かの存在を否定するためのさまざまな方法を必要とします。
SKIP、"~" または "?" C – 常に構文的に有効な未定義の値、 EMPTY – VOIDに許容される唯一の値、UNIONでVOID を選択するために必要な値、 VOID – 構文的にはMODEに似ていますが、 MODE ではありません、 NILまたは "○" – 何も示さない、指定されていない参照モードの名前、 () または具体的には [1:0] INT –真空は空の配列です (ここでは具体的にはMODE [] INT )。 undefined – 標準レポート プロシージャはランタイム システムで例外を発生させます。 ℵ – 標準レポートで特定のタイプのイントロスペクションを禁止するために使用されます。例: SEMA
NIL IS varという用語は、どの変数に対しても常にTRUEと評価されます (ただし、 IS :/=: の正しい使用法については上記を参照してください)。一方、比較x < SKIP が任意の整数xに対してどの値に評価されるか は不明です。
ALGOL 68 では、整数オーバーフローの場合に何が起こるか、整数ビット表現、および浮動小数点の数値精度の程度が意図的に未定義のままになっています。
どちらの公式レポートにも、標準言語には含まれていない高度な機能がいくつか含まれていました。これらは ℵ で示され、事実上非公開とみなされていました。例としては、テンプレートの「≮」と「≯」、 大まかなダックタイピングのOUTTYPE / INTYPE、ネストされた配列や構造を「まっすぐにする」ための STRAIGHTOUT演算子とSTRAIGHTIN演算子などがあります。
使用例
コードサンプル
このサンプル プログラムは、エラトステネスのふるいを実装して、 100 未満の素数をすべて見つけます。NILは、他の言語のnull ポインターの ALGOL 68 版です。表記法x OF y は、 STRUCT yのメンバーxにアクセスします。
BEGIN # Algol-68 素数ふるい、関数型スタイル #
PROCエラー = ( STRING s) VOID :
(print(( newline, " error: ", s, newline)); GOTO stop);
PROC one to = ( INT n) LIST :
( PROC f = ( INT m,n) LIST : (m>n | NIL | cons(m, f(m+1,n))); f(1,n));
MODE LIST = REF NODE ;
MODE NODE = STRUCT ( INT h, LIST t);
PROC cons = ( INT n, LIST l) LIST : HEAP NODE := (n,l);
PROC hd = ( LIST l) INT : ( l IS NIL | error("hd NIL "); SKIP | h OF l);
PROC tl = ( LIST l) LIST : ( l IS NIL | error("tl NIL "); SKIP | t OF l);
PROC show = ( LIST l) VOID : ( l ISNT NIL | print((" ",whole(hd(l),0))); show(tl(l)));
PROC filter = ( PROC ( INT ) BOOL p, LIST l) LIST :
IF l IS NIL THEN NIL
ELIF p(hd(l)) THEN cons(hd(l), filter(p,tl(l)))
ELSE filter(p, tl(l))
FI ;
PROC sieve = ( LIST l) LIST :
IF l IS NIL THEN NIL
ELSE
PROC not multiple = ( INT n) BOOL : n MOD hd(l) ~= 0;
cons(hd(l), sieve( filter( 複数ではない, tl(l) )))
FI ;
PROC primes = ( INT n) LIST : sieve( tl( one to(n) ));
表示(素数(100))
終わり
ALGOL 68 で書かれたオペレーティングシステム
- ケンブリッジCAPコンピュータ- オペレーティングシステムを構成するすべての手順はALGOL 68Cで書かれていますが、ページネーターなどの他のいくつかの密接に関連する保護された手順はBCPLで書かれています。[51]
- エルドン3 –リーズ大学でICL 1900用に開発され、 ALGOL 68-Rで書かれていた。[52]
- フレックスマシン- ハードウェアはカスタムかつマイクロプログラム可能で、オペレーティングシステム、(モジュール式)コンパイラ、エディタ、ガベージコレクタ、ファイリングシステムはすべてALGOL 68RSで記述されていました。コマンドシェルCurt [53]は、 Algol-68モードに似た型付きデータにアクセスするように設計されていました。
- VME – S3 は、オペレーティング システムVMEの実装言語でした。S3 は ALGOL 68 に基づいていますが、データ型と演算子はICL 2900 シリーズで提供されているものと一致しています。
注: ソビエト時代のコンピュータЭльбрус-1 (Elbrus-1)と Эльбрус-2 は、従来のアセンブリ言語ではなく、高級言語 Эль-76 (AL-76) を使用して作成されました。Эль-76 は Algol-68 に似ていますが、主な違いは、Эль-76 ではハードウェア レベルで動的バインディング タイプがサポートされていることです。Эль-76 は、アプリケーション、ジョブ制御、システム プログラミングに使用されます。[54]
アプリケーション
ALGOL 68CとALGOL 68-RはどちらもALGOL 68 で記述されており、実質的に ALGOL 68 自体がアプリケーションになっています。その他のアプリケーションには次のものがあります。
- ELLA – ハードウェア記述言語およびサポート ツールセット。1980年代から 1990 年代にかけて、英国王立信号・レーダー研究所によって開発されました。
- RAF 攻撃指揮システム – 「... 3人年の作業で、エラーのないALGOL 68-RTコード400Kが生成されました...」 [55]
ライブラリとAPI
- NAG 数値ライブラリ–数値解析ルーチンのソフトウェア ライブラリ。1980 年代に ALGOL 68 で提供されました。
- TORRIX – SG van der MeulenとM. Veldhorstによる、任意の体上および可変サイズのベクトルと行列の演算のためのプログラミングシステム。[56]
プログラムの表現
ALGOL 68 の特徴は、ALGOL の伝統から受け継がれたさまざまな表現です。印刷物でアルゴリズムを記述するために使用される表現言語、厳密な言語(レポートで厳密に定義)、およびコンパイラ入力で使用することを目的とした公式の参照言語があります。例には太字の書体で書かれた単語が含まれていますが、これはSTRICT言語です。ALGOL 68 の予約語は、事実上、識別子とは異なる名前空間にあり、識別子ではスペースが許可されているため、次のフラグメントは有効です。
INT実数 int = 3 ;
実行可能コードを書くプログラマーは、ハードウェアや文化的な問題に依存する可能性があるため、コード内で太字の書体や下線を常に選択できるわけではありません。これらの識別子を示すためのさまざまな方法が考案されています。これは、ストロッピング方式と呼ばれます。たとえば、次のすべてまたは一部がプログラミング表現として使用できます。
INT実数 int = 3; # STRICT言語 # 'INT'A REAL INT = 3; # QUOTE ストロッピングスタイル # .INT A REAL INT = 3; # POINTストロッピングスタイル # INT a real int = 3; # UPPER ストロッピングスタイル # int a_real_int = 3; # RES ストロッピングスタイル、受け入れられる予約語は 61 個あります #
すべての実装は、PRAGMATセクション内で少なくともPOINT、UPPER、RESを認識する必要があります。これらのうち、POINTとUPPERのストロッピングは非常に一般的ですが、RESのストロッピングは仕様に矛盾しています(予約語がないため)。QUOTE(単一アポストロフィ引用符)は元々の推奨事項でしたが、ALGOL 60で一般的だった一致したアポストロフィ引用符はALGOL 68ではあまり使用されていません。[57]
以下の文字は移植性のために推奨されており、 Wayback Machineに 2014-01-02 にアーカイブされた Algol 68 の標準ハードウェア表現に関するレポートで「価値のある文字」と呼ばれています。
- ^価値のある文字: ABCDEFGHIJKLM
NOPQRSTUVWXYZ 0123456789 "#$%'()*+,-./:;<=>@[ ]_|
これは、1960 年代にハードウェアの一部が小文字やその他の非ASCII文字をサポートしていなかった問題を反映したもので、実際、1973 年のレポートには次のように書かれています。「名目上は同じ文字セットを使用しているインストールであっても、4 つの重要な文字 (「|」、「_」、「[」、および「]」) は、異なる方法でコード化されることがよくあります。」
- 基本文字: 「価値のある文字」は「基本文字」のサブセットです。
さまざまなプログラム表現の例
ALGOL 68 では、すべての自然言語で独自のキーワード セットを定義できます (Algol-68)。その結果、プログラマーは母国語のキーワードを使用してプログラムを作成できます。以下は、「翌日」を計算する簡単な手順の例です。コードは英語とドイツ語の 2 つの言語で書かれています。[引用が必要]
# 翌日の日付 - 英語版 #
MODE DATE = STRUCT ( INT day, STRING month, INT year);
PROC翌日 = ( DATE x) DATE :
IF day OF x < 月の長さ (month OF x, year OF x)
THEN (day OF x + 1, month OF x, year OF x)
ELIF month OF x = "December"
THEN (1, "January", year OF x + 1)
ELSE (1, successor of month (month OF x), year OF x)
FI ;
# Nachfolgetag - Deutsche Variante #
MENGE DATUM = TUPEL ( GANZタグ、WORT monat、GANZ jahr);
FUNKTION naechster tag nach = ( DATUM x) DATUM :
WENN tag VON x < monatslaenge(monat VON x, jahr VON x)
DANN (tag VON x + 1, monat VON x, jahr VON x)
WENNABER monat VON x = "Dezember"
ダン(1、「1 月」、ジャールVON x + 1)
アンソンステン(1, nachfolgemonat(monat VON x), jahr VON x)
エンデウェン;
ロシア語/ソビエトの例: 英語では Algol68 の case ステートメントはCASE ~ IN ~ OUT ~ ESACと読みますが、キリル文字ではвыб ~ в ~ либо ~ бывと読みます。
改訂
特に注記がある場合(上付き文字)を除き、上記の文言は「改訂報告書(r1)」の文言です。
修正前の報告書の言語
元の言語 (「最終報告書」 r0による) は、モード キャストの構文が異なり、手続き、つまり項の値を項を評価する手続きに強制する機能がありました。手続きは、評価を遅延させることを目的としています。最も有用なアプリケーションは、ブール演算子の短絡評価であった可能性があります。
OP ANDF = ( BOOL a, PROC BOOL b) BOOL :(a | b | FALSE ); OP ORF = ( BOOL a, PROC BOOL b) BOOL :(a | TRUE | b);
b はaが真の場合にのみ評価されます。
ALGOL 68 で定義されているように、次のコードでは期待どおりに動作しませんでした。
IF FALSE ANDF CO proc bool: CO ( print ("実行すべきではありません"); TRUE )
THEN ...
プログラマーの素朴な期待に反して、ANDFの後に処理された詳細な囲み句の値のみであるため、print が実行されます。コメントアウトされたPROC BOOL : をテキストで挿入すると、これが機能します。
一部の実装では、言語の拡張によってこの特殊なケースの予想される動作をエミュレートします。
改訂前は、プログラマーは、コンマ (ゴマ)の代わりにセミコロンを使用することで、プロシージャの引数を並列ではなく直列に評価するように決定できました。
たとえば次のとおりです。
PROCテスト = ( REAL a; REAL b) :... ... (x PLUS 1, x) をテストします。
test の最初の引数は 2 番目の引数より前に評価されることが保証されていますが、通常は次のようになります。
PROCテスト = ( REAL a, b) :... ... (x PLUS 1, x) をテストします。
そうすれば、コンパイラは任意の順序で引数を評価できるようになります。
IFIP WG 2.1からの拡張提案
報告書の改訂後、適用範囲を広げるために言語の拡張がいくつか提案されました。
- 部分パラメータ化(別名カリー化):呼び出し時にすべてのパラメータではなく一部のパラメータを指定して(より少ないパラメータで)関数を作成する。例えば、底と引数の2つのパラメータを持つ関数対数は、自然対数、2進対数、または10進対数に特化できる。[58]
- モジュール拡張:外部リンクをサポートするために、 ALGOL 68-Rの機能のより強力なバージョンであるボトムアップ定義モジュールと、 ALGOL 68Cのおよび句に似たトップダウンホールの2つのメカニズムが提案されました[59]
ENVIRONUSING - モードパラメータ: 限定的なパラメトリック多態性の実装用(リスト、ツリー、その他のデータコンテナなどのデータ構造に対するほとんどの操作は、ペイロードに触れることなく指定できます)。[60]
これまでのところ、Algol 68 Genie では部分的なパラメータ化のみが実装されています。
真のALGOL 68s仕様と実装タイムライン
ICL VMEオペレーティング システムやICL 2900 シリーズの他の多くのシステム ソフトウェアの作成に使用されたS3 言語は、Algol 68 から直接派生したものです。ただし、より複雑な機能の多くは省略され、基本モードは 2900 シリーズのハードウェア アーキテクチャに直接マップされるデータ タイプのセットに置き換えられました。
実装固有の拡張
RREの ALGOL 68R は、 ICL 1900で実行される最初の ALGOL 68 サブセット実装でした。元の言語に基づいて、サブセットの主な制限は、使用前に定義することと並列処理ができないことでした。このコンパイラは、 1970 年代に英国の大学で人気があり、多くのコンピューター サイエンスの学生が最初のプログラミング言語として ALGOL 68 を学びました。このコンパイラは、エラー メッセージがわかりやすいことで有名でした。
RSREのALGOL 68RS (RS)は、ALGOL 68RS (ALGOL 68R からブートストラップ) で記述されたポータブル コンパイラ システムであり、ICL 2900 / Series 39、Multics、DEC VAX/VMSなどのさまざまなシステムに実装されています。この言語は Revised Report に基づいていますが、ALGOL 68R と同様のサブセット制限があります。このコンパイラは、Algol68 から C へのコンパイラの形で存続しています。
カーネギーメロン大学のALGOL 68S (S)では、直交拡張機能であるイベントを追加することで並列処理の能力が向上しました。キーワードEVENTを含む変数宣言は、この変数への割り当てを並列評価の対象にしました。つまり、右側はC.mmpマルチプロセッサシステムのプロセッサの 1 つに移動される手順になりました。このような変数へのアクセスは、割り当ての終了後に遅延されました。
Cambridge ALGOL 68C (C) は、 ALGOL 68 のサブセットを実装したポータブル コンパイラであり、演算子の定義を制限し、ガベージ コレクション、柔軟な行、フォーマットされた転送を省略しました。
M. van der Veer によるAlgol 68 Genie (G)は、今日のコンピューターおよびオペレーティング システム向けの ALGOL 68 実装です。
「善意にもかかわらず、プログラマーはうっかりローカル拡張を採用することで移植性を損なう可能性があります。これを防ぐために、各実装は PORTCHECK プラグマット オプションを提供する必要があります。このオプションが有効になっている間、コンパイラーは、移植性制約に違反していると認識した各構成要素に対してメッセージを出力します。」[67]
引用
- ... C で採用された型合成のスキームは、Algol 68 にかなり影響を受けていますが、Algol の支持者が承認するような形では登場しなかったかもしれません。私が Algol から得た中心的な概念は、配列、ポインタ (参照)、関数 (プロシージャ) に構成されたアトミック タイプ (構造体を含む) に基づく型構造でした。Algol 68 の共用体とキャストの概念も、後に登場した影響を与えました。Dennis Ritchie 1993 年 4 月。[2]
- ... C が Algol 68 から派生したものではないというのは本当ですが、影響はありました。その多くは、非常に微妙なもので、一生懸命考えても、それを回復するのは困難です。特に、ユニオン型 (C に後から追加されたもの) は、細かい点ではなく、そのような型を持つというアイデア自体が A68 に負っています。さらに深く言えば、型構造全般、そして奇妙なことに、宣言構文 (型コンストラクタ部分) も A68 に影響を受けています。そしてもちろん、「long」もそうです。Dennis Ritchie、1988 年 6 月 18 日[4]
- 「おめでとう、あなたの主人はそれを成し遂げました」 –ニクラウス・ヴィルト[68]
- 見れば見るほど、私は不幸になる- EWダイクストラ、1968年[69]
- [...] A68の人気はアムステルダムからの距離に反比例すると言われていた-グイド・ファン・ロッサム[70]
- [...] 私たちにできる最善のことは、少数派報告書を添えて、私たちの熟慮した見解を述べることだった。「... 洗練されたプログラムを確実に作成するためのツールとしては、この言語は失敗だった。」 [...] - CAR Hoareによる 1980 年 10 月のチューリング賞講演[71]
- 「[...] これまで以上に、適切なプログラミング ツールには、構造によってプログラマの仕事の最も困難な側面、つまり洗練されたプログラムの確実な作成を支援することが求められるでしょう。この点で、ここで提案されている言語が大きな進歩であるとは思えません。それどころか、プログラマの仕事に対するその暗黙の見解は、たとえば 10 年前とほとんど同じであると感じています。このことから、プログラミング ツールとして見た場合、この言語は時代遅れと見なさなければならないという結論に至ります。[...]」 1968 年 12 月 23 日の 1968 年ワーキング グループの少数派レポート。 [72]
参照
参考文献
引用
- ^ ファン・ワインガルデン、アドリアーン;バリー・ジェームス・マイルー;ジョン・エドワード・ランスロット・ペック;コルネリス・ヘルマナス・アントニウス・コスター;シンツォフ、ミシェル[フランス語] ;チャールズ・ホジソン・リンジー;ランベール・ギョーム・ルイ・テオドール・メルテンス;フィスカー、リチャード G. 編(1976年)。アルゴリズム言語 ALGOL 68 に関する改訂レポート(PDF)。スプリンガー・フェルラーグ。ISBN 978-0-387-07592-1. OCLC 1991170. 2019年4月19日にオリジナルからアーカイブ(PDF)されました。2019年5月11日に取得。
- ^ ab Dennis Ritchie (1993 年 4 月)。「C 言語の開発」(PDF)。2005 年 11 月 6 日時点のオリジナル(PDF)からアーカイブ。2007年 4 月 26 日閲覧。
- ^ Cへの影響: 型、構造体、配列、ポインタ、プロシージャ – Dennis Ritchie [2]
- ^ ab Dennis Ritchie (1988 年 6 月). 「C と Algol 68」. 2006 年 9 月 15 日閲覧。
- ^ Cへの影響: 共用体、構造、構文、長精度 – デニス・リッチー[4]
- ^ 「C++の歴史: 1979−1991」(PDF)。1993年3月。12ページ、第2段落: Algol68は、演算子のオーバーロード(§3.3.3)、参照(§3.3.4)、およびブロック内の任意の場所で変数を宣言する機能(§3.3.1)を提供しました。2008年5月6日閲覧。
- ^ 「Guido van Rossum とのインタビュー」 1998 年 7 月。2007 年 5 月 1 日時点のオリジナルよりアーカイブ。2007年 4 月 29 日閲覧。
- ^ 「ALGOL 68 の短い歴史」。2006 年 8 月 10 日時点のオリジナルよりアーカイブ。2006 年 9 月 15 日閲覧。
- ^ Veer, Marcel van der (2023-04-05). 「アルゴリズム言語 Algol 68 の改訂レポート」jmvdveer.home.xs4all.nl/。2013-03-17 時点のオリジナルよりアーカイブ。
- ^ Veer, Marcel van der (2023-04-05). 「アルゴリズム言語 Algol 68 の改訂レポート」jmvdveer.home.xs4all.nl/。2013-03-17 時点のオリジナルよりアーカイブ。
- ^ Veer, Marcel van der (2023-04-05). 「アルゴリズム言語 Algol 68 の改訂レポート」jmvdveer.home.xs4all.nl/。2013-03-17 時点のオリジナルよりアーカイブ。
- ^ Veer, Marcel van der (2023-04-05). 「アルゴリズム言語 Algol 68 の改訂レポート」jmvdveer.home.xs4all.nl/。2013-03-17 時点のオリジナルよりアーカイブ。
- ^ 「ゴム?」
- ^ アルゴリズム言語 Algol 68 の改訂レポート、Wayback Machineで 2013-03-17 にアーカイブ。jmvdveer.home.xs4all.nl (1968-12-20)。2013-07-21 に取得。
- ^ Terekhov, Andrey ( 2014 ). 「ALGOL 68 とソ連およびロシアのプログラミングに対するその影響」。2014年ロシアおよび旧ソ連におけるコンピュータ技術に関する第 3 回国際会議。pp. 97–106。doi :10.1109 / SoRuCom.2014.29。ISBN 978-1-4799-1799-0. S2CID 16097093。
- ^ http://toc.proceedings.com/25445webtoc.pdf 「Алгол 68 и его влияние на программирование в СССР и России」 – ページ: 336 & 342
- ^ リンジー 1996.
- ^ ab Lindsey, Charles H. (1996). Bergin, TJ; Gibson, RG (eds.). A history of ALGOL 68 . History of Programming Languages-II . Vol. 28. また、ACM SIGPLAN Notices 28(3)、1993 年 3 月 (ALGOL 68 の開発前、開発中、開発後の会議や議論の包括的な参考文献を含む) にも掲載されています。ACM Press . pp. 97–132. doi :10.1145/155360.155365. ISBN
978-0-201-89502-5。
{{cite book}}:|journal=無視されました (ヘルプ) - ^ Algol 68 プログラミングを簡単にする
- ^ ヴィール、マルセル・ファン・デル。 「マルセル・ファン・デル・ヴィール - アルゴル68の魔神」。jmvdveer.home.xs4all.nl/。
- ^ リンゼイ1993、7ページ。
- ^ abcd Lindsey 1993、9ページ。
- ^ リンゼイ1993、24ページ。
- ^ リンゼイ1993、10ページ。
- ^ 「アルゴル速報」.
- ^ リンゼイ1993、12ページを参照。
- ^ Lindsey, CH (1972). 「ALGOL 68 with lesser tears」(PDF) . The Computer Journal . 15 (1): 176–188. doi :10.1093/comjnl/15.2.176.
- ^ リンゼイ1993、13ページ。
- ^ リンゼイ1993、15ページ。
- ^ ホア、C. a. R. (1968 年 11 月)。 「ALGOL 68の批判」。ALGOL 速報。29:27~29。
- ^ ab Peck, JEL, ed. (1970), Proceedings of the IFIP working conference on ALGOL 68 Implementation、ミュンヘン:北ホラント、ISBN 0-7204-2045-8
- ^ abcd Koster, CHA「A Shorter History of Algol 68」。2007年12月17日時点のオリジナルよりアーカイブ。
- ^ van der Veer, Marcel. 「オープンソース Algol 68 実装」. algol68.sourceforge.net .
- ^ E.マルケージ、ホセ。 「GCC 用 Algol68 フロントエンド」。ジェマーチ.net。
- ^ Van Wijngaarden、A.;マイルー、BJ。ペック、J.コスター、CHA (1968-03-01)。 「アルゴリズム言語 ALGOL 68 に関する報告書草案」。ALGOL 速報(Sup 26): 1–84 。2023年4月7日取得– 1968年3月経由。
- ^ Sidney Marshall、「ALGOL 68 実装」、IFIP ALGOL 68 実装に関するワーキング カンファレンスの議事録、ミュンヘン、1970 年 7 月 20 ~ 24 日、JEL Peck 編、North Holland、239 ~ 243 ページ。
- ^ シドニー・マーシャル、「ALGOL 68 の実装について」、博士論文、ダートマス大学、1972 年。
- ^ アルゴル68改訂報告書
- ^ Black, AP; Rayward-Smith, VJ (1978-05-01). 「ALGOL H の提案 - ALGOL 68 のスーパー言語」ALGOL Bulletin (42): 36–49 . 2023-04-07閲覧- 1978 年 5 月経由。
- ^ 「Algol68 S(S) がインターネット上で公開されました」。2005年12月3日時点のオリジナルよりアーカイブ。2004年8月30日閲覧。
- ^ ヴィール、マルセル・ファン・デル。 「マルセル・ファン・デル・ヴィール - アルゴル68の魔神」。jmvdveer.home.xs4all.nl/ 。2023-04-07に取得。
- ^ 「アルゴリズム言語ALGOL 68に関するドラフトレポート」1968年3月。2007年9月30日時点のオリジナルよりアーカイブ。2007年6月22日閲覧。
- ^ 「アルゴリズム言語 ALGOL 68 に関する最終草案レポート - 第 1 章から第 9 章」(PDF)。1968 年 10 月。2007年 6 月 22 日閲覧。[永久リンク切れ ]
- ^ 「アルゴリズム言語 ALGOL 68 に関する最終草案レポート - 第 10 章から第 12 章」(PDF)。1968 年 10 月。2007年 6 月 22 日閲覧。[永久リンク切れ ]
- ^ 「アルゴリズム言語 ALGOL 68 に関する報告書」(PDF) 。1968 年 12 月。2008年 4 月 6 日時点のオリジナル(PDF)からアーカイブ。2007年 12 月 30 日閲覧。
- ^ 「アルゴリズム言語 Algol 68 に関する改訂レポート」 1973 年 9 月。2007 年 9 月 27 日時点のオリジナルよりアーカイブ。2007年 4 月 30 日閲覧。
- ^ 陸胡泉 (1971). 「Algol 68 の中国語への翻訳」(PDF)。中国、北京: 中央研究院数学研究所。2012 年 8 月 17 日に取得。
- ^ 「GOST 27974-88 プログラミング言語 ALGOL 68 – Язык программирования АЛГОЛ 68」(PDF) (ロシア語)。ゴスト。 1988。2008年 11 月 15 日にオリジナル(PDF)からアーカイブ。2008 年 11 月 15 日に取得。
- ^ 「GOST 27975-88 プログラミング言語 ALGOL 68 拡張版 – Язык программирования АЛГОЛ 68 раслиренный」(PDF) (ロシア語)。ゴスト。 1988。2011年 4 月 29 日にオリジナル(PDF)からアーカイブされました。2008 年 11 月 15 日に取得。
- ^ 「ALGOL 68Gのフォーマット構文」。2008年1月9日時点のオリジナルよりアーカイブ。2023年4月7日閲覧。
- ^ Needham, RM; Wilkes, MV (1979 年 1 月)。「ケンブリッジ CAP コンピュータとそのオペレーティング システム」( PDF) 。Microsoft Research。
- ^ David Holdsworth (2009年冬~2010年冬)。「KDF9 タイムシェアリング: Eldon 2 は EGDON ではない!」。Computer Resurrection – 第 49 号。Computer Conservation Society。2010年 10 月 3 日閲覧。
- ^ IF Currie; JM Foster (1982年9月). 「RSRE覚書」(PDF) . vitanuova.com . 2023年4月7日閲覧。
- ^ Эльбрус Бабаяна および Pentium Пентковского。 Ixbt.com。 2013 年 7 月 21 日に取得。
- ^ Oliver, JR; Newton, RS (1979). 「ALGOL 68-RT の実践的経験」.コンピュータジャーナル. 22 (2): 114–118. doi : 10.1093/comjnl/22.2.114 .
- ^ アプリケーション、ライブラリ、テスト スイート — Software Preservation Group。Softwarepreservation.org。2013 年 7 月 21 日閲覧。
- ^ 改訂報告書、123ページ、脚注
- ^ Lindsey, CH (1974年7月). 「部分パラメータ化」. ALGOL Bulletin (37): 24–26 . 2022年9月19日閲覧。
- ^ Lindsey, CH; Boom, HJ (1978年12月). 「ALGOL 68用のモジュールと個別コンパイル機能」ALGOL速報(43): 19–53 . 2020年1月29日閲覧。コメントの正誤表
- ^ Lindsey, CH (1974年7月). 「Modals」. ALGOL Bulletin (37): 26–29 . 2022年9月19日閲覧。
- ^ 「アーカイブコピー」(PDF) 。 2010年4月15日時点のオリジナル(PDF)からアーカイブ。 2010年3月20日閲覧。
{{cite web}}: CS1 maint: アーカイブされたコピーをタイトルとして (リンク) - ^ http://htportal.acm.org/ft_gateway.cfm?id=803425&type=pdf [永久リンク切れ ]
- ^ 抽象 ALGOL 68 マシンとマシン非依存コンパイラへのその応用 – Springer。Springerlink.com。2013 年 7 月 21 日閲覧。
- ^ 「The Encyclopedia of Computer Languages」。2011年3月10日時点のオリジナルよりアーカイブ。2010年3月20日閲覧。
- ^ オープンソースの Algol 68 実装 – ファイルを参照するには、Sourceforge.net にアクセスしてください。2013 年 7 月 21 日に取得。
- ^ [1] 2006年8月29日アーカイブ、Wayback Machine
- ^ 「アーカイブコピー」(PDF) 。 2014年1月2日時点のオリジナル(PDF)からアーカイブ。 2005年8月27日閲覧。
{{cite web}}: CS1 maint: アーカイブされたコピーをタイトルとして (リンク) - ^ CHA Koster (1993). The Making of Algol 68 . コンピュータサイエンスの講義ノート. CiteSeerX 10.1.1.76.2072 .
- ^ Dijkstra, EW「To the Editor ALGOL 68 Mathematische Centrum」。2007年4月21日時点のオリジナルよりアーカイブ。2007年4月28日閲覧。
- ^ van Rossum, Guido (2005 年 6 月). 「Python-Dev Wishlist: dowhile」. 2007 年 4 月 28 日閲覧。
- ^ Hoare, CAR (1981年2月) [1980年のチューリング賞講演に基づく]. 「皇帝の古着」. Communications of the ACM . 24 (2): 75–83. doi : 10.1145/358549.358561 . S2CID 97895.代替 URL 2017-10-02 にWayback Machineでアーカイブされました
- ^ 「ALGOL Bulletin (AB30.1.1.1 で参照)」。1970 年 3 月。2007 年 9 月 30 日時点のオリジナルよりアーカイブ。2007年 3 月 1 日閲覧。
引用文献
- Brailsford, DF および Walker, AN,入門 ALGOL 68 プログラミング、Ellis Horwood/Wiley、1979 年
- Lindsey, CH および van der Meulen, SG, ALGOL 68 の非公式入門、North-Holland、1971
- Lindsey, CH (1993-03-02). 「ALGOL 68 の歴史」. ACM SIGPLAN Notices . 28 (3): 97–132. doi : 10.1145/155360.155365 .
- McGettrick, AD, ALGOL 68, A First and Second Course、ケンブリッジ大学出版局、1978年
- Peck、JEL、ALGOL 68 コンパニオン、大学ブリティッシュコロンビア州、1971 年 10 月
- Tanenbaum, AS, A Tutorial on ALGOL 68 , Computing Surveys 8 , 155-190, 1976年6月および9 , 255-256, 1977年9月、[7] [ permanent dead link ]
- Woodward, PM および Bond, SG, ALGOL 68-R ユーザーズガイド、ロンドン、Her Majesty 's Stationery Office、1972 年
外部リンク
- アルゴリズム言語 ALGOL 68 の改訂版レポート 言語のユーザーと実装者のための公式リファレンス (大きな PDF ファイル、Algol Bulletin からスキャン)
- アルゴリズム言語 ALGOL 68 に関する改訂報告書 改訂報告書のハイパーリンク付き HTML バージョン
- Algol 68 のチュートリアル、Andrew S. Tanenbaum著、Computing Surveys、第 8 巻、第 2 号、1976 年 6 月、訂正あり (第 9 巻、第 3 号、1977 年 9 月)
- Algol 68 Genie – GNU GPL Algol 68 コンパイラ インタプリタ
- SourceForge 上のオープンソース ALGOL 68 実装
- Algol68 標準ハードウェア表現 (.pdf) 2014-01-02 にWayback Machineでアーカイブされました
- Из истории создания компилятора с Алгол 68
- アルゴル 68 – ソ連での 25 年間
- Система программ динамической поддержки для транслятора с Алгол 68
- Algol68 の遺産を持つ C の歴史
- McJones, Paul、「Algol 68 の実装と方言」、ソフトウェア保存グループ、コンピュータ歴史博物館、2011-07-05
- 小規模な実験のための Web 対応 ALGOL 68 コンパイラ
