1965 年の ALGOL-20 マニュアル | |
| パラダイム | 手続き的、命令的、構造化された |
|---|---|
| 家族 | アルゴル |
| デザイン: | バウアー、ボッテンブルッフ、ルーティシャウザー、ザメルソン、バッカス、カッツ、パーリス、ウェグシュタイン、ナウル、ヴォーコワ、ファン・ワインガーデン、ウッジャー、グリーン、マッカーシー |
| 初登場 | 1958年 |
| タイピングの規律 | 静的、強い |
| 範囲 | 語彙 |
| 影響を受けた | |
| その後のほとんどの命令型言語(いわゆるALGOL系言語を含む)、 例:PL/I、Simula、Pascal、C、Scheme | |
ALGOL(/ ˈ æ l ɡ ɒ l、 - ɡ ɔː l / ; 「アルゴリズム言語」の略)[1]は、1958年に開発された命令型コンピュータプログラミング言語のファミリーです。ALGOLは他の多くの言語に大きな影響を与え、30年以上にわたって教科書や学術資料で使用されているアルゴリズム記述の標準的な方法である、計算機協会(ACM)でした。[2]
現代の言語の構文のほとんどが「Algolに似ている」という意味で、 [3] Algolは、ほぼ同時期に存在した他の3つの高級プログラミング言語であるFORTRAN、Lisp、COBOLよりも影響力があったと言えるでしょう。[4] FORTRANで認識されていた問題のいくつかを回避するように設計され、最終的にはPL/I、Simula、BCPL、B、Pascal、Ada、Cなど、他の多くのプログラミング言語の誕生につながりました。
ALGOL はコード ブロックと、それを区切るためのbegin...ペアを導入しました。また、レキシカル スコープを持つネストされた関数定義を実装した最初の言語でもありました。さらに、形式言語定義に細心の注意を払った最初のプログラミング言語でもあり、Algol 60 レポートを通じて、言語設計のための主要な形式文法表記法であるBackus-Naur 形式を導入しました。
end
主な仕様は 3 つあり、最初に公開された年にちなんで名付けられています。
- ALGOL 58 – 当初はIAL ( International Algebraic Language)と呼ばれることが提案されました。
- ALGOL 60 – 1961年にX1 ALGOL 60として初めて実装されました。1963年に改訂されました。 [5] [6] [7]
- ALGOL 68 – 柔軟な配列、スライス、並列処理、演算子識別などの新しい要素を導入。1973年に改訂。[8]
ALGOL 68 は ALGOL 60 とは大幅に異なり、あまり好評ではなかったため[誰によると? ]、「Algol」という場合は一般に ALGOL 60 とその方言を指すと理解されています。[引用が必要]
歴史
ALGOLは、1958年にチューリッヒのスイス連邦工科大学で開催された会議で、ヨーロッパとアメリカのコンピュータ科学者の委員会によって共同で開発されました(ALGOL 58を参照)。[9] ALGOLは、参照構文、出版構文、実装構文の3つの異なる構文を規定しており、これらの構文により、異なる言語で異なるキーワード名や小数点の規則(カンマとピリオド)を使用することができました。[5]
ALGOLは主に米国とヨーロッパの計算機科学者の研究に使用されていましたが、その記述に標準的な入出力機能がないことと、大手コンピュータベンダー(バロウズ社以外)がこの言語に興味を示さなかったために、商用利用は妨げられました。[10]しかし、ALGOL 60はアルゴリズムの公開の標準となり、将来の言語開発に大きな影響を与えました。[10]

ジョン・バッカスは、 ALGOL 58専用にプログラミング言語を記述するバッカス正規形の方法を開発しました。これはALGOL 60用にピーター・ナウアによって改訂・拡張され、ドナルド・クヌースの提案によりバッカス・ナウア形式と改名されました。[11]
ピーター・ナウア:「私はALGOL Bulletinの編集者として、言語に関する国際的な議論に巻き込まれ、1959年11月にヨーロッパ言語設計グループのメンバーに選ばれました。この立場で、私は1960年1月にパリで開催されたALGOL 60会議の結果として作成されたALGOL 60レポートの編集者でした。」[12]
パリでの会議(1月11日から16日)には以下の人々が出席した。[5]
- フリードリヒ・ルートヴィヒ・バウアー、ペーター・ナウル、ハインツ・ルーティシャウザー、クラウス・ザメルソン、ベルナール・ヴォーコワ、アドリアン・ファン・ワインガルデン、マイケル・ウッドガー(ヨーロッパ出身)
- ジョン・ワーナー・バッカス、ジュリアン・グリーン、チャールズ・カッツ、ジョン・マッカーシー、アラン・ジェイ・パーリス、ジョセフ・ヘンリー・ウェグスタイン(米国)。
アラン・パーリスは会議の様子を次のように鮮明に描写している。「会議は疲れ果て、果てしなく、そして爽快だった。自分の良いアイデアが他人の悪いアイデアと一緒に捨てられると、人はイライラした。しかし、会議中ずっと勤勉さは続いた。13人の相性は素晴らしかった。」[13]
遺産
ALGOL 58レポートの重要な貢献は、プログラミングの概念(ステートメント、宣言、型、ラベル、プライマリ、ブロックなど)の標準用語を提供したことです。[10]
ALGOL 60は、その後に続く多くの言語に影響を与えました。トニー・ホーアは、「これは時代をはるかに先取りした言語であり、その前身だけでなく、ほぼすべての後継言語よりも優れたものでした」と述べています。 [14] Schemeプログラミング言語は、 ALGOL のブロック構造と語彙範囲を採用したLispの派生であり、ALGOL に敬意を表して、その標準文書に「アルゴリズム言語 Scheme の改訂レポート」という文言を採用しました。[15]
プロパティ
公式に定義された ALGOL 60 にはI/O機能がなく、実装は互いに互換性がほとんどない方法で独自に定義されていました。対照的に、ALGOL 68 は、トランスプット(入力/出力) 機能の広範なライブラリを提供しました。
ALGOL 60 では、パラメータの受け渡しに2 つの評価戦略、つまり一般的な値渡しと名前渡しが許可されていました。名前渡しは、参照渡しとは対照的に特定の効果があります。たとえば、パラメータを値または参照として指定しないと、渡される実際のパラメータが整数変数とその同じ整数変数によってインデックス付けされる配列である場合に、2 つのパラメータの値を交換するプロシージャを開発することはできません。[16] swap(i, A[i]) へのポインタを関数に渡すことを考えてみましょう。swap が参照されるたびに、再評価されます。たとえば、i := 1 で A[i] := 2 の場合、swap が参照されるたびに、値の別の組み合わせ ([1,2]、[2,1]、[1,2] など) が返されます。同様の状況は、実際の引数として渡されるランダム関数でも発生します。
名前による呼び出しは、それを実装するために使用される興味深い「サンク」で多くのコンパイラ設計者に知られています。Donald Knuth は、 「再帰と非ローカル参照」を正しく実装したコンパイラを区別するために、「男か少年かのテスト」を考案しました。このテストには、名前による呼び出しの例が含まれています。
ALGOL 68 は、 Adriaan van Wijngaardenが発明し、彼の名前を冠した2 レベルの文法形式を使用して定義されました。Van Wijngaarden 文法は、文脈自由文法を使用して、特定の ALGOL 68 プログラムを認識する無限の生成物のセットを生成します。特に、他の多くのプログラミング言語標準では「セマンティクス」とラベル付けされ、あいまいさが生じやすい自然言語の散文で表現され、その後、形式言語パーサーに添付された アドホックコードとしてコンパイラーに実装される必要がある種類の要件を表現できます。
例と移植性
コードサンプルの比較
アルゴル60
(太字のテキストの書き方は実装によって異なります。たとえば、整数の場合は引用符を含む 'INTEGER' とします。これはストロッピングと呼ばれます。)
手順Absmax(a) サイズ:(n, m) 結果:(y) 添え字:(i, k);
値n, m;配列a;整数n, m, i, k;実数y;
コメントサイズ n × m の行列 a の絶対最大要素。
y にコピーされ、この要素の添え字が i と k にコピーされます。
整数p、qを開始します。
y := 0; i := k := 1;
p := 1ステップ1 、 nまで実行
、 q := 1ステップ1 、 mまで実行
、 abs(a[p, q]) > y の場合、 y := abs(a[p, q]);から
開始
i := p; k := q
終了
終了Absmax
以下はElliott 803 ALGOLを使用して表を作成する方法の例です。[17]
浮動小数点アルゴリズムテスト リアルA、B、C、Dの開始 読むD' A:= 0.0 ステップD 6.3まで実行 始める プリントパンチ(3)、££L??' B := SIN(A)' C := COS(A)' 印刷パンチ(3)、同一線、整列(1,6)、A、B、C' 終わり 終わり'
アルゴル68
次のコード サンプルは、上記の ALGOL 60 コード サンプルの ALGOL 68 バージョンです。
ALGOL 68 実装では、ALGOL 60 のストロッピング手法が使用されました。ALGOL 68 の場合、太字の書体のトークンは予約語、型 (モード)、または演算子です。
proc abs max = ([,] real a, ref real y, ref int i, k) real :
comment行列aの絶対最大要素。サイズは⌈a×2⌈a
は y に転送され、この要素の i と k への添え字が転送されます。コメント
開始
real y := 0; i := ⌊a; k := 2⌊a;
for p from ⌊a to ⌈a do
for q from 2⌊a to 2⌈a do
if abs a[p, q] > y then
y := abs a[p, q];
i := p; k := q
fi
od
od ;
ええ
終了# 絶対最大 #
注: 配列の下限 (⌊) と上限 (⌈) の境界、および配列のスライスは、プログラマーが直接利用できます。
浮動小数点 algol68 テスト:
(
実数a、b、c、d;
# printf – 出力をファイル stand outに送信します。#
# printf($p$); –新しいページを選択します#
printf(($pg$,"Enter d:"));
読む(d);
for step from 0 while a:=step*d; a <= 2*pi do
printf($l$); # $l$ -新しい行を選択します。#
b := sin(a);
c := cos(a);
printf(($zd.6d$,a,b,c)) # 小数点の前に 1 桁、小数点の後に 6 桁で出力をフォーマットします。 #
od
)
タイムライン: Hello world
ある実装から別の実装へのプログラムのバリエーションと移植性の欠如は、古典的なhello world プログラムによって簡単に実証されます。[引用が必要]
アルゴル 58 (IAL)
ALGOL 58 には I/O 機能はありませんでした。
ALGOL 60 ファミリー
ALGOL 60 には I/O 機能がなかったため、ALGOL には移植可能なhello world プログラムはありません。次の 3 つの例は、Burroughs Extended Algol のものです。最初の 2 つは、実行されている対話型端末に直接出力します。最初のものは、C と同様に文字配列を使用します。この言語では、配列識別子を配列へのポインターとして使用できるため、REPLACE ステートメントで使用できます。
BEGIN
FILE F ( KIND = REMOTE );
EBCDIC ARRAY E [ 0 : 11 ];
REPLACE E BY "HELLO WORLD!" ;
WRITE ( F , * , E );
END .
インライン形式を使用したより単純なプログラム:
BEGIN
FILE F ( KIND = REMOTE );
WRITE ( F , < "HELLO WORLD!" > );
END .
Display ステートメントを使用したさらに簡単なプログラム。出力はシステム コンソール ('SPO') に表示されることに注意してください。
BEGIN DISPLAY ( "HELLO WORLD!" ) END .
Elliott Algol I/Oを使用した別の例は次のとおりです。Elliott Algolは「open-string-quote」と「close-string-quote」に異なる文字を使用していました。ここでは次のように表されます。 ' そして ' 。
プログラムHiFolks ; begin print ' Hello world ' end ;
以下は、Elliott 803 Algol (A104) のバージョンです。標準の Elliott 803 は 5 穴の紙テープを使用していたため、大文字のみでした。コードには引用符がなかったため、引用符の開始には £ (英国のポンド記号)、引用符の終了には ? (疑問符) が使用されました。特別なシーケンスは二重引用符で囲まれていました (例: ££L?? はテレプリンターで新しい行を生成しました)。
ハイフォークス
始める
£HELLO WORLD£L?? を印刷します。'
終わり'
ICT 1900シリーズのAlgol I/Oバージョンでは、紙テープまたはパンチカードからの入力が可能でした。紙テープの「フル」モードでは小文字が使用できました。出力はラインプリンタで行われました。引用符の開始文字と終了文字は「(」と「)」で表され、スペースは%で表されました。[18]
'始める'
テキストを書き込みます('('HELLO%WORLD')');
'終わり'
アルゴル68
ALGOL 68コードは、予約語が通常は小文字で太字または下線付きで公開されました。
始める printf(($gl$,"こんにちは、世界!")) 終わり
「Algol 68 レポート」の言語では、入出力機能は総称して「Transput」と呼ばれていました。
ALGOL特殊文字のタイムライン
ALGOL は、文字セットが多様で急速に進化していた時代に考案されました。また、ALGOL は大文字のみを必要とするように定義されていました。
1960 年: IFIP – Algol 60 言語とレポートには、現代のコンピュータやオペレーティング システムで使用できるいくつかの数学記号が含まれていましたが、残念ながら、当時のほとんどのコンピューティング システムではサポートされていませんでした。たとえば、×、÷、≤、≥、≠、¬、∨、∧、⊂、≡、␣、⏨ などです。
1961年9月: ASCII –当時開発の初期段階にあったASCII文字セットに、ALGOLのブール演算子/\と\/をサポートするために\ (バックスラッシュ)文字が追加されました。[19]
1962年: ALCOR – この文字セットには、乗算用の珍しい「᛭」ルーン十字文字[20]と、浮動小数点表記用の「⏨」10進指数記号[21]が含まれていました。[22] [23] [24]
1964年: GOST – 1964年のソビエト標準GOST 10859により、ALGOLで4ビット、5ビット、6ビット、7ビットの文字のエンコードが許可されました。[25]
1968 年: 「Algol 68 レポート」 – 既存の ALGOL 文字を使用し、さらに、タイプボール (またはゴルフ ボール)プリントヘッド( APL ゴルフ ボールなど) が挿入されたIBM 2741キーボードにある →、↓、↑、□、⌊、⌈、⎩、⎧、○、⊥、¢ 文字を採用しました。これらは、ALGOL 68 が起草されていた 1960 年代半ばに利用可能になりました。レポートはロシア語、ドイツ語、フランス語、ブルガリア語に翻訳され、ソビエトBESM -4 のキリル文字など、より大きな文字セットを持つ言語でのプログラミングが可能になりました。ALGOL のすべての文字はUnicode標準の一部でもあり、そのほとんどはいくつかの一般的なフォントで使用できます。
2009年10月: Unicode –歴史的なBuranプログラムの⏨ALGOLソフトウェアとの下位互換性を保つために、浮動小数点表記の(10進指数記号)がUnicode 5.2に追加されました。[26]
ALGOL実装
現在までに、Algol 60の拡張、派生、サブ言語は少なくとも70件存在しています。[27]
Burroughs 方言には、ESPOLやNEWPなどの特殊なブートストラップ方言が含まれていました。後者は、現在でも Unisys MCP システム ソフトウェアで使用されています。
参照
参考文献
- ^ この言語ファミリーの名前は、大文字と小文字が混在する場合 (Algol 60 Archived 25 June 2007 at the Wayback Machine ) もあれば、すべて大文字で表記される場合もあります (ALGOL68 Archived 13 September 2014 at the Wayback Machine )。簡潔にするため、この記事ではALGOL を使用します。
- ^ Collected Algorithms of the ACM Archived 17 October 2011 at Wikiwix アルゴリズムの圧縮アーカイブ。ACM。
- ^ O'Hearn, PW; Tennent, RD (1996年9月). 「Algolのような言語、入門」。2011年11月14日時点のオリジナルよりアーカイブ。
- ^ 「ALGOLプログラミング言語」2016年10月6日アーカイブ、Wayback Machine、ミシガン大学ディアボーン校
- ^ abc Backus, John Warner ; Bauer, Friedrich Ludwig ; Green, Julien ; Katz, Charles ; McCarthy, John ; Naur, Peter ; Perlis, Alan Jay ; Rutishauser, Heinz ; Samelson, Klaus ; Vauquois, Bernard ; Wegstein, Joseph Henry ; van Wijngaarden, Adriaan ; Woodger, Michael (1960 年 5 月). Naur, Peter (編). 「アルゴリズム言語 ALGOL 60 に関する報告書」. Communications of the ACM . 3 (5). コペンハーゲン、デンマーク: 299–314. doi : 10.1145/367236.367262 . ISSN 0001-0782. S2CID 278290.
- ^ 「アルゴリズム言語 Algol 60 に関する改訂報告書」 1963 年。2007 年 6 月 25 日時点のオリジナルよりアーカイブ。2007 年6 月 8 日閲覧。
- ^ 「X1 用の ALGOL 60 トランスレータ」(PDF)。 1961. 2022 年 10 月 9 日のオリジナルからアーカイブ(PDF) 。2021 年1 月 7 日に取得。
- ^ 「アルゴリズム言語ALGOL 68の改訂報告書」(PDF) 。1973年。 2014年9月13日時点のオリジナルよりアーカイブ(PDF) 。2014年9月13日閲覧。
- ^ 「ALGOLの歴史 — ソフトウェア保存グループ」www.softwarepreservation.org 。 2024年3月14日閲覧。
- ^ abc Bemer, Bob. 「アルゴルの政治社会史」(PDF)。コンピュータ歴史博物館。 2024年8月9日閲覧。
- ^ Knuth, Donald E. (1964). 「Backus Normal Form vs Backus Naur Form」. Communications of the ACM . 7 (12): 735–736. doi : 10.1145/355588.365140 . S2CID 47537431.
- ^ ACM 賞の引用: Peter Naur アーカイブ済み 2012 年 4 月 2 日Archive-It、2005 年
- ^ Perlis, Alan J (1978). 「ALGOL 開発のアメリカ側」 プログラミング言語の歴史。pp. 75–91. doi :10.1145/800025.1198352. ISBN 0-12-745040-8– dl.acm.org 経由。
- ^ 「プログラミング言語設計のヒント」Wayback Machineに 2009 年 9 月 15 日にアーカイブ、CAR Hoare、1973 年 12 月。27 ページ。(この発言は、最初の ALGOL 60コンパイラの実装にも関わったEdsger W. Dijkstraの発言であると誤って解釈されることがあります。)
- ^ Dybvig, RK; et al. Rees, Jonathan; Clinger, William; Abelson, Hal (eds.). 「Revised(3) Report on the Algorithmic Language Scheme, (Dedicated to the Memory of ALGOL 60)」。2010年1月14日時点のオリジナルよりアーカイブ。2009年10月20日閲覧。
- ^ Aho, Alfred V. ; Sethi, Ravi ; Ullman, Jeffrey D. (1986).コンパイラ: 原理、テクニック、ツール(第 1 版). Addison-Wesley. ISBN 0-201-10194-7。、第7.5節およびその中の参照
- ^ 「803 ALGOL」Wayback Machineで2010年5月29日にアーカイブ、Elliott 803 ALGOLのマニュアル
- ^ 「ICL 1900 シリーズ: Algol 言語」ICL 技術出版物 3340。1965 年。
- ^ ASCII のバックスラッシュの由来 Archived 11 July 2014 at the Wayback Machine、Bob Bemer
- ^ 鉄/ルーン十字
- ^ 小数点指数記号
- ^ バウマン、R. (1961 年 10 月)。 「ALCOR グループの ALGOL マニュアル 第 1 部」 [ALCOR グループの ALGOL マニュアル]。Elektronische Rechenanlagen (ドイツ語): 206–212。
- ^ バウマン、R. (1961 年 12 月)。 「ALCOR グループの ALGOL マニュアル 第 2 部」 [ALCOR グループの ALGOL マニュアル]。Elektronische Rechenanlagen (ドイツ語)。6 : 259–265。
- ^ Baumann, R. (1962 年 4 月). 「ALGOL Manual of the ALCOR Group, Part 3」 [ALGOL Manual of the ALCOR Group]. Elektronische Rechenanlagen (ドイツ語). 2 .
- ^ 「GOST 10859規格」。2007年6月16日時点のオリジナルよりアーカイブ。2007年6月5日閲覧。
- ^ Broukhis, Leonid (2008 年 1 月 22 日). 「10 進指数記号をエンコードするための改訂提案」(PDF) . www.unicode.org . ISO/IEC JTC 1/SC 2/WG 2. 2015 年 7 月 31 日時点のオリジナルからのアーカイブ(PDF) 。2016 年1 月 24 日閲覧。
これは、GOST ベースのソフトウェアとドキュメントをコード変換する必要性が依然として発生する可能性があることを意味します。BESM-6 の非 IEEE 浮動小数点表現に最適化された従来の数値アルゴリズム (その中には、たとえば Buran シャトルの自動着陸など、興味深いものもあります) は、単純に再コンパイルしても確実に動作することは期待できず、何らかの人的介入が必要になる場合があります。
- ^ 「The Encyclopedia of Computer Languages」。2011年9月27日時点のオリジナルよりアーカイブ。 2012年1月20日閲覧。
- ^ コンピュータ博物館の歴史 2010年8月20日、 Wayback Machineにアーカイブ、ヒュンフェルトのコンラート・ツーゼ学校が復元した歴史的なツーゼ・コンピュータZ23、米国カリフォルニア州マウンテンビューのコンピュータ博物館歴史センター向け
- ^ Daylight, EG (2011). 「ダイクストラの一般化への呼びかけ: 1950 年代後半から 1960 年代初頭にかけての再帰的手順の出現」. The Computer Journal . 54 (11): 1756–1772. CiteSeerX 10.1.1.366.3916 . doi :10.1093/comjnl/bxr002. 2013 年 3 月 12 日時点のオリジナルよりアーカイブ。
- ^ Kruseman Aretz、FEJ (2003 年 6 月 30 日)。「Electrologica X1 用の Dijkstra-Zonneveld ALGOL 60 コンパイラ」。ソフトウェア エンジニアリング(PDF) 。コンピュータ サイエンスの歴史。アムステルダム: Centrum Wiskunde & Informatica。2016年 3 月 4 日時点のオリジナルからのアーカイブ(PDF) 。
- ^ Hoare, Antony (1980). 「皇帝の古着」Communications of the ACM . 24 (2): 75–83. doi : 10.1145/358549.358561 .
- ^ コフマン、エリオット。「私が本当に知る必要があることはすべて CS1 で学んだ」(PDF) 。2012年 10 月 12 日時点のオリジナル(PDF)からアーカイブ。2012年5 月 20 日閲覧。
- ^ 「GOGOL – PDP-1 Algol 60 (コンピュータ言語)」。オンラインプログラミング言語歴史百科事典。2018年2月2日時点のオリジナルよりアーカイブ。2018年2月1日閲覧。
- ^ Mounier-Kuhn, Pierre (2014). 「フランスにおける Algol: ユニバーサル プロジェクトから組み込み文化へ」. IEEE Annals of the History of Computing . 36 (4): 6–25. doi :10.1109/MAHC.2014.50. ISSN 1058-6180. S2CID 16684090.
- ^ ヴィッパーマン、ハンス=ヴィルム (1968) [1967-06-15、1966]. 「Triplex-ALGOL におけるシュランケンツァーレンの定義」。コンピューティング(ドイツ語)。3(2)。カールスルーエ、ドイツ:シュプリンガー:99–109。土井:10.1007/BF02277452。ISSN 0010-485X。S2CID 36685400。
さらに読む
- Randell, Brian & LJ Russell (1964)。ALGOL 60 実装: コンピュータ上での ALGOL 60 プログラムの変換と使用。Academic Press。CiteSeerX 10.1.1.737.475 。Whetstone コンパイラの設計と、コンパイラの実装に関する初期に公開された説明の 1 つについて説明します。
- ダイクストラ、西西部 (1961)。 「ALGOL 60 翻訳: X1 用の ALGOL 60 トランスレータと ALGOL 60 用トランスレータの作成」(PDF)。レポートMR 35/61。アムステルダム: 数学センター。2022 年 10 月 9 日のオリジナルからアーカイブ(PDF) 。
- Kruseman Aretz、Frans EJ「The Dijkstra–Zonneveld ALGOL 60 Compiler for the Electrologica X1」(PDF)。歴史的メモ SEN、2. アムステルダム: Centrum voor Wiskunde en Informatica。2022 年 10 月 9 日のオリジナルからアーカイブ(PDF) 。
外部リンク
- Peter Naur 他によるアルゴリズム言語 Algol 60 の改訂レポート。
- ALGOL 60 開発の最終段階におけるヨーロッパ側、ピーター・ナウア著
- コンピュータ歴史博物館による ALGOL の歴史
