| アルゴル | |
|---|---|
1965年のALGOL-20マニュアル | |
| パラダイム | 手続き型、命令型、構造化型 |
| 家族 | アルゴル |
| デザイン: | バウアー、ボッテンブルッフ、ルーティシャウザー、ザメルソン、バッカス、カッツ、パーリス、ウェグシュタイン、ナウル、ヴォーコワ、ファン・ワインガーデン、ウッジャー、グリーン、マッカーシー |
| 初登場 | 1958 (1958年) |
| タイピングの規律 | 静的、強い |
| 範囲 | 語彙 |
| 影響を受けた | |
| その後のほとんどの命令型言語(いわゆるALGOL系言語を含む) 、例えばPL/I、Simula、Pascal、C、Scheme | |
ALGOL(/ ˈæ lɡɒ l , -ɡɔː l / ;「アルゴリズム言語」の略)[ 1 ]は、 1958年に開発された命令型コンピュータプログラミング言語のファミリーです。ALGOLは他の多くの言語に大きな影響を与え、30年以上にわたってACM( Association for Computing Machinery )の教科書や学術資料でアルゴリズム記述の標準的な方法でした。[ 2 ]
現代の言語の構文のほとんどが「Algolに似ている」という意味で、 [ 3 ] Algolは、ほぼ同時期に存在したFORTRAN、Lisp、COBOLという他の3つの高級プログラミング言語よりも影響力があったと言えるでしょう。[ 4 ] FORTRANで問題視されていたいくつかの問題を回避するように設計され、最終的にはPL / I、Simula、BCPL、B、Pascal、Ada、Cなど、他の多くのプログラミング言語の誕生につながりました。
ALGOLはコードブロックと、それらを区切るためのbegin...ペアを導入しました。また、レキシカルスコープを持つネストされた関数定義を実装した最初の言語でもありました。さらに、ALGOLは形式言語定義に細心の注意を払った最初のプログラミング言語であり、Algol 60レポートを通じて、言語設計のための主要な形式文法記法で あるバッカス・ナウア記法を導入しました。end
主な仕様は 3 つあり、最初に公開された年にちなんで名付けられています。
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 ] Lispの派生言語であるSchemeプログラミング言語も、ALGOLのブロック構造と語彙範囲を採用し、ALGOLへの敬意を表して、標準文書に「アルゴリズム言語Schemeの改訂報告書」という文言を採用しました。[ 15 ]
公式に定義されたALGOL 60にはI/O機能が存在せず、実装はそれぞれ独自の方法でI/Oを定義していましたが、それらの実装は互いに互換性がほとんどありませんでした。対照的に、ALGOL 68は広範なトランスプット(入出力)機能のライブラリを提供していました。
ALGOL 60 では、パラメータを渡すための2 つの評価戦略が許可されていました。1 つは一般的な値渡し、もう1 つは名前渡しです。名前渡しは参照渡しとは対照的に特定の効果があります。たとえば、パラメータを値または参照として指定しないと、渡される実際のパラメータが整数変数と、同じ整数変数でインデックス付けされた配列である場合に、2 つのパラメータの値を交換するプロシージャを開発することは不可能です。[ 16 ] swap(i, A[i]) へのポインタを関数に渡すことを考えてみましょう。swap が参照されるたびに、再評価されます。たとえば、i := 1 で A[i] := 2 の場合、swap が参照されるたびに、値の別の組み合わせ ([1,2]、[2,1]、[1,2] など) が返されます。同様の状況が、実際の引数として渡されるランダム関数でも発生します。
名前呼び出しは、その実装に使用される興味深い「サンク」によって、多くのコンパイラ設計者に知られています。ドナルド・クヌースは、「再帰と非局所参照」を正しく実装したコンパイラを区別するために、「男か少年かテスト」を考案しました。このテストには、名前呼び出しの例が含まれています。
ALGOL 68は、 Adriaan van Wijngaardenによって発明され、彼の名前を冠した2階層の文法形式を用いて定義されました。Van Wijngaarden文法は文脈自由文法を用いて、特定のALGOL 68プログラムを認識する無限の規則を生成します。特に、他の多くのプログラミング言語標準では「セマンティクス」とラベル付けされ、曖昧さを伴いやすい自然言語の散文で表現され、その後、形式言語パーサーに付随するアドホックコードとしてコンパイラに実装されるような要件を表現できます。
このセクションは、コードサンプルの出典を示す注釈を追加することで拡張する必要があります。Wikipediaでは、個々の編集者による創作物やその他の独自の研究の提示は許可されていないためです。不足している情報を追加していただければ、ご協力いただけます。 (2024年2月) |
(太字のテキストの書き方は実装によって異なります。たとえば、整数の場合は引用符を含む '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の開始 読むD' A:= 0.0 ステップD 6.3まで実行 始める 印刷パンチ(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テスト: ( 実数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 プログラムで簡単に実証されます。
ALGOL 58 には I/O 機能はありませんでした。
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')'); '終わり' ALGOL 68コードは、予約語が通常は小文字で、太字または下線が引かれた状態で公開されました。
始める printf(($gl$,"こんにちは、世界!")) 終わり
「アルゴル 68 レポート」の言語では、入出力機能は総称して「トランスプット」と呼ばれていました。
ALGOL は、文字セットが多様で急速に進化していた時代に考案されました。また、ALGOL は大文字のみを必要とするように定義されました。
1960年:IFIP – Algol 60言語と報告書には、現代のコンピュータやオペレーティングシステムで使用できるものの、残念ながら当時のほとんどのコンピュータシステムではサポートされていない数学記号がいくつか含まれていました。例えば、×、÷、≤、≥、≠、¬、∨、∧、⊂、≡、␣、⏨などです。
1961年9月: ASCII –当時開発の初期段階にあったASCII文字セットに、 ALGOLのブール演算子/\と\/をサポートするために\ (バックスラッシュ)文字が追加されました。[ 19 ]
1962年: ALCOR – この文字セットには、乗算用の珍しい「᛭」ルーン十字[ 20 ]文字と、浮動小数点表記用の「⏨」小数点指数記号[ 21 ]が含まれていました。[ 22 ] [ 23 ] [ 24 ]
1964年: GOST – 1964年のソビエト標準GOST 10859は、 ALGOLで4ビット、5ビット、6ビット、7ビットの文字のエンコードを許可しました。[ 25 ]
1968年:「アルゴル68報告書」 – 既存のALGOL文字を使用し、さらにタイプボール(またはゴルフボール)プリントヘッド(APLゴルフボールなど)が挿入されたIBM 2741キーボードにある→、↓、↑、□、⌊、⌈、⎩、⎧、○、⊥、および¢文字を採用しました。これらは、ALGOL 68の草稿が書かれていた1960年代半ばに利用可能になりました。この報告書はロシア語、ドイツ語、フランス語、およびブルガリア語に翻訳され、ソビエトBESM -4のキリル文字など、より大きな文字セットを持つ言語でのプログラミングを可能にしました。ALGOLのすべての文字はUnicode標準の一部でもあり、そのほとんどはいくつかの一般的なフォントで利用できます。
2009年10月: Unicode –⏨浮動小数点表記のための(十進指数記号)が、歴史的なBuranプログラムのALGOLソフトウェアとの後方互換性のためにUnicode 5.2に追加されました。[ 26 ]
現在までに、Algol 60には少なくとも70の拡張、派生、サブ言語が存在しています。[ 27 ]
| 名前 | 年 | 著者 | 国 | 説明 | ターゲットCPU |
|---|---|---|---|---|---|
| ZMMD実装 | 1958 | フリードリヒ・L・バウアー、ハインツ・ルーティハウザー、クラウス・ザメルソン、ヘルマン・ボッテンブルッフ | ALGOL 58の実装 | Z22 (後にツーゼのZ23はアルゴル60コンパイラを搭載して提供された)[ 28 ] | |
| X1 アルゴル 60 | 1960年8月[ 29 ] | エドガー・W・ダイクストラとヤープ・A・ゾンネフェルト | ALGOL 60の最初の実装[ 30 ] | エレクトロロジカ X1 | |
| エリオット・アルゴル | 1960年代 | CARホーア | 1980年のチューリング賞講演のテーマ[ 31 ] | エリオット803、エリオット503、エリオット4100シリーズ | |
| 陽気な | 1960 | ジュールス・シュワルツ | エイダ以前のDOD HOL | 各種(記事参照) | |
| バローズ・アルゴル (いくつかの亜種) | 1961 | バローズ・コーポレーション(ホーア、ダイクストラらが参加) | Burroughs(現在はUnisys MCPベース)コンピュータの基礎 | Burroughs Large Systemsとそのミッドレンジも同様です。 | |
| ALGOLのケース | 1961 | ケース工科大学[ 32 ] | SimulaはもともとCase ALGOLのシミュレーション拡張として契約されました。 | ユニバック 1107 | |
| ゴーゴリ | 1961 | ウィリアム・M・マッキーマン | ODINタイムシェアリングシステムの場合[ 33 ] | PDP-1 | |
| RegneCentralen ALGOL | 1961 | ピーター・ナウア、ヨーン・イェンセン | 完全なAlgol 60の実装 | RegnecentralenのDASK | |
| ダートマス ALGOL 30 | 1962 | Thomas Eugene Kurtz他 | LGP-30 | ||
| USS 90 アルゴル | 1962 | L. ペトローネ | |||
| アルゴル60 | 1962 | ベルナール・ヴォーコワ、ルイ・ボリエ[ 34 ] | Institut d'Informatique et Mathématiques Appliquées de Grenoble (IMAG) および Compagnie des Machines Bull | ブルガンマ60 | |
| アルゴル翻訳者 | 1962 | G. ファン デル メイとWL ファン デル ポール | Staatsbedrijf der Posterijen、電信電話 | ゼブラ | |
| キッズグローブ・アルゴル | 1963 | FGダンカン | イングリッシュ・エレクトリック・カンパニーKDF9 | ||
| ヴァルゴル | 1963 | ヴァル・ショレ | META IIコンパイラ のテスト | ||
| 砥石 | 1964 | ブライアン・ランデルとLJ・ラッセル | イングリッシュ・エレクトリック社の原子力部門。Ferranti Pegasus、国立物理学研究所ACE、そしてイングリッシュ・エレクトリック社のDEUCE実装の前身。 | イングリッシュ・エレクトリック・カンパニーKDF9 | |
| ニューアルゴル | 1965 | ユニバック | |||
| アルゲック | 1965 | АЛГЭКは、ALGOL-60とCOBOLのサポートに基づいており、経済的なタスクに適しています。 | ミンスク22 | ||
| アルゴルW | 1966 | ニクラウス・ヴィルト | ALGOL 60の後継提案 | IBM システム/360 | |
| マルゴル | 1966 | 公開。 A. ヴィイル、M コトリ、M. ラケンディ、 | ミンスク22 | ||
| アルガム | 1967 | GAMS グループ (ГАМС, группа автоматизации программирования для мазин среднего класса)、コメコン科学アカデミーの協力 | コメコン | ミンスク-22、後にES EVM、BESM | |
| アルゴル/ザム | 1967 | ポーランドのZAMコンピューター | |||
| シミュラ67 | 1967 | オーレ=ヨハン・ダールとクリステン・ナイガード | Algol 60とクラス | ユニバック 1107 | |
| トリプレックス-ALGOLカールスルーエ | 1967/1968 | カールスルーエ、ドイツ | 区間演算のための三重数を用いたALGOL 60(1963) | [ 35 ] | |
| 中国のアルゴル | 1972 | 記号システムで表現された漢字 | |||
| DG/L | 1972 | DG Eclipseファミリーのコンピュータ | |||
| S-アルゴル | 1979 | ロン・モリソン | 教育言語としての使用を目的とした直交データ型の追加 | PDP-11とその後のJava VM実装 |
Burroughs方言には、ESPOLやNEWPといった特殊なブートストラッピング方言が含まれていました。NEWPは現在でもUnisys MCPシステムソフトウェアで使用されています。
これは、GOSTベースのソフトウェアやドキュメントをトランスコードする必要性が依然として生じる可能性があることを意味します。BESM-6の非IEEE浮動小数点表現に最適化された従来の数値アルゴリズム(例えば、ブラン宇宙船の自動着陸など)は、単純に再コンパイルするだけでは確実に動作することは期待できず、人為的な介入が必要になる場合があります。