ALGOL 58

ALGOL 58（源自ALGOrithmic Language 1958的缩写），最早称为“国际代数语言”（International Algebraic Language，缩写为IAL），它是一种用于计算机编程的算法语言，是ALGOL家族的第一个成员。它在1958年问世，ALGOL 60即是它的基础上开发而成。

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

## 历史

1958年，美国计算机协会（ACM）与联邦德国的应用数学和力学协会（GAMM）在苏黎世成立小组，把美国方面提出的“编程语言”，和欧洲方面提出的“描述计算进程的通用性语言”，这两种提议综合为一从而形成“国际代数语言”（IAL），随后在1959年正式报告中改称为算法语言ALGOL。

## ALGOL 58变体时间线

名称｜年｜作者｜国家｜描述｜目标CPU

ZMMD实现｜1958｜Friedrich L. Bauer, Heinz Rutishauser, Klaus Samelson, Hermann Bottenbruch｜德国｜ZMMD是Zürich、München、Mainz、Darmstadt的缩写｜Z22计算机

NELIAC｜1958｜海军电子实验室｜美国｜AN/USQ-17

JOVIAL｜1960｜Jules Schwartz｜美国｜DOD的HOL，先于Ada｜多种

BALGOL｜1960｜Joel Merner等人｜美国｜Burroughs公司 B220

MAD语言｜1960｜密歇根大学｜美国｜IBM 7090/7094主机，接着在1960年代中期移植到Univac 1108

ALGO｜1961｜Bendix公司｜美国｜Bendix G-15

达特茅斯ALGOL 30｜1962｜达特茅斯学院的Thomas Eugene Kurtz等人｜美国｜后来演进成ALGOL 60｜LGP-30

SUBALGOL｜1962｜斯坦福大学的Bob Braden, Lawrence M. Breed和Roger Moore (computer scientist)｜美国｜BALGOL扩展｜IBM 7090

## 例子代码

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

块缩进排版｜语言报告的排版

```pascal
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
```

```pascal
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
```

这里在过程主体的复合语句的`begin`之后，必须为前面的过程头部中声明的过程名字包含此标识符的恰好一个语句标签，它被用作过程入口点；这里的非实数类型声明`integer (k, n)`放在了过程主体的末尾，即就在这个复合语句的`end`之前；有标签的复合语句在其`end`之后可以跟随着这个标签（尾随`;`来分隔于后续字符），它被用来指示这个复合语句的范围。

## ALGOL 58对ALGOL 60的影响

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

## 外部链接

- Algol 58 at the Software Preservation Group (cf. Computer History Museum)
- Algol 58 report from CACM at the Software Preservation Group

## 基本资料

- 编程范型：过程式, 指令式, 结构化
- 发行时间：1958年
- 设计者：Friedrich L. Bauer, Hermann Bottenbruch, Heinz Rutishauser, Klaus Samelson, 约翰·巴科斯, Charles Katz, 艾伦·佩利, Joseph Henry Wegstein
- 受影响于：FORTRAN, IT, Plankalkül, Superplan, Sequentielle Formelübersetzung
- 施影响于：ALGOL 60，以及类ALGOL语言