「ALGOL」の版間の差分

提供: miniwiki
移動先:案内検索
(参考文献)
 
 
(同じ利用者による、間の2版が非表示)
10行目: 10行目:
 
}}
 
}}
 
{{プログラミング言語}}
 
{{プログラミング言語}}
{{lang|en|'''ALGOL'''}}('''アルゴル''')は、[[命令型プログラミング|命令型]][[プログラミング言語]]ファミリーの1つ<ref group="注">ファミリー名は大文字/小文字をまじえて表記される場合 ([http://www.masswerk.at/algol60/report.htm ''Algol 60'']) と、全て大文字で表記される場合 (''ALGOL 68'') がある。本項目では ''ALGOL'' で統一する。</ref>。名前「{{lang|en|ALGOL}}」は「アルゴリズム言語」を意味する英語「{{lang|en|<u>algo</u>rithmic <u>l</u>anguage}}」に由来する。1950年代中ごろに開発され、多くの言語に影響を及ぼし、[[Association for Computing Machinery|ACM]]や教科書や学術論文などで[[アルゴリズム]]記述の[[デファクトスタンダード]]として30年以上使われた<ref>[http://calgo.acm.org/ ''Collected Algorithms of the ACM''] [[Association for Computing Machinery|ACM]]によるアルゴリズム集</ref>。現代の多くの言語が「ALGOL系」あるいは「ALGOL風」(algol-like) とされているという意味で<ref>{{Cite web| url= http://www.eecs.qmul.ac.uk/~ohearn/Algol/intro.html | title=Algol-like languages ,Introduction | author1=P. W. O'Hearn | author2=R. D. Tennent | date=September 1996 | accessdate= 2012-01-17}}</ref>、ほぼ同世代の[[高水準言語]]である [[FORTRAN]]、[[LISP]]、[[COBOL]] に比べて最も成功したと言うこともできる。[[FORTRAN]]で明らかとなった問題を防ぐよう設計され、[[BCPL]]、[[B言語|B]]、[[Pascal]]、[[Simula]]、[[C言語|C]]といった様々なプログラミング言語に影響を与えた。ALGOLは<ref group="注">Lisp以外としては</ref>「<code>begin</code> と <code>end</code> で囲む」という構文による[[ブロック (プログラミング)|ブロック]]構造を導入し、[[制御構造]]を自在に入れ子(ネスト)にできる初の広まった言語となった<ref group="注">FORTRANにはそのような構造は無い。COBOLではピリオドで全ての入れ子が終端するという仕様だったため(現在は<code>end-if</code>などを使う)、入れ子で書ける論理に制限があり、酷いバグの原因にもなりやすかった。</ref>。また構文の形式的定義を真剣に検討した最初のプログラミング言語でもあり、"Algol 60 Report"<ref name="Algol60Report" /> で導入された[[バッカス・ナウア記法]]は、その後のコンピュータ言語等の構文の形式的定義を示す手法として(プログラミング言語だけに限られず)定番の記法となっている。
+
{{lang|en|'''ALGOL'''}}('''アルゴル'''
  
== 主なバージョン ==
+
コンピュータの[[プログラム言語]]の一つ。数値あるいは記号処理を正確に表現する算法記述向きの言語で,科学技術計算に使われる。[[フォートラン]]の成功に刺激され,1958年からアメリカ,およびヨーロッパの大学関係者たちのアルゴル委員会によって開発され,60年のパリ会議で発表された。これを ALGOL60という。これはプログラム言語の理論,および翻訳ルーチンなど理論的研究を基礎としているため,プログラム言語一般に大きな影響を与えた。 68年にさらに機能拡張をした ALGOL68が発表された。
次の3つの主要な仕様が存在する。後ろについている数は最初に発表された年を表している。
+
   
; {{仮リンク|ALGOL 58|en|ALGOL 58}}
 
: 当初 '''IAL''' ('''I'''nternational '''A'''lgorithmic '''L'''anguage) という名称で提案された。
 
; {{仮リンク|ALGOL 60|en|ALGOL 60}}
 
: 1960年中ごろに ''X1 ALGOL 60'' として実装されたのが最初で、1963年に改訂された<ref name="Algol60Report">{{Cite book | title=Report on the Algorithmic Language ALGOL 60 | location=Copenhagen | month=May |year=1960 | doi=10.1145/367236.367262 | issn=0001-0782 | editor1-first=Peter |editor1-last=Naur | first1=J. W. |last1=Backus | first2=F. L. |last2=Bauer | first3=J. |last3=Green | first4=C.    |last4=Katz | first5=J. |last5=McCarthy | first6=A. J. |last6=Perlis | first7=H. |last7=Rutishauser | first8=K. |last8=Samelson | first9=B.    |last9=Vauquois | first10=J. H.|last10=Wegstein | first11=A. |last11=van Wijngaarden | first12=M. |last12=Woodger | unused_data=Ed. P. Naur}}</ref><ref>{{Cite web |title=Revised Report on the Algorithmic Language Algol 60 |year=1963 |url= http://www.masswerk.at/algol60/report.htm |accessdate= 2007-06-08 | archiveurl= http://web.archive.org/web/20070625171638/http://www.masswerk.at/algol60/report.htm| archivedate= 25 June 2007 | deadurl= no}}</ref>。
 
; {{仮リンク|ALGOL 68|en|ALGOL 68}}
 
: 1968年に発表され、1973年に改訂された<ref>{{Cite web |title=Revised Report on the Algorithmic Language ALGOL 68 |year=1973 |url= http://www.diegolucenapumar.com/sda3/home/Algol/Algol%2068/Algol68-RevisedReport.pdf |accessdate=2010-08-25}}</ref>。可変配列、スライス、並列性、演算子識別、その他の拡張可能な機能などが新たに導入されている。
 
 
 
IAL (ALGOL 58) は後の様々なプログラミング言語(いわゆるALGOL系言語)に大きな影響を及ぼし、一般にそれらの先祖とみなされている。また、ALGOLの仕様で示された[[中間コード]]は '''ALGOL object code''' と呼ばれ、単純でコンパクトなスタックベースの[[命令セット]]アーキテクチャであり、[[計算機科学]]の分野で[[コンパイラ]]構築の教育に使われ、他の高水準言語の実装にも使われた。
 
 
 
== 歴史 ==
 
1950年代後半、{{lang|en|[[FORTRAN]]}}等の言語が[[アメリカ合衆国|米国]]で作られていたのに対抗して、[[ヨーロッパ]]の学術研究者が世界共通のプログラミング言語として開発した。ALGOLは[[1958年]]に[[チューリッヒ工科大学]]で行われた国際会議で提案されたものが起源とされる。現代のプログラミング言語と比べて著しく異なる点のひとつに、reference syntax、publication syntax、implementation syntax という3種類の構文がある、ということが挙げられる。当時は[[文字コード]]の標準化以前であり、また数学の数式のように印刷したいという要望などもあったため、そのようなことになっている(違いは具象の違いであり、抽象構文は共通である)。これにより、キーワード名や小数点に使用する記号(カンマかピリオドか)を選ぶことなどもできた。
 
 
 
ALGOL 58 は主に欧米の計算機科学者が[[アルゴリズム]]の[[研究開発]]に用いた。商用アプリケーションにはあまり採用されていない。その原因は[[入出力]]機能が標準仕様に含まれていなかったためであり、また[[バロース]]以外の大手コンピュータメーカーがこの言語に興味を示さなかったためである。
 
 
 
[[ジョン・バッカス]]は ALGOL 58 を主たる対象としてプログラミング言語の文法を記述する[[バッカス・ナウア記法|バッカス正規記法]] (Bakus normal form) を開発した。[[ピーター・ナウア]]はそれを ALGOL 60 向けに拡張・改訂。[[ドナルド・クヌース]]が[[バッカス・ナウア記法]] (Bakus-Naur Form) と改称することを提案した<ref>{{Cite journal| last=Knuth | first=Donald E. | year=1964 | title=Backus Normal Form vs Backus Naur Form | journal=Communications of the ACM | volume=7 | issue=12 | pages=735–736 | doi = 10.1145/355588.365140 }}</ref>。
 
 
 
ピーター・ナウアは ''ALGOL Bulletin'' という学術誌の編集者としてこの言語の国際的議論に参加し、1959年11月にヨーロッパの言語設計グループの一員に選ばれた。そして "Algol 60 Report" の編集者となり、1960年1月にパリで開催された ALGOL 60 についての国際会議の結果を発表した<ref name="naur_acm">[http://awards.acm.org/citation.cfm?id=1024454&srt=all&aw=140&ao=AMTURING&yr=2005 ACM Award Citation / Peter Naur], 2005</ref>。
 
 
 
このパリでの会議(1960年1月1日から16日まで開催)には以下の人々が参加している。
 
; ヨーロッパからの参加者
 
: {{仮リンク|フリードリッヒ・L・バウアー|en|Friedrich L. Bauer}}、[[ピーター・ナウア]]、[[ハインツ・ルティシュハウザー]]、{{仮リンク|クラウス・サメルソン|en|Klaus Samelson}}、Bernard Vauquois、{{仮リンク|アドリアン・ファン・ワインハールデン|en|Adriaan van Wijngaarden}}、Michael Woodger
 
; アメリカからの参加者
 
: [[ジョン・バッカス]]、Julien Green、Charles Katz、[[ジョン・マッカーシー]]、[[アラン・パリス]]、Joseph Henry Wegstein
 
アラン・パリスはこの会議について、「会合は疲れさせるもので、果てしなく、活発だった。ある人のよいアイデアが悪いアイデアと共に却下されると、その人は機嫌を損ねた。それにもかかわらず、期間中ずっと勤勉さが持続した。13人の作用は素晴らしいものだった」と評している。
 
 
 
ALGOL 60 はその後の多数の言語に影響を与えた。[[アントニー・ホーア]]は ALGOL 60 を「時代に先行していて、それまでの言語の改良だっただけでなく、その後のほぼ全ての後継者の先駆者となった言語」と評している<ref>[http://www.eecs.umich.edu/~bchandra/courses/papers/Hoare_Hints.pdf "Hints on Programming Language Design"], C.A.R. Hoare, December 1973. Page 27. (なお、この言葉は間違って[[エドガー・ダイクストラ]]のものとされることがある。ダイクストラも ALGOL 60 [[コンパイラ]]の実装に参加していた)</ref>。[[Scheme]]というLisp方言の設計者は、その[[静的スコープ]]は ALGOL からの影響だと述べている<ref group="注">ALGOL自身(ALGOL 60)にはFUNARG問題([[:en:Funarg problem]])などは無いため、静的スコープにまつわる難しい点などもないことから、強い関連を求めるならばおそらくALGOL 68になる。</ref>。またSchemeの仕様の名称 "Revised Report on the Algorithmic Language Scheme" もALGOLへのオマージュである<ref name="r3rs">{{Cite web| author=Jonathan Rees and William Clinger (Editors), Hal Abelson, R. K. Dybvig et al. | title=Revised(3) Report on the Algorithmic Language Scheme, (Dedicated to the Memory of ALGOL 60) | url= http://groups.csail.mit.edu/mac/ftpdir/scheme-reports/r3rs-html/r3rs_toc.html |accessdate= 2009-10-20}}</ref>。
 
 
 
1968年には、後継として '''{{lang|en|ALGOL}} 68''' が開発された。{{lang|en|ALGOL}} 68 では、2段階文法のワインハールデン記法で文法が記述された。{{lang|en|ALGOL}} 60 の後継言語制定に至るまでの候補として[[ニクラウス・ヴィルト]]の {{lang|en|ALGOL W}}、日本で設計された {{lang|en|ALGOL N}} 等もあったが最終的に {{lang|en|ALGOL}} 68 が後継として制定された。しかし、あまりに複雑かつ巨大な仕様のため {{lang|en|ALGOL}} 68 コンパイラの実装は難しく、またワインハールデン記法が難解なこともあり実用的には、ほとんど普及しなかった。そのため単に ALGOL と言った場合にはALGOL 68 ではなくて ALGOL 60 やその方言を指すのが一般的である。
 
 
 
言語の標準化としては、IFIP TC2/WG2.1 において {{lang|en|ALGOL}} 60 が制定された。その後、遅々として標準化作業はすすまず、1984年になって、[[国際標準化機構|ISO]]で {{lang|en|ALGOL}} 60 相当の言語が標準化されたのみである。日本では、かつて {{lang|en|ALGOL}} 60 の言語規格と入出力ライブラリ規格をそれぞれ[[日本工業規格|JIS規格]]で制定していたが (JIS C 6210-6219)、[[1983年]](昭和58年)[[9月1日]]付で廃止された。
 
 
 
=== ALGOLとプログラミング言語研究 ===
 
{{仮リンク|ピーター・ランディン|en|Peter Landin}}が指摘したように、ALGOLは命令型の[[副作用 (プログラム)|副作用]]と([[評価戦略|名前渡し]]の)[[ラムダ計算]]を一体に結合した初の言語である。この言語の最も見事な定式化はおそらく{{仮リンク|ジョン・C・レイノルズ|en|John C. Reynolds}}によるもので、その文法および意味論の純粋さをよく表している。レイノルズの「理想化した」ALGOLも名前渡しの言語のコンテキストにおける「ローカル」な副作用の適切さについて説得力のある方法論的主張を行っており、[[ML (プログラミング言語)|ML]]のような値渡しの言語が使用する「グローバル」な副作用と対比される。ALGOLの概念的完全性により、{{仮リンク|Programming Computable Functions|en|Programming Computable Functions|label=PCF}}やMLと共に意味論研究の主な対象とされるようになった<ref>Peter O'Hearn and Robert D. Tennent. 1996. Algol-Like Languages. Birkhauser Boston Inc., Cambridge, MA, USA.</ref>。
 
 
 
=== 実装例 ===
 
これまでに ALGOL 60 の強化版、拡張版、派生版、サブ言語などが少なくとも70ほど存在した<ref>{{Cite web| url= http://hopl.murdoch.edu.au/showlanguage.prx?exp=1807 | title=The Encyclopedia of Computer Languages | accessdate=2012-01-20}}</ref>。
 
 
 
ALGOL 60 の実装に関する問題は、Nicholas Enticknap と Pat Woodroffe の書いた "[http://www.cs.man.ac.uk/CCS/res/res04.htm#d The early days of Algol]" で詳しく議論されている。
 
 
 
{|class="wikitable" border="1" style="border-collapse: collapse;"
 
|-
 
!|名称
 
!|年
 
!|作者
 
!|国
 
!|説明
 
!|対象CPU
 
|-
 
| ZMMD-implementation|| 1958年 || Bauer, Rutishauser, Samelson, Bottenbruch || ドイツ || ALGOL 58 の実装 || [[:en:Z22 (computer)|Z22]] <br/> (後に[[コンラート・ツーゼ|ツーゼ]]のZ23<ref>[http://www.computerhistory.org/core/backissues/pdf/core_1_1.pdf Computer Museum History], Historical Zuse-Computer Z23, restored by the Konrad Zuse Schule in Hünfeld, for the Computer Museum History Center in Mountain View (California) USA</ref>向けに ALGOL 60 コンパイラを提供している)
 
|-
 
|X1 ALGOL 60 || 1960年8月<ref>{{Cite journal|url= http://www.dijkstrascry.com/node/4 |title=Dijkstra's Rallying Cry for Generalization: the Advent of the Recursive Procedure, late 1950s&nbsp;– early 1960s |last=Daylight |first=E. G. |journal=The Computer Journal |year=2011 |doi=10.1093/comjnl/bxr002}}</ref> || [[エドガー・ダイクストラ]]、 Jaap A. Zonneveld || オランダ || ALGOL 60 の世界初の実装<ref>{{Cite book| last1 = Kruseman Aretz | first1 = F.E.J. | chapter = The Dijkstra-Zonneveld ALGOL 60 compiler for the Electrologica X1 | title=Software Engineering | series = History of Computer Science | publisher = Centrum Wiskunde & Informatica | place = Kruislaan 413, 1098 SJ Amsterdam | date =30 June 2003 |url = http://oai.cwi.nl/oai/asset/4155/04155D.pdf }}</ref> || [[:en:Electrologica X1|Electrologica X1]]
 
|-
 
|[[:en:Elliott ALGOL|Elliott ALGOL]]|| 1960年代 || [[アントニー・ホーア]] || イギリス || || [[:en:Elliott 803|Elliott 803]] & Elliott 503
 
|-
 
|[[:en:JOVIAL|JOVIAL]]|| 1960年 || Jules Schwarz || アメリカ || [[Ada]]以前の [[アメリカ国防総省|DOD]] [[高水準言語|HOL]] || 各種
 
|-
 
|[[バロース B5000#ALGOL|Burroughs Algol]] <br/>(いくつか派生がある)|| 1961年 || [[バロース]](ホーアや[[エドガー・ダイクストラ|ダイクストラ]]も参加) || アメリカ || [[バロース]]のメインフレーム(および[[ユニシス]]の後継シリーズ)の基盤 || [[バロース B5000|バロースの大型機]] <br/>および中型機
 
|-
 
|Case ALGOL|| 1961年 || [[ケース・ウェスタン・リザーブ大学]]<ref>{{Cite web|last=Koffman|first=Eliot|title=All I Really Need to KnowI Learned in CS1|url= http://www.temple.edu/cis/directory/tenure/documents/KoffmanSIGCSESlides.pdf|accessdate= 2012-05-20}}</ref>  || アメリカ || [[Simula]]は Case ALGOL のシミュレーション向け拡張として開発された。 || [[:en:UNIVAC 1107|UNIVAC 1107]]
 
|-
 
|GOGOL|| 1961年 || Bill McKeeman || アメリカ || ODIN[[タイムシェアリングシステム]]向け || [[PDP-1]]
 
|-
 
|RegneCentralen ALGOL|| 1961年 || [[ピーター・ナウア]]、Jørn Jensen || デンマーク || ALGOL 60 の完全実装 || [[DASK]] ([[:en:Regnecentralen|Regnecentralen]])
 
|-
 
|[[:en:Dartmouth ALGOL 30|Dartmouth ALGOL 30]]|| 1962年 || {{仮リンク|トーマス・ユージン・カーツ|en|Thomas Eugene Kurtz}} 他 || アメリカ || || [[:en:LGP-30|LGP-30]]
 
|-
 
|USS 90 Algol|| 1962年 || L. Petrone || イタリア || ||
 
|-
 
| Algol Translator || 1962年 || G. van der Mey, [[:en:Willem van der Poel|W.L. van der Poel]] || オランダ || [[KPN|オランダ国営電話会社]] || [[:en:ZEBRA (computer)|ZEBRA]]
 
|-
 
|Kidsgrove Algol|| 1963年 || F. G. Duncan || イギリス || || [[イングリッシュ・エレクトリック]] [[:en:English Electric KDF9|KDF9]]
 
|-
 
|VALGOL|| 1963年 || Val Schorre || アメリカ || [[:en:META II|META II]] [[コンパイラジェネレータ]]のテストとして開発 ||
 
|-
 
|[[Whetstone]]|| 1964年 || Brian Randell, L J Russell || イギリス || || [[イングリッシュ・エレクトリック]] [[:en:English Electric KDF9|KDF9]]
 
|-
 
|NU ALGOL|| 1965年 || || ノルウェー || || [[UNIVAC]]
 
|-
 
|ALGEK|| 1965年 || || [[ソビエト連邦]] || ALGOL 60 と[[COBOL]]に基づいた経済タスク用 || [[:en:Minsk family of computers|Minsk-22]]
 
|-
 
|MALGOL|| 1966年 || publ. A. Viil, M Kotli & M. Rakhendi || [[エストニア・ソビエト社会主義共和国]] || || [[:en:Minsk family of computers|Minsk-22]]
 
|-
 
|ALGAMS|| 1967年 || GAMS(中型機のための自動プログラミング)グループとコメコン科学アカデミーの共同開発 || [[経済相互援助会議|コメコン]] || || [[:en:Minsk family of computers|Minsk-22]]、後に [[:en:ES EVM|ES EVM]]、[[BESM]]
 
|-
 
|ALGOL/ZAM|| 1967年 || || ポーランド || || ZAM(ポーランド製)
 
|-
 
|[[Simula|Simula 67]]|| 1967年 || [[オーレ=ヨハン・ダール]]、[[クリステン・ニゴール]] || ノルウェー || ALGOL 60 にオブジェクト指向を導入 || [[:en:UNIVAC 1107|UNIVAC 1107]]
 
|-
 
|Chinese Algol|| 1972年 || || 中国 || 漢字を表示可能 ||
 
|-
 
|[[:en:DG/L|DG/L]]|| 1972年 || [[データゼネラル]] || アメリカ || || [[Eclipse (コンピュータ)|Eclipse]]ファミリ
 
|-
 
|[[:en:S-algol|S-algol]]|| 1979年 || [[:en:Ron Morrison|Ron Morrison]] || イギリス || 直交データ型を追加。教育向け || [[PDP-11]](後に [[Java仮想マシン|Java VM]] 上にも実装)
 
|}
 
 
 
== 特徴 ==
 
同時期の {{lang|en|FORTRAN}}、{{lang|en|[[COBOL]]}} と比べると、これらの言語が特定のハードウェア上で特定の目的を効率良くこなすための一種のドメイン特化型言語から始まったのに対し、{{lang|en|ALGOL}} はいったんハードウェアの特性は置いておき、抽象的なアルゴリズムを手続きとして記述する事を目指している。初期の {{lang|en|ALGOL}} 60 仕様では入出力手続きすら標準化されていなかった点から見ても、できる限り言語コアの抽象度を上げようとしていたことは想像に難くない。{{lang|en|FORTRAN}}、{{lang|en|COBOL}} が直系子孫以外に余り枝分かれをしていないのに対して、{{lang|en|ALGOL}} 系が大きな多様性を獲得したのもこの抽象性による所が大と言える。従って {{lang|en|ALGOL}} の策定をもって、ソフトウェアのモジュール化、計算機の汎用化が始まった瞬間と捉えても差し支えないであろう。
 
 
 
{{lang|en|ALGOL}} 60 は、[[手続き型言語]]として[[再帰呼び出し]]が可能な初めてのプログラミング言語である。
 
 
 
公式の {{lang|en|ALGOL}} 60 では[[入出力]]機能が定義されていなかったため、実際の処理系ではそれぞれに互換性のない方法で実装された。それに対して、{{lang|en|ALGOL}} 68では <code>transput</code><ref group="注">{{lang|en|ALGOL}} 68 の用語で入出力を意味する。</ref>のための豊富な[[ライブラリ]]が提供された。
 
 
 
{{lang|en|ALGOL}} 60 では[[引数]]渡しに2種類の[[評価戦略]]が定義されている。一般的な'''値渡し'''と {{lang|en|ALGOL}} に特徴的な<ref group="注">手続き型言語ではなく、理論的に純粋なラムダ計算などであれば「値渡し」と「名前渡し」は基本的には等価である(ので、設計者たちは楽観的に考えていたのかもしれない)。しかし、手続き型言語では色々と面倒があり、その後、「参照渡し」か、[[無名関数]]を「[[第一級関数]]」として渡す、という形に整理された(この2通りが、名前渡しが必要・有用な場合のほとんどのユースケースである)。</ref>'''名前渡し'''である。名前渡しは実際のところ、手続き型言語では扱いがかなり難しい。例えば、2つの引数の値を入れ替える手続きを書いたとき、ある整数変数とその整数変数を添え字とする配列要素をその引数として渡すことができない<ref>{{Cite book| last=Aho | first=Alfred V. | authorlink=アルフレッド・エイホ | coauthors=Ravi Sethi, Jeffrey D. Ullman | title=Compilers: Principles, Techniques, and Tools | year=1986 | edition=1st | publisher=Addison-Wesley | isbn=0-201-10194-7}}, Section 7.5, and references therein</ref>。すなわち swap(i, A[i]) という場合である(詳しくは[[引数#名前渡し]]を参照)。乱数関数を渡す場合にも問題が生じる。
 
 
 
しかし、ALGOLの設計者は名前渡しをデフォルトとした。また、言語処理系実装者たちは名前渡しの実現に「サンク」([[:en:Thunk (functional programming)]])という興味深い技法を編み出した。現在、素朴な(ALGOLのような)名前渡しは完全に廃れたが、サンクは[[遅延評価|遅延(非正格)評価]]を実装する一般的な手法として知られる。[[ドナルド・クヌース]]は処理系が「[[再帰呼び出し]]と非局所的参照」を正しく実装しているかを評価するman or boy test([[:en:Man or boy test]])を考案した。このテストには名前呼び出しの例が含まれている(クヌースらは他にも、名前渡しの「悪用」とでも言うべきJensen's Device([[:en:Jensen's Device]])と後に呼ばれるようになるような技法の一例を示した "ALGOL 60 Confidential"<ref>https://doi.org/10.1145/366573.366599</ref>など、仕様のコーナーケースを暴き、コンピュータ・プログラミング言語設計の難しさをあらわにした)。
 
 
 
{{lang|en|ALGOL}} の影響として、後の言語のうちの最も多くに影響があるものは、<code>BEGIN</code>/<code>END</code>(C 言語などでは<code>{</code> <code>}</code>)の[[ネスティング|入れ子]]によるブロック構造化、つまり次のような典型的な形の記法であろう。
 
<pre>
 
BEGIN
 
  X := 1 ;
 
  IF (X > 0) THEN
 
    BEGIN
 
      :
 
    END
 
END
 
</pre>
 
俗に「{{lang|en|ALGOL}} 文法」といった場合は、このブロック構造化記法のことを指していることがある(C言語のように他の記号を使うものも含めて指していることもあれば、そうではなくてBEGIN/ENDのようにキーワードを使う、という意味で言っていることもある)。<!--
 
 
 
[[式 (プログラミング)|式]]と[[文 (プログラミング)|文]]を持ち、字下げ(必須ではないが)されたブロック構造で手続きを記述していくという {{lang|en|ALGOL}} 系文法は、記述力と[[可読性]]のバランスが良好で、類似の文法をもつ言語は {{lang|en|Simula}}、{{lang|en|Pascal}}、{{lang|en|Modula}}、{{lang|en|[[Modula-2]]}}、{{lang|en|[[Modula-3]]}}、{{lang|en|[[Oberon]]}}、{{lang|en|[[Ada]]}}、{{lang|en|[[VHDL]]}}、{{lang|en|[[Verilog|Verilog-HDL]]}}、{{lang|en|[[Lola]]}}、{{lang|en|[[Eiffel]]}} など複数存在する。
 
 
 
--><!--
 
 
 
ほぼウソ。3項演算子のようにして文も書ければ(あるいは、if文のように式も書ければ)そのほうが同じようなものが重複する必要がなくてエレガントであるし、実際にLispのように全てS式にしてしまって構文の字面上は式とか文とか区別しない、というほうが記述力も可読性も高い。字下げはネスト構造を「見やすくするための補助」に過ぎず、真の構造とズレた字下げがされていた場合の「誤読性」の高さは言うまでもない。Perlが採用したような、ifやwhileの本体は無条件に複文とするような構文は、C言語を使い尽した設計者たちによる言語であるGoが採用したわけだが、Goが修正することを選んだC言語のそのような構文は、元をたどれば結局ALGOLから始まった「悪癖」だということになる。
 
 
 
-->後の[[静的スコープ]]の言語についても、ALGOLからの影響と言われることがある。
 
 
 
== 例と移植性問題 ==
 
=== コード例の比較 ===
 
==== ALGOL 60 ====
 
次のコードは {{lang|en|ALGOL}} 60 で <tt>n × m</tt> の2次元配列の中から絶対値が最大の要素を求め、その絶対値を<tt>y</tt>に、添え字を<tt>i</tt>と<tt>k</tt>に格納する手続きを記述したものである。なお、コード中で強調表示されている[[予約語]]の記法は処理系に依存する。例えば "INTEGER" は "integer" と書かれることもある({{仮リンク|ストロッピング|en|Stropping (syntax)}})。
 
<pre>
 
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
 
</pre>
 
 
 
次の例は Elliott 803 ALGOL<ref>[http://www.billp.org/ccs/A104/ "803 ALGOL"], the manual for Elliott 803 ALGOL</ref> で表を生成する方法を示したものである。
 
 
 
  FLOATING POINT ALGOL TEST'
 
  BEGIN REAL A,B,C,D'
 
 
 
  READ D'
 
 
 
  FOR A:= 0.0 STEP D UNTIL 6.3 DO
 
  BEGIN
 
    PRINT PUNCH(3),££L??'
 
    B := SIN(A)'
 
    C := COS(A)'
 
    PRINT PUNCH(3),SAMELINE,ALIGNED(1,6),A,B,C'
 
  END'
 
  END'
 
 
 
PUNCH(3) は紙テープのさん孔装置ではなくテレタイプ端末のプリンターへ出力を送るものである。SAMELINE は引数間で通常行われる復帰改行を抑制する。ALIGNED(1,6) は出力を小数点以上を1文字、小数点以下を6文字とするようフォーマットする。
 
 
 
==== ALGOL 68 ====
 
次のコード例は上掲の ALGOL 60 のコード例の ALGOL 68 版である。
 
 
 
ALGOL 68 でも ALGOL 60 の{{仮リンク|ストロッピング|en|Stropping (syntax)}}を再利用している。
 
 
 
<pre>
 
PROC ABS max = ([,]real a, REF real y, REF int i, k)real:
 
COMMENT The absolute greatest element of the matrix a, of size ⌈a by 2⌈a
 
is transferred to y, and the subscripts of this element to i and k; COMMENT
 
BEGIN
 
    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
 
END # abs max #
 
</pre>
 
なお、lower (⌊) と upper (⌈) は配列の境界を示し、配列を走査する際の添え字の範囲指定に使える。
 
 
 
<pre>
 
floating point algol68 test:
 
(
 
  real a,b,c,d;
 
 
 
  printf(($pg$,"Enter d:"));
 
  read(d);
 
 
 
  FOR step FROM 0 WHILE a:=step*d; a <= 2*pi DO
 
    printf($l$);
 
    b := sin(a);
 
    c := cos(a);
 
    printf(($z-d.6d$,a,b,c))
 
  OD
 
)
 
</pre>
 
 
 
''printf'' はファイル ''stand out'' に出力を送る。''printf($p$);'' は改頁、''printf($l$);'' は改行である。''printf(($z-d.6d$,a,b,c))'' は小数点以上を1桁、小数点以下を6桁にフォーマットして出力する。
 
 
 
=== Hello world の変遷 ===
 
ALGOLの各種実装における移植性の無さは、[[Hello World]] プログラムで簡単に示すことができる。
 
 
 
==== ALGOL 58 (IAL) ====
 
ALGOL 58 には入出力機能が存在しないので、例示できない。
 
 
 
==== ALGOL 60 ファミリ ====
 
ALGOL 60 にも入出力機能がないので、Hello World プログラムの移植性はない。以下に示すのは[[ユニシス]]のメインフレームで今も使用可能なALGOLの実装に対応したもので、[[ミシガン大学]][http://www.engin.umd.umich.edu/CIS/course.des/cis400/index.html The Language Guide] にあるコード例を単純化したものである<ref>[http://www.engin.umd.umich.edu/CIS/course.des/cis400/algol/hworld.html Hello world! ALGOL Example Program page]</ref>。
 
 
 
<pre>
 
BEGIN
 
  FILE F(KIND=REMOTE);
 
  EBCDIC ARRAY E[0:11];
 
  REPLACE E BY "HELLO WORLD!";
 
  WRITE(F, *, E);
 
END.
 
</pre>
 
 
 
インラインフォーマットを使ったさらに単純なプログラムは次のようになる。
 
 
 
<pre>
 
  BEGIN
 
  FILE F(KIND=REMOTE);
 
  WRITE(F, <"HELLO WORLD!">);
 
END.
 
</pre>
 
 
 
Display文を使うとさらに次のように単純化される。
 
 
 
<pre>
 
BEGIN DISPLAY("HELLO WORLD!") END.
 
</pre>
 
 
 
もう1つの例として Elliott Algol のコード例を示す。Elliott Algol は引用開始符号と引用終了符号とで異なる文字を使用する。
 
 
 
  '''program''' HiFolks;
 
  '''begin'''
 
    '''print''' ‘Hello world’;
 
  '''end''';
 
 
 
次は Elliott 803 Algol (A104) の例である。Elliott 803 は標準では5孔の紙テープを使用するので、大文字しか使えない。引用符として使える文字もないため、ポンド記号 (£) を引用開始、疑問符 (?) を引用終了に使用している。特殊シーケンスは二重引用内に置かれる(例えば、££L?? は改行指示である)。
 
 
 
  HIFOLKS'
 
  BEGIN
 
      PRINT £HELLO WORLD£L??'
 
  END'
 
 
 
[[:en:ICT 1900 series|ICT 1900]]シリーズのALGOLでは、紙テープまたはパンチカードを入力として利用可能である。紙テープは小文字も使用可能である。出力はラインプリンターに対して行う。
 
  'BEGIN'
 
      'WRITE TEXT'("HELLO WORLD");
 
  'END'
 
 
 
==== ALGOL 68 ====
 
ALGOL 68 のコードは一般に太字または下線つきの小文字で予約語を表す(ただし、以下の例はシンタックスハイライトのために大文字にしている)。
 
 
 
<pre>
 
BEGIN
 
  printf(($gl$,"Hello, world!"))
 
END
 
</pre>
 
 
 
"Algol 68 Report" では、入出力を "transput" と称している。
 
 
 
=== ALGOLの特殊文字の変遷 ===
 
{{特殊文字|special=Unicode 6.0 "[http://www.unicode.org/charts/PDF/U2300.pdf Miscellaneous Technical]" characters}}
 
ALGOLは文字セットが急速に発展し多様化していた時代に登場した。また、ALGOLは大文字だけで記述できるよう定義されていた。
 
 
 
1960年の[[情報処理国際連合]] (IFIP) で発表された ALGOL 60 では、当時のほとんどのコンピュータではサポートされていない数学記号がいくつか使われていた。例えば、×, ÷, ≤, ≥, ≠, ¬, ∨, ∧, ⊂, ≡, ␣, <span style="font-family:'DejaVu Sans',Quivira,Symbola,'和田研中丸ゴシック2004絵文字','和田研細丸ゴシック2004絵文字','Nishiki-teki';">⏨</span><ref group="注" name="ten">対応フォントが少ない。フリーフォントでは、[[DejaVuフォント|DejaVu Sans]]、Quivira、[http://users.teilar.gr/~g1951d/ Symbola]、[[和田研フォント|和田研2004フォントの絵文字対応版]]、にしき的フォントなど。JIS X 0208の表記に置き換えるなら「<span style="font-size:40%;">10</span>」のような外見となる。</ref> などである。
 
 
 
1961年9月、初期の[[ASCII]]文字セットが登場し、ALGOLの[[ブーリアン型|ブーリアン]]演算子 "{{Backslash}}/" と "/{{Backslash}}" をサポートするために[[バックスラッシュ]] ({{Backslash}}) が初期段階で追加された<ref>[http://www.bobbemer.com/BACSLASH.HTM How ASCII Got Its Backslash], Bob Bemer</ref>。
 
 
 
1962年、{{仮リンク|ALCOR|en|ALCOR}}は2つの珍しい文字、"&#x16ed;" (iron/runic cross) と "⏨" ([http://unicode.org/charts/PDF/U2300.pdf Decimal Exponent Symbol]) を浮動小数点形式で使用するためにALGOLの文字セットに加えた<ref>{{Cite journal| last=Baumann | first=R. | year=1962 | title=ALGOL Manual of the ALCOR Group, Part 1 |journal=Elektronische Rechenanlagen |date=October 1961 | pages=206–212 | language=German| trans_title=ALGOL Manual of the ALCOR Group| accessdate= 2009-11-25}}</ref><ref>{{Cite journal| last=Baumann | first=R. | year=1962 | title=ALGOL Manual of the ALCOR Group, Part 2 |journal=Elektronische Rechenanlagen |volume=6 | date=December 1961 | pages=259–265 | language=German| trans_title=ALGOL Manual of the ALCOR Group| accessdate= 2009-11-25 }}</ref><ref>{{Cite journal| last=Baumann | first=R. | year=1962 | title=ALGOL Manual of the ALCOR Group, Part 3 |journal=Elektronische Rechenanlagen |volume=2 | date=April 1962 | language=German| trans_title=ALGOL Manual of the ALCOR Group| accessdate= 2009-11-25 }}</ref>。
 
 
 
1964年、ソビエト連邦が策定した[[GOST規格]] [[:en:GOST 10859|GOST 10859]] で、ALGOL用の4ビット、5ビット、6ビット、7ビットの文字セットを定義した<ref>{{Cite web|title=GOST 10859 standard|url= http://homepages.cwi.nl/~dik/english/codes/stand.html#gost10859|accessdate= 2007-06-05| archiveurl= http://web.archive.org/web/20070616201227/http://homepages.cwi.nl/~dik/english/codes/stand.html#gost10859| archivedate= 16 June 2007 | deadurl= no}}</ref>。
 
 
 
1968年の "Algol 68 Report" では既存のALGOL用文字セットに加えて、[[:en:IBM 2741|IBM 2741]] 端末(1965年に登場した[[APL]]対応端末)で使用可能な {{Unicode|→, ↓, ↑, □, ⌊, ⌈, ⎩, ⎧, ○, ⊥, ¢}} という文字を加えた。このレポートはロシア語、ドイツ語、フランス語、ブルガリア語に翻訳され、それぞれの言語向けに文字セットが拡張された。例えばソビエト連邦の[[BESM|BESM-4]]は[[キリル文字]]が使用可能だった。ALGOLの使用する全ての文字は[[Unicode]]規格の一部になっており、その大部分は主要な[[フォント]]が対応している。
 
 
 
2009年10月、浮動小数点形式記述のための "<span style="font-family:'DejaVu Sans',Quivira,Symbola,'和田研中丸ゴシック2004絵文字','和田研細丸ゴシック2004絵文字','Nishiki-teki';">⏨</span>" ([http://unicode.org/charts/PDF/U2300.pdf Decimal Exponent Symbol]) が Unicode 5.2 に追加された<ref group="注" name="ten"/>。これは[[ブラン (オービタ)|ブラン]]で使われたALGOLソフトウェアとの後方互換を保つためである。
 
 
 
== 脚注 ==
 
{{脚注ヘルプ}}{{Reflist|group="注"}}
 
 
 
== 出典 ==
 
{{Reflist|30em}}
 
 
 
== 参考文献 ==
 
* F.L. Bauer, R. Baumann, M. Feliciano, K. Samelson, ''Introduction to Algol''. Prentice Hall, 1964,  ISBN 0-13-477828-6
 
* [http://www.softwarepreservation.org/projects/ALGOL/book/Randell_ALGOL_60_Implementation_1964.pdf  B. Randell and L.J. Russell, ''ALGOL 60 Implementation: The Translation and Use of ALGOL 60 Programs on a Computer''. Academic Press, 1964]. The design of the '''Whetstone Compiler'''. コンパイラの実装についての初期の解説の1つ。関連する論文として次がある。
 
** [http://www.cs.ncl.ac.uk/research/pubs/articles/papers/427.pdf Whetstone Algol Revisited] by B. Randell
 
** [http://www.cs.ncl.ac.uk/publications/books/papers/124.pdf The Whetstone KDF9 Algol Translator] by B. Randell
 
* E. W, Dijkstra, ''Algol 60 translation: an algol 60 translator for the x1 and making a translator for algol 60'', report MR 35/61. Mathematisch Centrum, Amsterdam, 1961. [http://www.cs.utexas.edu/users/EWD/MCReps/MR35.PDF]
 
 
 
 
 
== 関連図書 ==
 
* 森口繁一(編):「ALGOL入門」、日本科学技術連盟、(1962年10月1日)。
 
* Eric Foxley and Henry R. Neave:"A FIRST COURCE IN ALGOL60", Addison-Wesley Pub., (1968).
 
* エリック フォクスレイ、ヘンリイ R.ニーヴ、岸田孝一(訳):「プログラミングALGOL入門」、日本生産性本部(1970年3月30日)。
 
 
 
== 関連項目 ==
 
* [[ISWIM]]
 
* [[Simula]]
 
* [[Scheme]]
 
 
 
== 外部リンク ==
 
* [http://www.xs4all.nl/~jmvdveer/algol.html Algol 68 Genie] - [[GNU General Public License|GPL]]配布によるフリーの{{lang|en|ALGOL}} 68 [[インタプリタ]]
 
* [http://www.angelfire.com/biz/rhaminisys/algol60.html {{lang|en|Algol60 compiler and interpreter}}] - [[MS-DOS]]上で動くフリーのALGOL60コンパイラが配布されている。
 
* [http://www.masswerk.at/algol60/report.htm {{lang|en|Revised Report on the Algorithmic Language Algol 60}}] by Peter Naur, et al. ALGOLの定義
 
* [http://www.compileonline.com/execute_algol_online.php Execute ALGOL-68 Script Online] ブラウザ上でオンラインで ALGOL 68 を実行 by Mohtashim
 
* ALGOL 60 のBNFによる [http://bernhard.userweb.mwn.de/Algol-BNF.html syntax summary]
 
* [http://www.softwarepreservation.org/projects/ALGOL/ History of ALGOL] at the [[コンピュータ歴史博物館|Computer History Museum]]
 
* [http://www.gnu.org/software/marst/ MARST] - フリーなALGOLからCへのトランスレータ ([http://www.sfr-fresh.com/unix/misc/marst-2.6.tar.gz:a/marst-2.6/doc/marst.texi User Guide])
 
* [http://rogerdmoore.ca/JOUR/ AN IMPLEMENTATION OF ALGOL 60 FOR THE FP6000] 実装上の問題についての議論がある。
 
* [http://portal.acm.org/ft_gateway.cfm?id=808370&type=pdf&coll=&dl=ACM&CFID=15151515&CFTOKEN=6184618 "The European Side of the Last Phase of the Development of ALGOL 60" by Peter Naur]
 
* [[エリック・レイモンド]]の [http://www.catb.org/retro/ Retrocomputing Museum] には、C言語で書かれた NASE Algol-60 インタプリタへのリンクがある。
 
* [http://ed-thelen.org/comp-hist/B5000-AlgolRWaychoff.html STORIES ABOUT THE B5000 AND PEOPLE WHO WERE THERE] By Richard Waychoff
 
* [http://mailcom.com/unicode/DecimalExponent.ttf TrueType font containing U+23E8 Decimal Exponent Symbol](ttfファイル)
 
  
 
{{プログラミング言語一覧}}
 
{{プログラミング言語一覧}}
 +
{{テンプレート:20180815sk}}
 
[[Category:プログラミング言語]]
 
[[Category:プログラミング言語]]

2018/10/1/ (月) 22:58時点における最新版

ALGOL
パラダイム 手続き型命令型構造化
登場時期 1958年
設計者 バウアーEnglish版ルティシュハウザーサメルソンEnglish版バッカスパリスナウアファン・ワインハールデンEnglish版マッカーシー
型付け 強い静的型付け
方言 ALGOL 60、ALGOL 68
影響を与えた言語 PascalC言語PL/ISimulaCPLAdaMathematica
テンプレートを表示

ALGOLアルゴル

コンピュータのプログラム言語の一つ。数値あるいは記号処理を正確に表現する算法記述向きの言語で,科学技術計算に使われる。フォートランの成功に刺激され,1958年からアメリカ,およびヨーロッパの大学関係者たちのアルゴル委員会によって開発され,60年のパリ会議で発表された。これを ALGOL60という。これはプログラム言語の理論,および翻訳ルーチンなど理論的研究を基礎としているため,プログラム言語一般に大きな影響を与えた。 68年にさらに機能拡張をした ALGOL68が発表された。




楽天市場検索: