ALGOL(/ ˈælɡɒl , -ɡɔːl /、略称「アルゴリズム言語」)[ 1 ]は、 1958年に開発された命令型コンピュータプログラミング言語のファミリーです。ALGOLは他の多くの言語に大きな影響を与え、30年以上にわたり、 Association for Computing Machinery (ACM)が教科書や学術資料で使用したアルゴリズム記述の標準的な方法でした。[ 2 ]
ほとんどの現代言語の構文が「Algolに似ている」という意味で[ 3 ] 、 Algolは、ほぼ同時期に登場した他の3つの高水準プログラミング言語、FORTRAN、Lisp、COBOLよりも影響力が大きかったと言えるでしょう[ 4 ]。AlgolはFORTRANの問題点を回避するように設計され、最終的にはPL/I、Simula、BCPL、B、Pascal、Ada、Cなど、他の多くのプログラミング言語を生み出しました。
ALGOLはコードブロックと、それらを区切るためのbegin...ペアを導入しました。また、字句スコープを持つネストされた関数定義を実装した最初の言語でもありました。さらに、形式言語定義に詳細な注意を払った最初のプログラミング言語であり、Algol 60レポートを通じて、言語設計のための主要な形式文法表記法であるバッカス・ナウア記法を導入しました。end
主な仕様は3つあり、それぞれ最初に発表された年にちなんで名付けられている。
ALGOL 68はALGOL 60とは大きく異なり、評判も良くなかったため、「アルゴル」という表現は一般的にALGOL 60とその方言を指すものと理解されている。
ALGOLは、1958年にチューリッヒのスイス連邦工科大学で開催された会議で、ヨーロッパとアメリカのコンピュータ科学者の委員会によって共同で開発されました( ALGOL 58参照)。[ 9 ]参照構文、公開構文、実装構文の3つの異なる構文が規定されており、異なる言語で異なるキーワード名や小数点の規則(コンマとピリオド)を使用できるようになっていました。[ 5 ]
ALGOLは主に米国とヨーロッパの研究コンピュータ科学者によって使用されました。商用アプリケーションは、その記述に標準的な入出力機能がないことと、大手コンピュータベンダー( Burroughs Corporationを除く)がこの言語に興味を示さなかったことによって妨げられました。[ 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] ALGOL のブロック構造と字句スコープを採用した Lisp の派生言語である Schemeプログラミング言語も、 ALGOLに敬意を表して、標準文書に「アルゴリズム言語 Scheme に関する改訂報告書」という文言を採用しました。[ 15 ]
公式に定義されたALGOL 60には入出力機能がなく、実装ごとに独自の入出力機能が定義されていたため、それらの互換性はほとんどありませんでした。一方、ALGOL 68は豊富な入出力機能ライブラリを提供していました。
ALGOL 60 では、パラメータの受け渡しに2 つの評価戦略が認められていました。一般的な値渡しと名前渡しです。名前渡しは、参照渡しとは対照的に、いくつかの効果があります。たとえば、パラメータを値または参照として指定しないと、実際に渡されるパラメータが整数変数と、その整数変数でインデックス付けされた配列である場合、2 つのパラメータの値を交換するプロシージャを開発することはできません。[ 16 ] swap(i, A[i]) へのポインタを関数に渡すことを考えてみてください。swap が参照されるたびに、再評価されます。i := 1 かつ A[i] := 2 とすると、swap が参照されるたびに、値の別の組み合わせ ([1,2]、[2,1]、[1,2] など) が返されます。ランダム関数を実引数として渡す場合も同様の状況が発生します。
名前呼び出しは、それを実装するために使用される興味深い「サンク」によって、多くのコンパイラ設計者に知られています。ドナルド・クヌースは、 「再帰と非ローカル参照」を正しく実装しているコンパイラを区別するために、「大人か子供か」テストを考案しました。このテストには、名前呼び出しの例が含まれています。
ALGOL 68は、アドリアーン・ファン・ワインガルデンによって考案され、彼の名を冠する2段階の文法形式体系を用いて定義されました。ファン・ワインガルデン文法は、文脈自由文法を用いて、特定のALGOL 68プログラムを認識する無限の生成規則を生成します。特に、他の多くのプログラミング言語規格では「意味論」と呼ばれ、曖昧さを生じやすい自然言語の散文で表現され、形式言語パーサーに付随するアドホックなコードとしてコンパイラに実装されるような要件を、ファン・ワインガルデン文法は表現することができます。
(太字部分の書き方は実装によって異なります。例えば、整数を表す場合は「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; for p := 1 step 1 until n do for q := 1 step 1 until m do if abs(a[p, q]) > y then begin y := abs(a[p, q]); i := p; k := q 終了終了Absmax
Elliott 803 ALGOL を使用して表を作成する方法の例を以下に示します。 [ 17 ]
浮動点アルゴル試験 開始 実数 A、B、C、D' READ D' FOR A:= 0.0 STEP D UNTIL 6.3 DO 始める プリントパンチ(3)、££L??' B := SIN(A)' C := COS(A)' パンチ(3)、同一行、整列(1,6)、A、B、C' 終わり 終わり'
以下のコードサンプルは、上記の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 ; y 終了# 最大腹筋 #
注: 配列の下限 (⌊) と上限 (⌈)、および配列のスライスは、プログラマが直接利用できます。
浮動小数点 algol68 テスト: ( real a,b,c,d; # printf – 出力をファイル に出力します。 # # printf($p$); –新しいページを選択します# printf(($pg$,"Enter d:")); read(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」プログラムは、プログラミング言語を紹介する際の一般的な例です。[ 18 ] [ 19 ] [ 20 ] [ 21 ]ここでは、ALGOL言語の違いを示すためにこれを使用します。[ 22 ]
ALGOL 58には標準的な入出力設備は搭載されていなかった。
ALGOL 60には標準入出力機能がなかったため、ALGOLには移植可能な「ハローワールド」プログラムは存在しません。
これらの例は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を示します。これは「開始引用符」( ' )と「終了引用符」( ' )に異なる文字を使用しています。
プログラムHiFolks ; begin print ' Hello world ' end ;以下はElliott 803 Algol(A104)のバージョンです。標準のElliott 803は5穴の紙テープを使用していたため、大文字のみでした。コードには引用符文字がなかったため、£(英国ポンド記号)が引用符の開始に、 ?(疑問符)が引用符の終了に使用されました。特殊なシーケンスは二重引用符で囲まれました(例:£. £L?? はテレプリンターで改行されました)。
ハイフォークスの 始める 「ハローワールド」を印刷しますか? 終わり'
ICT 1900 シリーズのAlgol I/O バージョンでは、紙テープまたはパンチ カードからの入力が可能でした。紙テープの「フル」モードでは小文字が使用できました。出力はラインプリンタに行われました。開始引用符と終了引用符の文字は「(」と「)」で表され、スペースは 「%」で表されました。[ 23 ]
'始める' テキストを書き込む('('HELLO%WORLD')'); '終わり'ALGOL 68コードは、予約語が通常小文字で表記され、太字または下線が引かれた状態で公開された。
始める printf(($gl$,"Hello, world!")) 終わり
「アルゴル68報告書」の用語では、入出力設備は総称して「トランスプット」と呼ばれていた。
ALGOLは、文字セットが多様で急速に進化していた時代に考案されました。また、ALGOLは、大文字のみを使用するように定義されていました。
1960年:IFIP – Algol 60言語とレポートには、現代のコンピュータやオペレーティングシステムで使用できる数学記号がいくつか含まれていましたが、残念ながら、当時のほとんどのコンピュータシステムではサポートされていませんでした。たとえば、×、÷、≤、≥、≠、¬、∨、∧、⊂、≡、␣、⏨などです。
1961年9月:ASCII –当時開発初期段階にあったASCII文字セットに、ALGOLのブール演算子/\と\/をサポートするために\ (バックスラッシュ)文字が追加された。[ 24 ]
1962年: ALCOR – この文字セットには、乗算用の珍しいルーン文字「᛭」 [ 25 ]と浮動小数点表記用の「⏨」10進指数記号[ 26 ]が含まれていました。[ 27 ] [ 28 ] [ 29 ]
1964年:GOST – 1964年のソ連規格GOST 10859では、ALGOLで4ビット、5ビット、6ビット、7ビットの文字をエンコードすることが可能になった。[ 30 ]
1968: 「Algol 68 レポート」では、既存の ALGOL 文字を使用し、さらに、タイプボール (またはゴルフボール) プリントヘッド (APL ゴルフボールなど) を挿入した IBM 2741 キーボードにある →、↓、↑、□、⌊、⌈、⎩、⎧、○、⊥、および ¢ 文字を採用しました。これらは、ALGOL 68 が草案作成されていた 1960 年代半ばに利用可能になりました。このレポートは、ロシア語、ドイツ語、フランス語、ブルガリア語に翻訳され、ソ連のBESM -4 のキリル文字など、より多くの文字セットを持つ言語でのプログラミングを可能にしました。ALGOL のすべての文字はUnicode標準の一部でもあり、そのほとんどはいくつかの一般的なフォントで利用できます。
2009年10月:Unicode –⏨浮動小数点表記の(10進指数記号)が、過去のBuranプログラムALGOLソフトウェアとの下位互換性のためにUnicode 5.2に追加されました。[ 31 ]
現在までに、Algol 60 の拡張、派生、派生言語、およびサブ言語が少なくとも 70 個存在します。[ 32 ]
Burroughsの言語には、ESPOLやNEWPといったブートストラップ用の特殊な言語が含まれていた。後者は現在でもUnisys MCPシステムソフトウェアで使用されている。
これは、GOST ベースのソフトウェアとドキュメントをトランスコードする必要がまだ発生する可能性があることを意味します。BESM-6 の非 IEEE 浮動小数点表現用に最適化されたレガシー数値アルゴリズム (その一部は、たとえばブラン シャトルの自動着陸に関心がある可能性があります...) は、単純に再コンパイルして確実に動作することは期待できず、人間の介入が必要になる場合があります。