知識ベース

ALGOL 60

ALGOL 60Algorithmic Language 1960の略)は、ALGOLファミリーのコンピュータープログラミング言語のメンバーです。コードブロックと、それらを区切るための開始ペアと終了ペアを導入したALGOL 58に続きます。 ALGOL 60は、レキシカルスコープを持つネストされた関数定義を実装した最初の言語でした。 CPL、Simula、BCPL、B、Pascal、Cなど、他の多くのプログラミング言語が生まれました。

Niklaus Wirthは、Pascalの開発に移る前に、ALGOL 60を基に独自のALGOL Wを開発しました。 Algol-Wは次世代のALGOLであることが意図されていましたが、ALGOL 68委員会は、クリーンな簡素化されたALGOL 60ではなく、より複雑で高度な設計を決定しました。アルゴル68はアルゴル60とは実質的に異なり、そのように部分的に批判されているため、一般に「アルゴル」はアルゴル60の方言を指します。

標準化

ALGOL 60 — COBOLを使用—標準化を追求した最初の言語でした。

  • ISO 1538:1984プログラミング言語— Algol 60(安定化)
  • ISO / TR 1672:1977 ALGOL基本シンボルのハードウェア表現...(現在廃止)

歴史

ALGOL 60は、主に米国およびヨーロッパの研究コンピューター科学者によって使用されました。商用アプリケーションでの使用は、その記述に標準の入出力機能がなく、大規模なコンピューターベンダーが言語に興味を持っていないために妨げられました。ただし、ALGOL 60はアルゴリズムの公開の標準となり、将来の言語開発に大きな影響を与えました。

John Backusは、ALGOL 58専用のプログラミング言語を記述するBackus標準形式のメソッドを開発しました。ALGOL60のPeter Naurによって改訂および拡張され、Donald Knuthの提案でBackus–Naur形式に名前が変更されました。

ピーターナウア:「ALGOL Bulletinの編集者として、私は言語の国際的な議論に引き込まれ、1959年11月にヨーロッパ言語デザイングループのメンバーに選ばれました。この立場で、私はALGOL 60レポートの編集者で、 1960年1月にパリで開催されたALGOL 60会議の結果。」

次の人々がパリでの会議に参加しました(1月11日から16日まで)。

  • フリードリヒ・L・バウアー、ピーター・ナウア、ハインツ・ルティスハウザー、クラウス・サメルソン、バーナード・ヴォコイ、アドリアーン・ファン・ウィンガーデン、マイケル・ウッドガー(ヨーロッパ出身)
  • ジョン・W・バッカス、ジュリアン・グリーン、チャールズ・カッツ、ジョン・マッカーシー、アラン・J・ペルリス、ジョセフ・ヘンリー・ウェグシュタイン(米国出身)。

アラン・ペルリスは会議について鮮明な説明をしました。 13は素晴らしかった。」

この言語にはもともと再帰が含まれていませんでした。委員会の一部の意向に反して、土壇場で仕様に挿入されました。

ALGOL 60は、それに続く多くの言語に影響を与えました。 Tony Hoareは次のように述べています。「これはその時代よりもはるかに先の言語であり、前任者だけでなく後継者のほぼすべてをも改善した言語です。」 ALGOLのブロック構造と語彙範囲を採用したLispの変種であるSchemeプログラミング言語は、ALGOLに敬意を表して標準文書に「アルゴリズム言語スキームに関する改訂レポート」という文言も採用しました。

ALGOL 60実装タイムライン

現在までに、Algol 60の少なくとも70の拡張、拡張、派生、およびサブ言語がありました。

名前著者状態説明ターゲットCPU
X1 ALGOL 60 1960年8月エドガー・W・ダイクストラとヤープ・A・ゾンネフェルトオランダ ALGOL 60の最初の実装 Electrologica X1
アルゴル 1960 エドガー・T・アイアンズ米国アルゴル60 CDC 1604
バローズアルゴル
(いくつかのバリアント)
1961 バローズコーポレーション(ホア、ダイクストラなどが参加) 米国バローズ(および現在はユニシスMCPベース)コンピューターの基礎バローズの大規模システム
その中域も同様です。
ケースALGOL 1961 米国 Simulaは元々、ケースALGOLのシミュレーション拡張として契約されていました。 UNIVAC 1107
GOGOL 1961 ウィリアム・M・マッキーマン米国 ODINタイムシェアリングシステム用 PDP-1
DASK ALGOL 1961 ピーター・ナウア、ジョーン・ジェンセンデンマークアルゴル60 RegnecentralenのDASK
SMIL ALGOL 1962 トルギル・エクマン、カール・エリック・フレバーグスウェーデンアルゴル60 ルンド大学のSMIL
GIER ALGOL 1962 ピーター・ナウア、ジョーン・ジェンセンデンマークアルゴル60 RegnecentralenのGIER
ダートマスアルゴル30 1962 トーマス・ユージン・カーツ他米国 LGP-30
USS 90アルゴル 1962 L.ペトローネイタリア
エリオット・アルゴル 1962 カーホアイギリス 1980年のチューリング賞講演で議論されたエリオット803&エリオット503
アルゴル翻訳者 1962 G.ファンデルメイとWLファンデルポエルオランダスタッスベドリフデアポステリジェン、Telegrafie en Telefonie シマウマ
キッズグローブアルゴル 1963 FGダンカンイギリスイングリッシュエレクトリックカンパニーKDF9
バルゴール 1963 ヴァル・ショレ米国 META IIコンパイラコンパイラのテスト
FP6000アルゴル 1963 ロジャー・ムーアカナダサスカチュワン電力公社のために書かれた FP6000
砥石 1964 ブライアンランデルとローフォードジョンラッセルイギリス English Electric Companyの原子力部門。 Ferranti Pegasus、National Physical Laboratories ACE、およびEnglish Electric DEUCEの実装の前身。 イングリッシュエレクトリックカンパニーKDF9
NU ALGOL 1965年ノルウェーユニバック
アルゲック 1965年ソビエト連邦ミンスク-22 ALGOL-60およびCOBOLサポートに基づく、経済的なタスクのためのАЛГЭК
マルゴール 1966 publ。 A.ヴィイル、Mコトリ&M.ラケンディ、 エストニアSSR ミンスク-22
藻類 1967 GAMSグループ(ГАМС、группаавтоматизациипрограммированиядлямашинсреднегокласса)、Comecon Academies of Scienceの協力コメコンミンスク-22、後にES EVM、BESM
ALGOL / ZAM 1967 ポーランドポーランドのZAMコンピューター
中国のアルゴル 1972 中国記号システムを介して表される漢字
DG / L 1972 米国 DG Eclipseコンピューターファミリー
NASE 1990 エリック・シェーンフェルダードイツ通訳 LinuxおよびMS Windows
マースト 2000年アンドリュー・マホリンロシア Algol-60からCへのトランスレーター GNU Compiler CollectionでサポートされているすべてのCPU。 MARSTはGNUプロジェクトの一部です

バローズ方言には、ESPOLやNEWPなどの特別なシステムプログラミング方言が含まれていました。

物性

公式に定義されているALGOL 60にはI / O機能がありませんでした。実装は、相互にほとんど互換性のない方法で独自に定義しました。対照的に、ALGOL 68は、広範なトランスポートライブラリ(入力/出力用のALGOL 68用語)を提供しました。

ALGOL 60では、パラメーターを渡すための2つの評価戦略として、一般的な値による呼び出しと名前による呼び出しが許可されていました。名前による呼び出しには、参照による呼び出しとは対照的に、特定の効果があります。たとえば、パラメーターをvalueまたはreferenceとして指定せずに、渡される実際のパラメーターが整数変数およびその同じ整数変数によってインデックス付けされた配列である場合、2つのパラメーターの値を交換するプロシージャを開発することは不可能です。関数にswap(i、A)へのポインタを渡すことを考えてください。これで、スワップが参照されるたびに、再評価されます。 i:= 1およびA:= 2と言うと、swapが参照されるたびに、値の他の組み合わせ(、、など)が返されます。同様の状況は、実引数として渡されたランダム関数でも発生します。

名前による呼び出しは、それを実装するために使用される興味深い「サンク」で多くのコンパイラ設計者に知られています。ドナルド・クヌースは、「男または少年テスト」を考案して、「再帰および非ローカル参照」を正しく実装したコンパイラーを分離しました。このテストには、名前による呼び出しの例が含まれています。

ALGOL 60予約語と制限付き識別子

標準的なバローズの大規模システムのサブ言語には、このような予約語が35個あります。

  • アルファ
  • アレイ
  • ベギン
  • ブーリアン
  • コメント
  • 持続する
  • 直接
  • 行う
  • ダブル
  • その他
  • 終わり
  • イベント
  • ファイル
  • ために
  • フォーマット
  • 行く
  • IF
  • 整数
  • ラベル
  • リスト
  • 長いです
  • 自分の
  • ポインター
  • 手順
  • リアル
  • ステップ
  • スイッチ
  • 仕事
  • その後
  • TRUE
  • まで
  • ながら
  • 郵便番号

標準的なバローズの大規模システムのサブ言語には、このような制限付き識別子が71個あります。

  • 受け入れる
  • そして
  • アタッチ
  • 沿って
  • コール
  • 場合
  • 原因
  • 閉じる
  • 割り当て解除
  • 定義する
  • デタッチ
  • 無効にする
  • 表示
  • DIV
  • ダンプ
  • 有効にする
  • EQL
  • EQV
  • 交換
  • 外部
  • 記入
  • 進む
  • GEQ
  • GTR
  • IMP
  • 割り込み
  • IS
  • ポンド
  • LEQ
  • 解放する
  • ライン
  • ロック
  • LSS
  • マージ
  • モッド
  • モニター
  • MUX
  • NEQ
  • 番号
  • ない
  • オン
  • 開いた
  • または
  • でる
  • 画像
  • 処理する
  • 調達
  • プログラムダンプ
  • RB
  • 読む
  • リリース
  • 交換
  • リセット
  • リサイズ
  • 巻き戻し
  • 走る
  • スキャン
  • 求める
  • セットする
  • スキップ
  • ソート
  • スペース
  • スワップ
  • スルー
  • 待つ
  • いつ
  • 書く

また、すべての組み込み関数の名前。

標準演算子
優先オペレーター
最初
算術
最初 ↑(パワー)
第二 ×、/(実数)、÷(整数)
三番 +、-
第二 、≤、=、≥、>、≠
三番 ¬(ではない)
第4 ∧(および)
第五 ∨(または)
第六 ⊃(含意)
第七 ≡(同等)

例と移植性の問題

コードサンプルの比較

ALGOL 60 手続き Absmax(a)サイズ:(n、m)結果:(y)下付き文字:(i、k); n、m; 配列 a; 整数 n、m、i、k; 本当の y; コメントサイズn x mのマトリックスaの絶対最大要素がyに転送され、この要素の添字がiおよびkに転送されます。 整数 p、qを開始します。 y:= 0; i:= k:= 1; = 1つのステップ 1 N q に対して 行う まで :p に対して M = 1つのになるまで ステップ 1 を行う 場合 、ABS(A)> yは、次に Y 開始 := ABS(A)を、 i:= p; k:= q end end Absmax

実装は、太字のテキストの記述方法が異なります。一部の実装では、上記のintegerの代わりに、引用符を含む単語「INTEGER」を使用する必要があります。これにより、特別なキーワードとして指定されます。

以下は、Elliott 803 ALGOLを使用してテーブルを作成する方法の例です。

浮動小数点ALGOL TEST 'BEGIN REAL A、B、C、D' READ D 'FOR A:= 0.0 Step D UN 6.3 DO PRINT PUNCH(3)、££L ??' B:= SIN(A) 'C:= COS(A)' PRINT PUNCH(3)、SAMELINE、ALIGNED(1,6)、A、B、C 'END' END 'ALGOL 60ファミリー

ALGOL 60にはI / O機能がないため、ALGOLにはポータブルなHello Worldプログラムはありません。次のプログラムは、Unisys AシリーズメインフレームのALGOL実装上でコンパイルおよび実行できます(そしてこれからも実行されます)。ミシガン大学ディアボーンコンピュータおよび情報科学部Hello Worldの言語ガイドから取られたコードの簡単な単純化です。 ! ALGOLサンプルプログラムページ。

BEGIN FILE F(KIND = REMOTE); EBCDICアレイE; 「HELLO WORLD!」でEを置き換えます。 WRITE(F、*、E);終わり。

インライン形式を使用した簡単なプログラム:

BEGIN FILE F(KIND = REMOTE); WRITE(F、"HELLO WORLD!">);終わり。

Displayステートメントを使用したさらに簡単なプログラム:

BEGIN DISPLAY( "HELLO WORLD!")END。

Elliott Algol I / Oを使用する別の例は次のとおりです。エリオット・アルゴルは、「open-string-quote」と「close-string-quote」に異なる文字を使用しましたが、ここでは「と」で表されています。

プログラム HiFolks; プリント 開始 'Hello world' end ;

エリオット803アルゴル(A104)のバージョンは次のとおりです。標準のエリオット803は5穴の紙テープを使用していたため、大文字のみでした。コードには引用文字が含まれていなかったため、公開引用符には£(英国ポンド記号)が使用され、? (疑問符)近い引用。特別なシーケンスを二重引用符で囲みました(例:££L ??がテレプリンターで新しい行を作成しました)。

HIFOLKS 'BEGIN PRINT£HELLO WORLD£L ??'終わり'

ICT 1900シリーズのAlgol I / Oバージョンでは、紙テープまたはパンチカードからの入力が許可されていました。紙テープの「フル」モードでは小文字を使用できました。出力はラインプリンターへでした。 '('、 ')'および%の使用に注意してください。

「プログラム」(こんにちは)「開始」「コメント」開いている引用符は「(」、「閉じる」は「)」です。スペースが無視されるため、印刷可能スペースを書き込む必要があります。 WRITE TEXT( '(' HELLO%WORLD ')'); 「終了」「終了」