ALGOL Wはプログラミング言語です。ALGOL 60の後継としてNiklaus WirthとTony Hoareが提案したALGOL Xを基にしています。ALGOL W は、元の ALGOL 60 を比較的簡単にアップグレードしたもので、 文字列、ビット文字列、複素数、レコードへの参照データ型を追加し、結果渡しによるパラメータの受け渡しを可能にし、ステートメントを導入し、ステートメントをに置き換え、言語全体をより洗練させています。whileswitchcase
ヴィルトの提出物はALGOL 60からの進歩が少なすぎるとみなされ、後にALGOL 68となるアドリアーン・ファン・ワインガルデンのより複雑な提出物が、非常に議論の多い会議で選ばれた。ヴィルトは後に自身のバージョンを「ALGOLの開発への貢献」として発表した。[ 1 ]いくつかの小さな追加を経て、これが最終的にALGOL Wとなった。
ワースは、スタンフォード大学でIBM System/360の高品質な実装を監督し、それは広く普及した。[ 2 ] [ 3 ]この実装は、ワースが設計したALGOLライクなアセンブリ言語であるPL360で記述された。この実装には、影響力のあるデバッグ機能とプロファイリング機能が含まれている。
ALGOL WはPascal言語の基礎となった言語であり、PAScalの経験がある人ならALGOL Wの構文はすぐに馴染むだろう。主な違いは、PAScalにおけるレコード処理の改善と、奇妙なことに、PAScalの初期バージョンで最も不満の多かった機能の一つである、実行時に配列の長さを定義する機能がALGOL Wから削除されたことである。
ALGOL W の構文は、 EBCDIC文字エンコーディングセットのサブセットに基づいて構築されています。ALGOL 60では、予約語は個別の語彙項目ですが、ALGOL W では、予約語は単なる文字のシーケンスであり、ストロプ化する必要はありません。予約語と識別子はスペースで区切られます。[ 2 ]このように、ALGOL W の構文はPascal以降の言語の構文に似ています。
ALGOL W 言語記述[ 4 ]は、バッカス・ナウア記法(BNF)に似た接辞文法で ALGOL W を定義しています。この形式文法は、ヴァン・ワインガルデン文法[ 1 ] [ 5 ]の前身でした。
ALGOL W の意味論の多くは文法的に定義されています: [ 4 ]
⟨procedure identifier⟩プロシージャ宣言によって定義された識別子であり、 はジャンプ⟨label identifier⟩ラベルとして使用されている識別子です。⟨τ function identifier⟩τ⟨integer function identifier⟩⟨integer expression⟩ / ⟨integer expression⟩と は⟨real expression⟩ / ⟨real expression⟩有効な構文要素ですが、式を表す異なる構文要素です。しかし、⟨real expression⟩ DIV ⟨integer expression⟩(つまり、浮動小数点値に対して整数除算を実行する)は無効な構文要素です。これは、ヌル参照の使用を含む、 ALGOL Wのレコード型機能を示しています。[ 2 ]
RECORD PERSON ( STRING ( 20 ) NAME ; INTEGER AGE ; LOGICAL MALE ; REFERENCE ( PERSON ) FATHER , MOTHER , YOUNGESTOFFSPRING , ELDERSIBLING ) ;REFERENCE ( PERSON ) PROCEDURE YOUNGESTUNCLE ( REFERENCE ( PERSON ) R ) ; BEGIN REFERENCE ( PERSON ) P , M ; P := YOUNGESTOFFSPRING ( FATHER ( FATHER ( R ))) ; WHILE ( P ¬ = NULL ) AND ( ¬ MALE ( P )) OR ( P = FATHER ( R )) DO P := ELDERSIBLING ( P ) ; M := YOUNGESTOFFSPRING ( MOTHER ( MOTHER ( R ))) ; WHILE ( M ¬ = NULL ) AND ( ¬ MALE ( M )) DO M := ELDERSIBLING ( M ) ; PがNULLの場合、 Mとします。MがNULL の場合、Pとします。AGE ( P ) < AGE ( M )の場合、 Pとします。それ以外の場合はMとします。