ALGOL 68(源自英語:ALGOrithmic Language 1968的縮寫),一種指令式程式語言,為ALGOL家族的成員,是官方上的ALGOL 60後繼者。它設計的目標,是提供更廣泛的應用,以及更嚴格的語法定義。
編程範型 | 多範式:指令式,過程式,結構化,並發 |
---|---|
設計者 | 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的特徵包括基於表達式的語法,用戶聲明的類型和結構/加標記的聯合,變量和引用參數的引用模型,字符串、數組和矩陣的分片,以及並發。
概論
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)
註釋
外部連結
Wikiwand in your browser!
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.