ALGOL 58

ALGOL 58（源自的縮寫），最早稱為“国际代数语言”（，縮寫為IAL），它是一種用于计算机编程的算法语言，是ALGOL家族的第一個成員。它在1958年問世，ALGOL 60即是它的基礎上開發而成。

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

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

ALGOL 58变体时间线
名称年作者国家描述目标CPU ZMMD实现 1958  , , ,     ZMMD是Zürich、München、Mainz、Darmstadt的缩写     1958       JOVIAL 1960      DOD的HOL，先于Ada  多种   1960  Joel Merner等人       B220   1960  密西根大学      IBM 7090/7094主机，接着在1960年代中期移植到   1961          1962  达特茅斯学院的等人    后来演进成ALGOL 60   SUBALGOL  1962  斯坦福大学的, 和    BALGOL扩展  IBM 7090

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

 缩进排版  语言报告排版procedure Simps(F(), a, b, delta, V);
comment a, b are the mi​n an​d ma​x, resp. o​f the points def. interval o​f integ.
        F() i​​s the fu​nction t​o inte​grated.
        delta i​s the permissible difference between two successive Simpson sums
        V i​s greater than maximum abso​lute value o​f F o​n 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 t​o J1
    end
    Simps := I/3
    return
    integer (k, n)
end Simpsprocedure Simps(F(), a, b, delta, V);
comment a, b are the mi​n an​d ma​x, resp. o​f the points def. interval o​f integ.
        F() i​​s the fu​nction t​o inte​grated.
        delta i​s the permissible difference between two successive Simpson sums
        V i​s greater than maximum abso​lute value o​f F o​n 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 t​o 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语言及其有关语言的。
 IAL提议了内联函数形如f(x) := x / 2，这在ALGOL 60中被去掉了。
 IAL过程声明为输入和输出参数提供了独立声明，过程可以返回多个值，这种机制在ALGOL 60中被替代为值声明。
 IAL中的变量声明可以位于程序中的任何位置而不必需在过程的开始处。与之相对，在ALGOL 60块中的声明的出现应当先于所有执行语句。
 IAL的for语句拥有形式for i := base (increment) limit，直接模仿了的编程语言的循环，将其=替代为:=，并将其德语关键字Für替代为英语翻译for；ALGOL 60将圆括号替代为字分界符step和until，使得前者语句转而写为for i := base step increment until limit。
 IAL的if语句没有then子句或else子句，它只是用布尔表达式守卫后续语句，进行关系运算的布尔表达式需要用圆括号包围起来。IAL提供了交替语句if either ~ or if ~ end来清晰的允许多个条件的测试。二者都被替代为ALGOL的if ~ then ~ 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

Category:程序设计语言
Category:ALGOL程式語言家族