跳转到内容

ALGOL 58

维基百科,自由的百科全书
ALGOL 58
编程范型过程式, 指令式, 结构化
設計者Friedrich L. Bauer英语Friedrich L. Bauer, Hermann Bottenbruch英语Hermann Bottenbruch, Heinz Rutishauser英语Heinz Rutishauser, Klaus Samelson英语Klaus Samelson, 約翰·巴科斯, Charles Katz英语Charles Katz, 艾伦·佩利, Joseph Henry Wegstein英语Joseph Henry Wegstein
发行时间1958年,​67年前​(1958
受影响于
FORTRAN, IT, Plankalkül[1], Superplan英语Superplan, Sequentielle Formelübersetzung
影響語言
ALGOL 60,以及类ALGOL语言

ALGOL 58(源自英語:ALGOrithmic Language 1958的縮寫),最早稱為国际代数语言(英語:International Algebraic Language,縮寫為IAL)[2],一種程式語言,是ALGOL家族的第一個成員。它在1958年問世,ALGOL 60即是它的基礎上開發而成。

ALGOL 58介入了复合语句的基础概念[3],但只局限于控制流程,它没有以ALGOL 60中的那种方式,结合上标识符作用域

歷史

[编辑]

1958年,美国计算机协会(ACM)与联邦德国的应用数学和力学协会英语Gesellschaft für Angewandte Mathematik und Mechanik(GAMM)成立小组,在苏黎世把他们关于算法表示法的建议综合为一从而形成IAL(国际代数语言)[4],后来改称ALGOL 58。

ALGOL 58变体时间线

[编辑]
名称 作者 国家 描述 目标CPU
ZMMD实现 1958 Friedrich L. Bauer英语Friedrich L. Bauer, Heinz Rutishauser英语Heinz Rutishauser, Klaus Samelson英语Klaus Samelson, Hermann Bottenbruch英语Hermann Bottenbruch  德国 ZMMD是ZürichMünchenMainzDarmstadt的缩写 Z22英语Z22 (computer)
NELIAC英语NELIAC 1958 海军电子实验室英语Navy Electronics Laboratory  美国 AN/USQ-17英语AN/USQ-17
JOVIAL 1960 Jules Schwartz英语Jules Schwartz  美国 DODHOL,先于Ada 多种
BALGOL英语BALGOL 1960 Joel Merner等人  美国 Burroughs公司英语Burroughs Corporation B220
MAD英语MAD (programming language) 1960 密西根大学  美国 IBM 7090/7094主机,接着在1960年代中期移植到Univac 1108英语Univac 1108
ALGO英语ALGO 1961 Bendix公司英语Bendix Corporation  美国 Bendix G-15英语Bendix G-15
ALGOL 30英语Dartmouth ALGOL 30 1962 达特茅斯学院Thomas Eugene Kurtz英语Thomas Eugene Kurtz等人  美国 后来演进成ALGOL 60 LGP-30英语LGP-30
SUBALGOL 1962 斯坦福大学Bob Braden英语Bob Braden, Lawrence M. Breed英语Lawrence M. BreedRoger Moore英语Roger Moore (computer scientist)  美国 BALGOL扩展 IBM 7090

例子代码

[编辑]

下面是语言报告中的例子代码,采用辛普森积分法计算函数F(x)的积分,函数F(x)的值由假定存在的函数例程提供:

procedure Simps(F(), a, b, delta, V);
comment a, b are the min and max, resp. of the points def. interval of integ.
        F() is the function to integrated.
        delta is the permissible difference between two successive Simpson sums.
        V is greater than maximum absolute value of F on a, b;
begin
Simps:  Ibar := V×(b-a)
        n    := 1
        h    := (b-a)/2
        J    := h×(F(a)+F(b))
J1:     S    := 0;
  for   k    := 1 (1) n
        S    := S+F(a+(2×k-1)×h)
        I    := J+4×h×S
  if    (delta < abs(I-Ibar))
begin   Ibar := I
        J    := (I+J)/4
        n    := 2×n; h := h/2
        go to J1 end
        Simps := I/3
return
integer (k, n)
  end   Simps

这里的非实数类型声明放在了过程的末尾。原文中的斜体显示改为了粗体,下面再将其调整为ALGOL 60开创的缩进格局:

procedure Simps(F(), a, b, delta, V);
comment a, b are the min and max, resp. of the points def. interval of integ.
    F() is the function to integrated.
    delta is the permissible difference between two successive Simpson sums.
    V is greater than maximum absolute value of F on a, b;
begin
Simps:
    Ibar := V×(b-a)
    n := 1
    h := (b-a)/2
    J := h×(F(a)+F(b))
J1: S := 0;
    for k := 1 (1) n
        S := S+F(a+(2×k-1)×h)
    I := J+4×h×S
    if (delta < abs(I-Ibar))
    begin
        Ibar := I
        J := (I+J)/4
        n := 2×n; h := h/2
        go to J1
    end
    Simps := I/3
    return
    integer (k, n)
end Simps

ALGOL 58对ALGOL 60的影响

[编辑]
  • IAL介入了参考、出版和硬件语言的三级概念,和有别于自由选择的标识符的有独立表示的“字分界符”的概念(因此没有保留字)。ALGOL 60保持了这种三级概念[5]
  • IAL介入了对赋值(表示左向箭头的:=)和等价关系=的区分,ALGOL 60保持了这种区分。
  • IAL和ALGOL 60都允许了具有任意的下方和上方下标边界的数组,并允许用整数表达式定义下标边界。
  • IAL和ALGOL 60都允许嵌套的过程定义以及对应标识符的作用域。
  • IAL报告采用与ALGOL 60报告几乎相同的术语描述参数替换,将传名调用的可能性保留开放。但不清楚是否当时就认识到了这一点。
  • IAL允许数值语句标号,ALGOL 60保持了它。
  • IAL在程序内包括非ALGOL代码的可能性,已经在过程参数的上下文中提示到了。
  • IAL和ALGOL 60都有“switch指定式”,但无关于C语言及其有关语言的switch语句英语switch statement
  • IAL提议了内联函数形如f(x) := x / 2,这在ALGOL 60中被去掉了。
  • IAL过程声明为输入和输出参数提供了独立声明,过程可以返回多个值,这种机制在ALGOL 60中被替代为声明。
  • IAL中的变量声明可以位于程序中的任何位置而不必需在过程的开始处。与之相对,在ALGOL 60块中的声明的出现应当先于所有执行语句。
  • IAL的for语句拥有形式for i := base (increment) limit,直接模仿了Rutishauser英语Heinz Rutishauser的编程语言Superplan英语Superplan的循环,将其=替代为:=,并将其德语关键字Für替代为英语翻译for;ALGOL 60将圆括号替代为字分界符stepuntil,使得前者语句转而写为for i := base step increment until limit
  • IAL的if语句没有then子句或else子句,它只是守卫后续语句。IAL提供了if either语句来清晰的允许多个条件的测试。二者都被替代为ALGOL的if-then构造,它介入了悬摆else英语Dangling else歧义。
  • IAL通过do语句提供宏替代,这在ALGOL 60中被去掉了。
  • IAL允许在将数组传递给过程时忽略一个或多个数组下标,允许将给一个过程的任何或所有的实参传递给另一个过程。
  • IAL的中缀布尔运算符都有相同的优先级。指数通过成对的上下箭头来指示,这去除了嵌套指数的解释混淆;ALGOL 60将成对的箭头替代为一个单一的上箭头,它的功能等价于FORTRAN的**
  • IAL报告不明确规定要提供哪些标准函数,模糊的提及了“标准分析函数”。ALGOL 60报告拥有标准函数的更明确列表。

引用

[编辑]
  1. ^ Rojas, Raúl; Hashagen, Ulf. The First Computers: History and Architectures. MIT Press. 2002: 292 [October 25, 2013]. ISBN 978-0262681377. (原始内容存档于2020-08-04). 
  2. ^ Perlis, A.J. Talk on Computing in the fifties. ACM National Conference. Nashville,. TN. (Transcript in J. A. N. Lee (ed.), Computer Pioneers, IEEE Computer Society Press, Los Alamito, CA, 1995, 545-556). 1981. 
  3. ^ Perlis, A. J.; Samelson, K. Preliminary report: international algebraic language (PDF). Communications of the ACM (New York, NY, USA: ACM). 1958, 1 (12): 8–22 [2023-02-20]. doi:10.1145/377924.594925. (原始内容存档 (PDF)于2023-02-20). Strings of one or more statements may be combined into a single (compound) statement by enclosing them within the "statement parentheses" begin and end. Single statements are separated by the statement separator ";". 
  4. ^ Perlis, A.J.; Samelson, K. Preliminary report: international algebraic language. Communications of the ACM. 1958, 1 (12): 8–22. doi:10.1145/377924.594925. 
  5. ^ Naur, P (编). Revised report on the Algorithmic Language ALGOL 60 (PDF). International Federation for Information Processing. 1962. 

外部連結

[编辑]