ALGOL
| ALGOL | |
|---|---|
| パラダイム | 構造化プログラミング |
| 型付け | 強い静的型付け |
| 方言 | ALGOL 60、ALGOL 68 |
| 影響を与えた言語 | Pascal、C言語、PL/I、Simula |
ALGOL(アルゴル)は、プログラミング言語の一つ。
1950年代後半、FORTRAN等の言語が米国で作られていたのに対抗して、ヨーロッパの研究者が、世界共通のプログラミング言語として開発した。アルゴリズムの研究開発に用いる目的で作成され、アルゴリズム記述のデファクトスタンダードとして普及した。PL/I、PascalやC言語等、後の言語開発に大きな影響を与えたとされるが、現在ではほとんど利用されていない。正確にはALGOLとは下記ALGOL系列の総称で、単に「ALGOL」という名の言語は存在しない。名前「ALGOL」は「アルゴリズム言語」を意味する英語「algorithmic language」に由来する。
目次 |
[編集] 歴史
1958年にチューリッヒで行われた国際会議で提案されたのが起源とされる、この言語は後にALGOL 58と呼ばれるようになったが、当初はIAL(International Algorithmic Language)と呼ばれていた。
1960年に提案されたALGOL 60では、文法がBNF記法で記述され、構造化プログラミングの考え方を形づけている。
1968年には、後継としてALGOL 68が開発された。ALGOL 68では、2段階文法のWijngaarden(ワインハールデン)記法で文法が記述された。ALGOL 60の後継言語制定に至るまでの候補としてニクラウス・ヴィルト(Niklaus Wirth、Pascalの設計者)のALGOL W、日本で設計されたALGOL N等もあったが最終的にALGOL 68が後継として制定された。しかし、あまりに複雑かつ巨大な仕様のためALGOL 68コンパイラの実装は難しく、またWijngaarden記法が難解なこともあり実用的には、ほとんど普及しなかった。
言語の標準化としては、IFIP TC2/WG2.1においてALGOL 60が制定された。その後、遅々として標準化作業はすすまず、1984年になって、ISOでALGOL 60相当の言語が標準化されたのみである。日本では、かつてALGOL 60の言語規格と入出力ライブラリ規格をそれぞれJIS規格で制定していたが (JIS C 6210~6219)、1983年(昭和58年)9月1日付で廃止された。
[編集] 特徴
同時期のFORTRAN、COBOLと比べると、これらの言語が特定のハードウェア上で特定の目的を効率良くこなすための一種のドメイン特化型言語から始まったのに対し、ALGOLはいったんハードウェアの特性は置いておき、抽象的なアルゴリズムを手続きとして記述する事を目指している。初期のALGOL 60仕様では入出力手続きすら標準化されていなかった点から見ても、できる限り言語コアの抽象度を上げようとしていたことは想像に難くない。FORTRAN、COBOLが直系子孫以外に余り枝分かれをしていないのに対して、ALGOL系が大きな多様性を獲得したのもこの抽象性による所大と言える。従ってALGOLの策定をもって、ソフトウェアのモジュール化、計算機の汎用化が始まった瞬間と捉えても差し支えないであろう。
ALGOL 60は、手続き型言語として初めて再帰呼び出しが可能なプログラミング言語である。
公式のALGOL 60では入出力機能が定義されていなかったため、実際の処理系ではそれぞれに互換性のない方法で実装された。それに対して、ALGOL 68ではtransput(ALGOL 68の用語で入出力を意味する)のための豊富なライブラリが提供された。
ALGOL 60では引数渡しに2種類の評価方法が定義されている。一般的な値渡しとALGOLに特徴的な名前渡しである。名前渡しは遅延評価の一種と考えられ、使いこなすのが難しい機能でもある。詳しくは引数を参照されたい。
ALGOLが後の言語に与えた最大の影響は、begin/end(Cなどでは{})の入れ子によるブロック構造化、つまり次のような典型的な形の記法である。
begin x := 1; if (x > 0) then begin ... end end
俗に「ALGOL文法」といった場合は、このブロック構造化記法のことを指している。
式と文を持ち、字下げ(必須ではないが)されたブロック構造で手続きを記述していくというALGOL系文法は、記述力と可読性のバランスが良好なため、主流派言語の中では最大勢力となっている。純粋に手続き型のものでPascalやC、Simula系のオブジェクト指向言語からはC++、Java、その他それらを簡略化した各種スクリプト言語など、似た文法の言語は枚挙に暇がない。
[編集] コード例
次のコードはALGOL 60で n × m の2次元配列の中から絶対値が最大の要素を求め、その絶対値をyに、添え字をiとkに格納する手続きを記述したものである。なお、コード中で強調表示されている予約語の記法は処理系に依存する。
procedure Absmax(a) Size:(n, m) Result:(y) Subscripts:(i, k);
value n, m; array a; integer n, m, i, k; real y;
comment The absolute greatest element of the matrix a, of size n by m
is transferred to y, and the subscripts of this element to i and k;
begin integer 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
[編集] 関連項目
[編集] 外部リンク
- Algol 68 Genie - GPL配布によるフリーのALGOL68 インタプリタ
- Algol60 compiler and interpreter - MS-DOS上で動くフリーのALGOL60コンパイラが配布されている。
- Revised Report on the Algorithmic Language Algol 60