ALGOL 60 ( Algorithmic Language 1960の略)は、 ALGOLファミリーのコンピュータプログラミング言語の一つです。ALGOL 60 は、コード ブロックと、それらを区切るためのandペアを導入したALGOL 58 の後継であり、構造化プログラミングの台頭における重要な進歩となりました。ALGOL 60 は、関数定義(再帰的に呼び出すことができる)を実装した最初の言語の一つでした。ALGOL 60 の関数定義は、レキシカル スコープで互いにネストすることができました(ALGOL 60 で導入された機能)。ALGOL 60 は、 CPL、PL/I、Simula、BCPL、B、Pascal、Cなど、他の多くの言語を生み出しました。当時のほぼすべてのコンピュータには、 ALGOL 60 の概念に基づいたシステム プログラミング言語が搭載されていました。beginend
ニクラウス・ヴィルトは、パスカルの開発に移る前に、ALGOL 60 をベースに独自のALGOL Wを開発しました。ALGOL-W は次世代の ALGOL となることを意図していましたが、ALGOL 68委員会は、ALGOL 60 を簡略化するのではなく、より複雑で高度な設計を採用することにしました。公式の ALGOL バージョンは、最初に公開された年にちなんで命名されています。ALGOL 68 は ALGOL 60 とは大きく異なり、その違いが批判されたこともあり、一般的に「ALGOL」は ALGOL 60 の方言を指します。
ALGOL 60はCOBOLとともに、標準化を目指した最初の言語だった。
ALGOL 60は主に米国とヨーロッパの研究コンピュータ科学者によって使用されました。その記述に標準的な入出力機能が欠けていたこと、そして大手コンピュータベンダーがこの言語に関心を示さなかったことが、商用アプリケーションでの利用を阻害しました。しかしながら、ALGOL 60はアルゴリズム公開の標準となり、その後の言語開発に大きな影響を与えました。
ジョン・バッカスは、プログラミング言語を記述するためのバッカス正規形法をALGOL 58向けに開発した。これはピーター・ナウアーによってALGOL 60向けに改訂・拡張され、ドナルド・クヌースの提案によりバッカス・ナウアー形式と改名された。[ 1 ]
ピーター・ナウアー:「ALGOL Bulletin の編集者として、私は言語に関する国際的な議論に巻き込まれ、1959 年 11 月にヨーロッパ言語設計グループのメンバーに選ばれました。この立場で、私は 1960 年 1 月にパリで開催された ALGOL 60 会議の結果として作成された ALGOL 60 レポートの編集者でした。」[ 2 ]
パリで開催された会議(1月11日から16日まで)には、以下の人々が出席しました。
アラン・パーリスは会議の様子を鮮やかに描写している。「会議は疲れ果てるほど長く、果てしなく続き、そして同時に刺激的だった。自分の良いアイデアが他人の悪いアイデアと一緒に却下されると、腹立たしくなった。それでも、会議期間中、皆が熱心に取り組んだ。13人の相性は抜群だった。」
当初、この言語には再帰は含まれていませんでした。委員会の一部メンバーの意向に反して、土壇場で仕様に挿入されました。[ 3 ]
元の報告書の著者数名が1962年4月に会合を開き、発生した問題を解決した。彼らの作業の結果、「アルゴリズム言語ALGOL 60の改訂報告書」が出版された。[ 4 ]
IFIP技術委員会2のワーキンググループ2.1により、さらなる明確化と入出力手順の追加が行われた。これらの取り組みは、1975年に「アルゴリズム言語ALGOL 60の修正レポート」として発表された。[ 5 ]
ALGOL 60 は、その後の多くの言語に影響を与えました。トニー・ホーアは次のように述べています。「これは時代をはるかに先取りした言語であり、前身の言語よりも優れているだけでなく、後継の言語のほとんどすべてをも凌駕しています。」[ 6 ] [ 7 ]
現在までに、ALGOL 60 の拡張、派生、派生言語、およびサブ言語が少なくとも 70 種類存在します。[ 8 ]
公式に定義されたALGOL 60には入出力機能がなく、実装ごとに独自の入出力機能が定義されていたため、互換性はほとんどありませんでした。一方、ALGOL 68は、豊富なトランスプット(ALGOL 68では入出力を指す)機能ライブラリを提供していました。
ALGOL 60 では、パラメータの受け渡しに2 つの評価戦略が提供されました。一般的な値渡しと名前渡しです。プロシージャ宣言では、各仮パラメータに対して、どちらを使用するかを指定しました。値渡しの場合は値を指定し、名前渡しの場合は省略しました。名前渡しでは、式で使用されるたびにすべてのパラメータが再計算されるため、参照渡しとは対照的に特定の効果があります。たとえば、パラメータを値または参照として指定しないと、実際に渡されるパラメータが整数変数と、その整数変数でインデックス付けされた配列である場合、2 つのパラメータの値を交換するプロシージャを開発することはできません。[ 21 ] swap(i, A[i]) へのポインタを関数に渡すことを考えてみてください。swap が参照されるたびに再評価されます。例えば、i := 1、A[i] := 2 とすると、swap が参照されるたびに、値の別の組み合わせ ([1,2]、[2,1]、[1,2] など) が返されます。実引数としてランダム関数を渡した場合も、同様の状況が発生します。
名前呼び出しは、それを実装するために使用される興味深い「サンク」によって、多くのコンパイラ設計者に知られています。ドナルド・クヌースは、 「再帰と非ローカル参照」を正しく実装しているコンパイラを区別するために、「大人か子供か」テストを考案しました。このテストには、名前呼び出しの例が含まれています。
ALGOL 60 レポートでは、参照言語、公開言語、およびいくつかのハードウェア表現という 3 つの異なるレベルの言語が認識されています。参照言語と公開言語には予約語はありませんが、レポートでは標準関数用にいくつかの識別子を予約することを推奨しています[ 22 ]。参照言語には、ALGOL 60 の時代に一般的だった 6 ビット文字セットでは使用できない小文字やその他の文字が含まれています。[ a ]
レポートではハードウェア表現について簡単に説明しています。実装によって、下線付きの独立した基本シンボルのハードウェア表現が異なります。[ 23 ]
また、区切り文字のハードウェア表現方法も異なっている。
修正レポートには、太字で表記された24個の基本記号があります。これらの単語は参照言語や出版言語では予約語ではありませんが、一部のハードウェア実装では予約語となっている場合があります。修正レポートには、そのような単語が24個あります。
ARRAYBEGINBOOLEANCOMMENTDOELSEENDFALSEFORGOTOIFINTEGERLABELOWNPROCEDUREREALSTEPSTRINGSWITCHTHENTRUEUNTILVALUEWHILE標準的なBurroughs Large Systemsサブ言語には、そのような予約語が35個あります。
ALPHAARRAYBEGINBOOLEANCOMMENTCONTINUEDIRECTDODOUBLEELSEENDEVENTFALSEFILEFORFORMATGOIFINTEGERLABELLISTLONGOWNPOINTERPROCEDUREREALSTEPSWITCHTASKTHENTRUEUNTILVALUEWHILEZIP標準のBurroughs Large Systemsサブ言語には、このような制限付き識別子が71個あります。
ACCEPTANDATTACHBYCALLCASECAUSECLOSEDEALLOCATEDEFINEDETACHDISABLEDISPLAYDIVDUMPENABLEEQLEQVEXCHANGEEXTERNALFILLFORWARDGEQGTRIMPININTERRUPTISLBLEQLIBERATELINELOCKLSSMERGEMODMONITORMUXNEQNONOTONOPENOROUTPICTUREPROCESSPROCUREPROGRAMDUMPRBREADRELEASEREPLACERESETRESIZEREWINDRUNSCANSEEKSETSKIPSORTSPACESWAPTHRUTIMESTOWAITWHENWITHWRITEまた、すべての固有関数の名前も記載されています。
手続き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 end end Absmax;
実装によって、太字で示されたテキストの書き方が異なります。例えば、一部の実装では、上記の「integer」の代わりに、引用符付きの「INTEGER」という単語を使用し、これを特別なALGOL記号として指定する必要があります。
以下のバージョンでは、IBM 7090 用のALCOR コンパイラ[ 24 ]でサポートされているハードウェア表現を使用しています。ALGOL シンボルはストロップされています。さらに、..コロン文字を表す.=ために、代入には、(/ and )/括弧の代わりに、.,セミコロンにはを使用します。小文字はサポートされていないため、大文字が使用されます。
'PROCEDURE' ABSMAX(A) SIZE..(N, M) RESULT..(Y) SUBSCRIPTS..(I, K)., 'VALUE' N、M.、'ARRAY' A.、'INTEGER' N、M、I、K.、'REAL' 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/)) 'GREATER' Y 'THEN' 'BEGIN' Y .= ABS(A(/P, Q/))., I .= P; K .= Q '終わり' 「END」ABSMAX.、
Elliott 803 ALGOLを使用してテーブルを作成する方法の例を以下に示します。 [ 25 ]
浮動点アルゴル試験 開始 実数 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 には I/O 機能がなかったため、 ALGOL には移植可能なハローワールド プログラムはありません。以下のプログラムは、Unisys A-Series メインフレーム用の ALGOL 実装でコンパイルおよび実行することができ(現在も可能です)、ミシガン大学ディアボーン校コンピュータおよび情報科学科の Hello world! ALGOL サンプル プログラム ページ[ 27 ]にあるThe Language Guide [ 26 ]から取得したコードを単純に簡略化したものです。
始める ファイル F(種類=リモート); EBCDIC配列E[0:11]; Eを「HELLO WORLD!」に置き換えてください。 WRITE(F, *, E); 終わり。
ここで、* などは FORTRAN で使用されるフォーマット指定を表します。例: [ 28 ]
インライン形式を使用したよりシンプルなプログラム:
BEGIN FILE F ( KIND = REMOTE ); WRITE ( F , < "HELLO WORLD!" > ); END .Displayステートメントを使用した、さらにシンプルなプログラム:
BEGIN DISPLAY ( "HELLO WORLD!" ) END .Elliott Algol I/O を使用した別の例は次のとおりです。Elliott Algol では、「開始文字列引用符」と「終了文字列引用符」に異なる文字が使用され、ここでは'と'で表されます。
プログラムHiFolks ; begin print ' Hello world ' end ;こちらはElliott 803 Algol (A104) 用のバージョンです。標準のElliott 803は5穴の紙テープを使用していたため、大文字のみでした。コードには引用符文字がなかったので、£ (ポンド記号) が引用符の開始に、? (疑問符) が引用符の終了に使用されました。特殊なシーケンスは二重引用符で囲まれました (例: £., L?? はテレプリンターで改行されました)。
ハイフォークスの 始める 「ハローワールド」を印刷しますか? 終わり'
ICT 1900 シリーズのAlgol I/O バージョンでは、紙テープまたはパンチ カードからの入力が可能でした。紙テープの「フル」モードでは小文字も使用できました。出力はラインプリンタに行われました。「(」、「)」、 「%」の使用に注意してください。[ 29 ]
「プログラム」(こんにちは) '始める' 「コメント」の開始引用符は「(」、終了引用符は「)」、印刷可能なスペースは スペースは無視されるため、% と表記してください。 テキストを書き込む('('HELLO%WORLD')'); '終わり' '仕上げる'この例では、outstring修正レポートで定義されている手順を使用します。
始める コメント:修正レポートからの入出力を使用します。GNU MARTコンパイラでコンパイルおよび実行されます。 outstring (1, "hello world!\n") 終わり
LEAPは、ALGOL 60プログラミング言語の拡張機能であり、トリプルの連想メモリを提供します。トリプル内の3つの項目は、オブジェクトの属性が特定の値を持つという関連付けを示します。LEAPは、1967年にジェローム・フェルドマン(カリフォルニア大学バークレー校)とポール・ロブナー(MITリンカーン研究所)によって開発されました。LEAPはSAILにも実装されています。