跳至內容

ALGOL 68

維基百科,自由的百科全書
ALGOL 68
編程範型多範式指令式過程式結構化並發
設計者A. van Wijngaarden, B.J. Mailloux英語Barry J. Mailloux, J.E.L. Peck英語John E. L. Peck, C.H.A. Koster英語Cornelis H.A. Koster等人
面市時間最終報告: 1968年,​56年前​(1968
型態系統靜態強類型安全結構式英語Structural type system
網站Revised Report on the Algorithmic Language ALGOL 68
主要實作產品
ALGOL 68C英語ALGOL 68C, ALGOL 68 Genie(新近[1]), ALGOL 68-R英語ALGOL 68-R, ALGOL 68RS英語ALGOL 68RS, ALGOL 68S英語ALGOL 68S, FLACC英語FLACC, 列寧格勒ALGOL 68, Odra英語Odra (computer) ALGOL 68
衍生副語言
ALGOL 68r0 (最終報告:1968年),
ALGOL 68r1 (修訂報告:1973年)
啟發語言
ALGOL 60, ALGOL Y英語ALGOL Y
影響語言
C[2]C++[3]Bourne shellKornShellBashSteelman英語Steelman language requirementsAdaPython[4]Seed7英語Seed7Mary英語Mary (programming language)S3英語S3 (programming language)

ALGOL 68(源自英語:ALGOrithmic Language 1968的縮寫),一種指令式程式語言,為ALGOL家族的成員,是官方上的ALGOL 60後繼者。它設計的目標,是提供更廣泛的應用,以及更嚴格的語法定義。

ALGOL 68的特徵包括基於表達式英語Expression-oriented programming language的語法,用戶聲明的類型和結構/加標記的聯合,變量和引用參數的引用模型,字符串、數組和矩陣的分片,以及並發

概論

[編輯]

ALGOL 68由IFIP工作組2.1英語IFIP Working Group 2.1負責設計。1968年12月20日,IFIP工作組2.1通過了這個語法規範,並提交IFIP大會通過且出版。

ALGOL 68的定義使用了阿德里安·范·韋恩加登發明的一種數學形式主義的兩級形式文法Van Wijngaarden文法英語Van Wijngaarden grammar使用上下文無關文法生成形成一個無限集合的一些產生式,它們將識別特定的ALGOL 68程序;值得注意的是,它們能夠表達在很多其他程式語言的技術標準中被標記為「語義」的那種要求,其他語言的語義必須用易致歧義的自然語言敘述來表達,並接著在編譯器中實現為附加到形式語言解析器的「特設」代碼。

ALGOL 68設計的主要目標和原則為:

  1. 描述的完備性和清晰性[5]
  2. 設計的正交性[6]
  3. 安全性[5]
  4. 高效性[5]

ALGOL 68曾受到批評,最突出的是來自其設計委員會的一些成員比如C. A. R. Hoare[7],還有ALGOL 60編譯器作者比如Edsger Dijkstra[8],它拋棄了ALGOL 60的簡單性,成為了複雜或過於籠統的想法的載體,不能使編譯器作者的任務變得更輕易些,與刻意保持簡單的同時代(競爭)者如CS-algol英語S-algolPascal形成了鮮明對比。

在1970年,ALGOL 68-R英語ALGOL 68-R成為了第一個投入工作的ALGOL 68編譯器。

在1973年9月確定的修訂版本中,省略了特定特徵比如過程化、gomma[9]和形式邊界[5]

Stephen R. Bourne是ALGOL 68修訂委員會成員,他選取了它的一些想法到他的Bourne shell之中。

ALGOL 68的語言定義出版後的文本長達兩百多頁並充斥著非標準術語,這種複雜性使得編譯器實現變得困難,故而它曾被稱為「沒有實現也沒有用戶」。這麼說只是部份真實的,ALGOL 68曾應用於一些小眾市場,特別是流行於英國國際計算機有限公司英語International Computers Limited(ICL)的機器之上,還有在教學角色之上。在這些領域之外,其使用相對有限。

儘管如此,ALGOL 68對計算機科學領域的貢獻是深刻、廣泛而持久的,雖然這些貢獻大多只是在它們於後來開發的程式語言中重現之時才被公開認可。很多語言是為了應對這門語言的複雜性而專門開發的,其中最著名的是Niklaus WirthPascal[10],或者是針對特定角色而重新實現的,比如有些人認為Ada可以看作ALGOL 68的後繼者[11]

1970年代的很多語言可以追溯其設計至ALGOL 68,選取一些特徵,並放棄被認為太複雜或超出給定角色範圍的其他特徵。其中就有C語言,它受到ALGOL 68的直接影響,特別是它的強類型和結構。多數現代語言都至少可以追溯其部份語法至要麼C語言要麼Pascal,因而很多語言可直接或間接的經由C語言而追溯至ALGOL 68。

規定和實現時間線

[編輯]
名稱 用途 國家 描述 目標CPU 屬主/許可證 實現語言
廣義ALGOL 1962 科學  荷蘭 廣義文法的ALGOL[12]
ALGOL 68DR 1968 草案 Does not appear IFIP WG 2.1草案報告[13] Does not appear
ALGOL 68r0 1968 標準 Does not appear IFIP WG 2.1最終報告[14] Does not appear
ALGOL 68-R英語ALGOL 68-R 1970 軍用  英國 GEORGE 3英語GEORGE (operating system)下的ALGOL 68 ICL 1900英語ICT 1900 series 皇家雷達研究所英語Royal Radar Establishment ALGOL 60
DTSS ALGOL 68 1970  美國 達特茅斯分時系統英語Dartmouth Time Sharing System的ALGOL 68[15] GE-635英語GE-600 series 達特茅斯學院
Mini ALGOL 68 1973 研究  荷蘭 針對簡單Algol 68程序的解釋器[16] 可移植解釋器 荷蘭數學中心 ALGOL 60
OREGANO 1973 研究  美國 「實現模型的重要性。」[17] 加州大學洛杉磯分校
ALGOL 68C英語ALGOL 68C 1975 科學  英國 劍橋Algol 68 ICL英語International Computers Limited, IBM System/360, PDP-10Unix, Telefunken, Tesla & Z80 (1980)[18] 劍橋大學 ALGOL 68C
ALGOL 68r1 1975 標準 Does not appear IFIP WG 2.1修訂報告[19] Does not appear
Algol H 1975 實驗等  英國 對Algol 68的模態系統提議了擴展[20] ALGOL W
CDC ALGOL 68 1975 科學  美國 完全實現的ALGOL 68[21] CDC 6000系列英語CDC 6000 series, CDC Cyber 控制數據公司
Odra英語Odra (computer) Algol 68 1976 實用  蘇聯/ 波蘭 Odra 1204/IL ALGOL 60
俄克拉何馬ALGOL 68 1976 編程指導  美國 俄克拉何馬州立大學實現[22] IBM 1130System/370 Model 158英語IBM System/370 俄克拉何馬州立大學 ANSI Fortran 66
柏林ALGOL 68 1977 研究  德國 柏林ALGOL 68實現[23] 抽象ALGOL 68機器 – 機器無關編譯器 柏林工業大學 CDL 2英語Compiler Description Language
FLACC英語FLACC 1977 多用途  加拿大 具有調試特徵的修訂報告完整實現 System/370 租用, Chion公司 彙編
ALGOL 68RS英語ALGOL 68RS 1977 軍用  英國 可移植編譯器 ICL 2900系列英語ICL 2900 Series, Multics, VMSC生成器 (1993) 皇家信號與雷達研究所英語Royal Signals and Radar Establishment ALGOL 68RS
ALGOL 68-RT英語ALGOL 68-RT 1979 科學  英國 並行ALGOL 68-R
ALGOL 68+ 1980 科學  荷蘭 提議的ALGOL 68的超語言[24]
M-220英語M-220 ALGOL 68  蘇聯 M-220 EPSILON英語EPSILON (programming language)
列寧格勒ALGOL 68 1980 電信  蘇聯 完全語言 + 模塊 IBM, DEC, CAMCOH, PS 1001 和 PC
交互式ALGOL 68英語Interactive ALGOL 68 1983  英國 增量編譯 PC 非商業共享軟體
ALGOL 68S英語ALGOL 68S 1985 科學 Does not appear ALGOL 68的子集語言[25] Sun-3英語Sun-3, Sun SPARC (在SunOS 4.1和Solaris 2之下), Atari ST (在GEMDOS之下), Acorn Archimedes英語Acorn Archimedes (在RISC OS之下), VAX-11英語VAX-11Ultrix-32英語Ultrix之下
Algol68toC[26] 1985 電子  英國 基於源自ELLA英語ELLA (programming language) ALGOL 68RS英語ALGOL 68RS的ctrans 可移植C生成器 開源軟體 1995 ALGOL 68RS
MK2 交互式ALGOL 68英語Interactive 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

參見

[編輯]

註釋

[編輯]
  1. ^ ALGOL 68 Genie. [2020-04-22]. (原始內容存檔於2020-08-14). 
  2. ^ 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. 
  3. ^ 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). 
  4. ^ Interview with Guido van Rossum. July 1998 [2007-04-29]. (原始內容存檔於2007-05-01). String slicing came from Algol-68 and Icon. 
  5. ^ 5.0 5.1 5.2 5.3 Revised Report on the Algorithmic Language Algol 68. 
  6. ^ Adriaan van Wijngaarden. Orthogonal design and description of a formal language (PDF). 1965. 
  7. ^ 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. 
  8. ^ 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. 
  9. ^ Gommas?. 
  10. ^ 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. 
  11. ^ Learning Algol 68 Genie (PDF). Some claim that Ada is Algol 68’s successor but many dispute that. 
  12. ^ Adriaan van Wijngaarden. Generalized ALGOL (PDF). Symbolic Languages in Data Processing, Proc. Symp. Intl, Computation Center Rome, Gordon & Beach, New York. 1962. 
  13. ^ 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. 
  14. ^ Report on the algorithmic language ALGOL 68. 1969. 
  15. ^ 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. 
  16. ^ "An interpreter for simple Algol 68 Programs" 網際網路檔案館存檔,存檔日期2011-07-18.
  17. ^ Daniel M. Berry. The importance of implementation models in ALGOL 68: or how to discover the concept of necessary environment. 
  18. ^ Liverpool Software Gazette March 1980 (PDF). [2010-03-20]. (原始內容 (PDF)存檔於2010-04-15). 
  19. ^ Revised report on the algorithmic language ALGOL 68 (PDF). 1976. 
  20. ^ 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. 
  21. ^ ALGOL 68 Version I Reference Manual (PDF). Control Data Services B.V., Rijswijk, Netherlands. 1976. 
  22. ^ ALGOL68 instruction at Oklahoma State University. 
  23. ^ "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.
  24. ^ Algol 68+, a superlanguage of Algol 68 for processing the standard-prelude (PDF). 1981. 
  25. ^ Hibbard, P.G. A Sublanguage of ALGOL 68. SIGPLAN Notices. May 1977, 12 (5): 71–79. S2CID 37914993. doi:10.1145/954652.1781177可免費查閱. 
  26. ^ Open source Algol 68 implementations / algol68toc. Sourceforge.net. Retrieved on 2013-07-21.
  27. ^ a68mk2.zip 網際網路檔案館存檔,存檔日期2006-08-29.

外部連結

[編輯]