ALGOL 68
編程範型 | 多範式:指令式,過程式,結構化,並發 |
---|---|
設計者 | A. van Wijngaarden, B.J. Mailloux, J.E.L. Peck, C.H.A. Koster等人 |
面市時間 | 最終報告: 1968年 |
型態系統 | 靜態、強類型、安全、結構式 |
網站 | Revised Report on the Algorithmic Language ALGOL 68 |
主要實作產品 | |
ALGOL 68C, ALGOL 68 Genie(新近[1]), ALGOL 68-R, ALGOL 68RS, ALGOL 68S, FLACC, 列寧格勒ALGOL 68, Odra ALGOL 68 | |
衍生副語言 | |
ALGOL 68r0 (最終報告:1968年), ALGOL 68r1 (修訂報告:1973年) | |
啟發語言 | |
ALGOL 60, ALGOL Y | |
影響語言 | |
C[2]、C++[3]、Bourne shell、KornShell、Bash、Steelman、Ada、Python[4]、Seed7、Mary、S3 |
ALGOL 68(源自英語:ALGOrithmic Language 1968的縮寫),一種指令式程式語言,為ALGOL家族的成員,是官方上的ALGOL 60後繼者。它設計的目標,是提供更廣泛的應用,以及更嚴格的語法定義。
ALGOL 68的特徵包括基於表達式的語法,用戶聲明的類型和結構/加標記的聯合,變量和引用參數的引用模型,字符串、數組和矩陣的分片,以及並發。
概論
[編輯]ALGOL 68由IFIP工作組2.1負責設計。1968年12月20日,IFIP工作組2.1通過了這個語法規範,並提交IFIP大會通過且出版。
ALGOL 68的定義使用了阿德里安·范·韋恩加登發明的一種數學形式主義的兩級形式文法。Van Wijngaarden文法使用上下文無關文法生成形成一個無限集合的一些產生式,它們將識別特定的ALGOL 68程序;值得注意的是,它們能夠表達在很多其他程式語言的技術標準中被標記為「語義」的那種要求,其他語言的語義必須用易致歧義的自然語言敘述來表達,並接著在編譯器中實現為附加到形式語言解析器的「特設」代碼。
ALGOL 68設計的主要目標和原則為:
ALGOL 68曾受到批評,最突出的是來自其設計委員會的一些成員比如C. A. R. Hoare[7],還有ALGOL 60編譯器作者比如Edsger Dijkstra[8],它拋棄了ALGOL 60的簡單性,成為了複雜或過於籠統的想法的載體,不能使編譯器作者的任務變得更輕易些,與刻意保持簡單的同時代(競爭)者如C、S-algol和Pascal形成了鮮明對比。
在1970年,ALGOL 68-R成為了第一個投入工作的ALGOL 68編譯器。
在1973年9月確定的修訂版本中,省略了特定特徵比如過程化、gomma[9]和形式邊界[5]。
Stephen R. Bourne是ALGOL 68修訂委員會成員,他選取了它的一些想法到他的Bourne shell之中。
ALGOL 68的語言定義出版後的文本長達兩百多頁並充斥著非標準術語,這種複雜性使得編譯器實現變得困難,故而它曾被稱為「沒有實現也沒有用戶」。這麼說只是部份真實的,ALGOL 68曾應用於一些小眾市場,特別是流行於英國的國際計算機有限公司(ICL)的機器之上,還有在教學角色之上。在這些領域之外,其使用相對有限。
儘管如此,ALGOL 68對計算機科學領域的貢獻是深刻、廣泛而持久的,雖然這些貢獻大多只是在它們於後來開發的程式語言中重現之時才被公開認可。很多語言是為了應對這門語言的複雜性而專門開發的,其中最著名的是Niklaus Wirth的Pascal[10],或者是針對特定角色而重新實現的,比如有些人認為Ada可以看作ALGOL 68的後繼者[11]。
1970年代的很多語言可以追溯其設計至ALGOL 68,選取一些特徵,並放棄被認為太複雜或超出給定角色範圍的其他特徵。其中就有C語言,它受到ALGOL 68的直接影響,特別是它的強類型和結構。多數現代語言都至少可以追溯其部份語法至要麼C語言要麼Pascal,因而很多語言可直接或間接的經由C語言而追溯至ALGOL 68。
規定和實現時間線
[編輯]名稱 | 年 | 用途 | 國家 | 描述 | 目標CPU | 屬主/許可證 | 實現語言 |
---|---|---|---|---|---|---|---|
廣義ALGOL | 1962 | 科學 | 荷蘭 | 廣義文法的ALGOL[12] | |||
ALGOL 68DR | 1968 | 草案 | IFIP WG 2.1草案報告[13] | ||||
ALGOL 68r0 | 1968 | 標準 | IFIP WG 2.1最終報告[14] | ||||
ALGOL 68-R | 1970 | 軍用 | 英國 | 在GEORGE 3下的ALGOL 68 | ICL 1900 | 皇家雷達研究所 | ALGOL 60 |
DTSS ALGOL 68 | 1970 | 美國 | 達特茅斯分時系統的ALGOL 68[15] | GE-635 | 達特茅斯學院 | ||
Mini ALGOL 68 | 1973 | 研究 | 荷蘭 | 針對簡單Algol 68程序的解釋器[16] | 可移植解釋器 | 荷蘭數學中心 | ALGOL 60 |
OREGANO | 1973 | 研究 | 美國 | 「實現模型的重要性。」[17] | 加州大學洛杉磯分校 | ||
ALGOL 68C | 1975 | 科學 | 英國 | 劍橋Algol 68 | ICL, IBM System/360, PDP-10 和 Unix, Telefunken, Tesla & Z80 (1980)[18] | 劍橋大學 | ALGOL 68C |
ALGOL 68r1 | 1975 | 標準 | IFIP WG 2.1修訂報告[19] | ||||
Algol H | 1975 | 實驗等 | 英國 | 對Algol 68的模態系統提議了擴展[20] | ALGOL W | ||
CDC ALGOL 68 | 1975 | 科學 | 美國 | 完全實現的ALGOL 68[21] | CDC 6000系列, CDC Cyber | 控制數據公司 | |
Odra Algol 68 | 1976 | 實用 | 蘇聯/ 波蘭 | Odra 1204/IL | ALGOL 60 | ||
俄克拉何馬ALGOL 68 | 1976 | 編程指導 | 美國 | 俄克拉何馬州立大學實現[22] | IBM 1130和System/370 Model 158 | 俄克拉何馬州立大學 | ANSI Fortran 66 |
柏林ALGOL 68 | 1977 | 研究 | 德國 | 柏林ALGOL 68實現[23] | 抽象ALGOL 68機器 – 機器無關編譯器 | 柏林工業大學 | CDL 2 |
FLACC | 1977 | 多用途 | 加拿大 | 具有調試特徵的修訂報告完整實現 | System/370 | 租用, Chion公司 | 彙編 |
ALGOL 68RS | 1977 | 軍用 | 英國 | 可移植編譯器 | ICL 2900系列, Multics, VMS 和 C生成器 (1993) | 皇家信號與雷達研究所 | ALGOL 68RS |
ALGOL 68-RT | 1979 | 科學 | 英國 | 並行ALGOL 68-R | |||
ALGOL 68+ | 1980 | 科學 | 荷蘭 | 提議的ALGOL 68的超語言[24] | |||
M-220 ALGOL 68 | 蘇聯 | M-220 | EPSILON | ||||
列寧格勒ALGOL 68 | 1980 | 電信 | 蘇聯 | 完全語言 + 模塊 | IBM, DEC, CAMCOH, PS 1001 和 PC | ||
交互式ALGOL 68 | 1983 | 英國 | 增量編譯 | PC | 非商業共享軟體 | ||
ALGOL 68S | 1985 | 科學 | ALGOL 68的子集語言[25] | Sun-3, Sun SPARC (在SunOS 4.1和Solaris 2之下), Atari ST (在GEMDOS之下), Acorn Archimedes (在RISC OS之下), VAX-11在Ultrix-32之下 | |||
Algol68toC[26] | 1985 | 電子 | 英國 | 基於源自ELLA ALGOL 68RS的ctrans | 可移植C生成器 | 開源軟體 1995 | ALGOL 68RS |
MK2 交互式ALGOL 68 | 1992 | 英國 | 增量編譯 | PC | 非商業共享軟體[27] | ||
Algol 68 Genie | 2001 | 完全語言 | 荷蘭 | 包括標準的並立子句 | 可移植解釋器 | GNU GPL | C |
Algol 68 Genie版本2 | 2010 | 完全語言 | 荷蘭 | 可移植解釋器;可選的選定單元的編譯 | GNU GPL | C |
樣例代碼
[編輯]下面的樣例代碼實現了埃拉托斯特尼篩法來找到小於等於100的所有素數。ALGOL 68中NIL
是同其他語言中「空指針」的類似者,表示法x OF y
訪問STRUCT y
的成員x
。
BEGIN # ALGOL68的素数筛法,基于链表实现 #
MODE
LIST = REF NODE,
NODE = STRUCT (INT h, LIST t);
OP CONS = (INT n, LIST l) LIST: HEAP NODE := (n, LIST: l);
PRIO CONS = 9;
PROC
one to = (INT n) LIST:
(PROC f = (INT m) LIST: (m > n | NIL | m CONS f(m+1));
f(1)),
error = (STRING s) VOID:
(print((newline, " error: ", s, newline)); GOTO stop),
hd = (LIST l) INT: (l IS NIL | error("hd NIL"); SKIP | h OF l),
tl = (LIST l) LIST: (l IS NIL | error("tl NIL"); SKIP | t OF l),
show = (LIST l) VOID:
(l ISNT NIL | print((" ", whole(hd(l), 0))); show(tl(l))
| print(newline));
PROC filter = (PROC (INT) BOOL p, LIST l) LIST:
IF l IS NIL THEN NIL
ELIF p(hd(l)) THEN hd(l) CONS filter(p, tl(l))
ELSE filter(p, tl(l))
FI;
PROC sieve = (LIST l) LIST:
IF l IS NIL THEN NIL
ELSE
PROC not multiple = (INT n) BOOL: n MOD hd(l) NE 0;
hd(l) CONS sieve(filter(not multiple, tl(l)))
FI;
PROC primes = (INT n) LIST: sieve(tl(one to(n)));
show(primes(100))
END
將上述代碼保存入文本文件primes.a68
中,然後使用ALGOL 68 Genie執行它:
$ a68g primes.a68
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
參見
[編輯]- ALGOL 60
- ALGOL Y
- ALGOL N
- ALGOL 68C
- C
- C++
- ALGOL 68與C++的比較
- Bourne shell
- Bash (Unix shell)
註釋
[編輯]- ^ ALGOL 68 Genie. [2020-04-22]. (原始內容存檔於2020-08-14).
- ^ Dennis Ritchie. The Development of the C Language (PDF). April 1993 [2007-04-26]. (原始內容 (PDF)存檔於2005-06-29).
The scheme of type composition adopted by C owes considerable debt to Algol 68, although it did not, perhaps, emerge in a form that Algol’s adherents would approve of. The central notion I captured from Algol was a type structure based on atomic types (including structures), composed into arrays, pointers (references), and functions (procedures). Algol 68’s concept of unions and casts also had an influence that appeared later. …… a notation for type conversions (called 『casts』 from the example of Algol 68) was invented to specify type conversions more explicitly.
- ^ A History of C++: 1979−1991 (PDF). Page 12, 2nd paragraph: Algol68 [gave] operator overloading(§3.3.3), references (§3.3.4), and the ability to declare variables anywhere in a block (§3.3.1). March 1993 [2008-05-06]. (原始內容存檔 (PDF)於2006-12-10).
- ^ Interview with Guido van Rossum. July 1998 [2007-04-29]. (原始內容存檔於2007-05-01).
String slicing came from Algol-68 and Icon.
- ^ 5.0 5.1 5.2 5.3 Revised Report on the Algorithmic Language Algol 68.
- ^ Adriaan van Wijngaarden. Orthogonal design and description of a formal language (PDF). 1965.
- ^ Hoare, C. a. R. Critique of ALGOL 68. ALGOL Bulletin. November 1968, 29: 27–29.
I believe that the essential problem in the design of self-extending languages is in the design of the nucleus of built-in features, which the implementor will be expected to represent within the machine code of his computer. It is essential that this nucleus should have the properties: 1. Extreme simplicity and small size …… 2. Extreme efficiency of implementation …… I would therefore reckon that a language at about the level of FORTRAN would be a suitable choice for a nucleus. The language nucleus described in MR93 is far too elaborate; and some of its defects are listed in Appendix II.
- ^ Dijkstra, E. W. To the Editor ALGOL 68 Mathematische Centrum. [2007-04-28]. (原始內容存檔於2007-04-21).
On account of the draft report my faith in WG.2.1 (at least in its present constitution) is very low. The draft report is thick and difficult, in fact too thick and too difficult to inspire much confidence. …… Size and complexity of the defining apparatus you needed terrify me. Being well-acquainted with your ingenuity I think it a safe assumption that ALGOL 68 as conceived can hardly be defined by significantly more concise and transparent means. …… I feel inclined to put the blame on the language you tried to define. If this is correct, WG.2.1 should return to its proper subject matter, viz. programming languages.
- ^ Gommas?.
- ^ Niklaus Wirth. ALGOL Colloqium – Closing Word. 1968.
The implied and rather vague goal was the specification of a universal language, a sensible goal in 1960, even 1964, but an utopia in 1968; a goal which if pursued faithfully, invariably lead towards a monster language, a species of which there already exists a sample hardly worth nor possible to compete with.
- ^ Learning Algol 68 Genie (PDF).
Some claim that Ada is Algol 68’s successor but many dispute that.
- ^ Adriaan van Wijngaarden. Generalized ALGOL (PDF). Symbolic Languages in Data Processing, Proc. Symp. Intl, Computation Center Rome, Gordon & Beach, New York. 1962.
- ^ Van Wijngaarden, A.; Mailloux, B. J.; Peck, J.; Koster, C. H. A. Draft Report on the Algorithmic Language ALGOL 68. ALGOL Bulletin. 1 March 1968, (Sup 26): 1–84 [7 April 2023] –透過Mar. 1968.
- ^ Report on the algorithmic language ALGOL 68. 1969.
- ^ Sidney Marshall. J. E. L. Peck , 編. ALGOL 68 Implementation (PDF). Proceedings of the IFIP Working Conference on ALGOL 68 Implementation, Munich,: 239–243. July 20–24, 1970.
Sidney Marshall. On the implementation of ALGOL 68 (PDF). PhD Thesis, Dartmouth College. 1972. - ^ "An interpreter for simple Algol 68 Programs" 網際網路檔案館的存檔,存檔日期2011-07-18.
- ^ Daniel M. Berry. The importance of implementation models in ALGOL 68: or how to discover the concept of necessary environment.
- ^ Liverpool Software Gazette March 1980 (PDF). [2010-03-20]. (原始內容 (PDF)存檔於2010-04-15).
- ^ Revised report on the algorithmic language ALGOL 68 (PDF). 1976.
- ^ Black, A. P.; Rayward-Smith, V. J. Proposals for ALGOL H - A Superlanguage of ALGOL 68. ALGOL Bulletin. 1 May 1978, (42): 36–49 [7 April 2023] –透過May. 1978.
- ^ ALGOL 68 Version I Reference Manual (PDF). Control Data Services B.V., Rijswijk, Netherlands. 1976.
- ^ ALGOL68 instruction at Oklahoma State University.
- ^ "The Berlin ALGOL 68 implementation"
An abstract ALGOL 68 machine and its application in a machine independent compiler – Springer. Springerlink.com. Retrieved on 2013-07-21. - ^ Algol 68+, a superlanguage of Algol 68 for processing the standard-prelude (PDF). 1981.
- ^ Hibbard, P.G. A Sublanguage of ALGOL 68. SIGPLAN Notices. May 1977, 12 (5): 71–79. S2CID 37914993. doi:10.1145/954652.1781177 .
- ^ Open source Algol 68 implementations / algol68toc. Sourceforge.net. Retrieved on 2013-07-21.
- ^ a68mk2.zip 網際網路檔案館的存檔,存檔日期2006-08-29.
外部連結
[編輯]- Revised Report on the Algorithmic Language ALGOL 68(頁面存檔備份,存於網際網路檔案館) The official reference for users and implementors of the language (large pdf file, scanned from Algol Bulletin)
- Revised Report on the Algorithmic Language ALGOL 68(頁面存檔備份,存於網際網路檔案館) Hyperlinked HTML version of the Revised Report
- A Tutorial on Algol 68, by Andrew S. Tanenbaum, in Computing Surveys, Vol. 8, No. 2, June 1976, with Corrigenda (Vol. 9, No. 3, September 1977)
- Algol 68 Genie – a GNU GPL Algol 68 compiler-interpreter(頁面存檔備份,存於網際網路檔案館)
- Open source Algol 68 implementations, on SourceForge(頁面存檔備份,存於網際網路檔案館)
- Algol68 Standard Hardware representation (.pdf)(頁面存檔備份,存於網際網路檔案館)
- Из истории создания компилятора с Алгол 68(頁面存檔備份,存於網際網路檔案館)
- Algol 68 – 25 Years in the USSR(頁面存檔備份,存於網際網路檔案館)
- Система программ динамической поддержки для транслятора с Алгол 68
- C history with Algol68 heritage
- McJones, Paul, "Algol 68 implementations and dialects"(頁面存檔備份,存於網際網路檔案館), Software Preservation Group, Computer History Museum, 2011-07-05
- Web enabled ALGOL 68 compiler for small experiments