首先实现异常处理的语言是什么?

时间:2009-09-20 00:39:35

标签: exception exception-handling

这个问题不是技术问题,而是历史问题。我今天才想到我还认为Java是使用异常处理的“第一”语言,直到我意识到我这样思考的原因可能是因为Java是第一种语言 I 遇到了使用它,但我没有历史数据来支持这个结论。如今,异常处理在所有现代语言中都很常见,所以我只是想知道:有人知道它何时首次被广泛使用?什么语言是第一个开始使用它?

9 个答案:

答案 0 :(得分:29)

编程语言:原理和实践,第2版,作者Kenneth C. Louden(一本着名的编程语言教科书)指出,“异常处理是由20世纪60年代的PL / I语言开创的,在20世纪70年代,在CLU中取得了显着进步。然而,仅在20世纪80年代和90年代初期,设计问题才得到了很大的解决“(283)。

答案 1 :(得分:15)

异常处理甚至可以在编程语言之前回归;首先,它是一种用于捕获错误条件(导致执行暂停的条件)和可选地分支到子例程的硬件机制。

例如,VAX CPU可以检测何时访问了没有物理映射的虚拟地址,并调用从交换加载适当页面或暂停程序的子例程。该机制在现代处理器中基本相同(查找“转换后备缓冲区”)。所以从某种意义上说,第一种有例外的语言是汇编。

最早的结构化语言似乎是PL / I和CLU(见上面的Mipadi)。

答案 2 :(得分:10)

CLU在20世纪70年代早期进行了异常处理。

答案 3 :(得分:7)

在Java之前,C ++有例外。

答案 4 :(得分:4)

我记得在1984年使用Xerox的Mesa语言中的异常处理程序。这种语言在此之前就存在了。梅萨有一个有趣的例外模型。除了以正常方式传播和处理异常之外,处理程序还可以“恢复”异常,从而导致执行从“throw”语句返回。

答案 5 :(得分:3)

Algol 68的“transput”有“事件”处理,但它不够流畅,程序员可以扩展它。

ALGOL 68 标准在“标准传输”(stdio)中广泛使用事件例程来管理将数据读取(或写入)到文件或外部设备时出现的各种事件。内置的“on event”例程是:

  • on char错误,格式错误,在线 结束,在逻辑文件结束,在页面结束, 在物理文件结束&价值错误

1983年,正在接受提案,允许程序员定义自己的例外情况。 AFAIK联合国的IFIP没有接受这些提案。

然而,俄罗斯标准组织“GOST”确实标准化了Glasnost /Гласност结尾附近的异常处理标准"GOST 27975-88 Programming language ALGOL 68 extended - Язык программирования АЛГОЛ 68 расширенный"

GOST 27975-88使用了额外的关键字:MODULE,PUB,POSTLUDE,NEST,EGG,ON,EXCEPTION和RAISE。

以下是英国最初的提案:

  1. AB49.1983-May:“关于ALGOL 68中异常处理的提案”,C. H. Lindsey - 页数:10 - 15

  2. AB49.1983-May:“ALGOL 68的异常处理机制”,Martyn Thomas - 页数:16 - 17

  3. 它们看起来与python中实现的内容类似。

    林赛的例子:

        EXCEPTION singular = new exception ; # EXCEPTION la a new mode #
        PROC gauss = ( REF [ , ] REAL a. REF [ ] REAL rhs ) VOID :
              COMMENT a procedure to solve a set of simultaneous
                          equations COMMENT
              BEGIN C the usual algorithm for gaussian elimination which, at some
                                  point, may discover that a is singular C ;
                       IF C it makes this discovery C
                       THEN RAISE singular
                       FI;
                       C rest of algorithm CO
              END;
    

    例外bulitin:时间耗尽,空间耗尽,算术错误,边界错误,范围错误,无法传输,文件结束,字符错误,值错误和格式错误

    马丁·托马斯的例子:

        BEGIN
          on ( overflow , overflow handler ) ;
          on ( bound check, boundcheckhandler ) ;
          C body of the closed - clause C
        EXIT
        overflow handler:
                C handle overflow exceptions C
        EXIT
        bound check handler:
            C handle bound check C
        END
    
    BTW:苏联的航天飞机Buran/Буран于1988年完成了一次无人太空飞行,自动着陆系统是用Algol编写的。 Amercian仍然在Jovial(Algol 58)中部署了大量的军事/太空装置,而这个可能包含了20世纪50年代的异常处理。有人对此有任何想法吗?...

    维基百科:Buran_(spacecraft):航天飞机在206分钟的飞行中绕地球飞行两次。它在Baikonur Cosmodrome的航天飞机跑道上进行了自动着陆,尽管横向风速为61.2公里(38.0英里)/小时,但它横向降落仅3米(9.8英尺),纵向降落10米(33英尺)。来自目标。

答案 6 :(得分:1)

关于COBOL对异常处理的支持:经典(I / O和算术)异常处理至少从1968年的COBOL标准开始。在2002标准中,OO异常处理被添加到COBOL中。

答案 7 :(得分:0)

我们不应该忘记1970年代有setjmp(3)longjmp(3)的C.

在此之前,Basic,on error goto...

我从未见过algol68的实现,但我听说它有厨房水槽......

答案 8 :(得分:0)

1962年参考手册中描述的Lisp 1.5中的errorset函数是异常处理的早期形式。在 Lisp的演变中,Gabriel和Steele发表了这些评论,显然使运算符的名称略有错误并简化了其语法(第9-10页):

在Lisp 1.5中,如果给定不正确的参数,某些内置函数可能会发出错误信号,例如 例。发出错误信号通常会导致程序终止或调试器的调用。 Lisp 1.5也具有功能 错误集 ,对于受控执行代码 威力 导致错误。特殊形式

(errset form)

评估 形成 在错误不会终止程序或进入调试器的情况下。 如果 形成 不会引起错误, 错误集 返回值的单例列表。如果执行 形成 确实会导致错误, 错误集 形式悄悄地返回 零

MacLisp添加了功能 呃 ,表示出现错误。如果 呃 在动态内调用 一个上下文 错误集 形式,然后将参数 呃 返回为的值 错误集 表格。

程序员很快开始使用 错误集 和 呃 不是捕获错误并发信号,而是更多 一般控制目的(动态非本地出口)。不幸的是,这种使用 错误集 也悄悄地 捕获意外错误,使程序难以调试。一对新的原语, 抓住 和 扔 于1972年6月引入MacLisp,因此 错误集 可以保留其预期用途 使用错误陷阱。

manual当然在第34页的“ 6.4缺点计数器和错误集”一节中有详细信息。

看起来errorset与内存分配监视程序“ cons计数器”交互。 errorset的用户必须指定一个整数值n,该整数值指定在陷阱发生之前可以在受保护的计算中分配多少个cons单元。

描述以以下单词结尾:

如果 一个 错误 发生 内 的 一个 错误集 然后 的 值 的 错误集 是 零。 如果是 能 界 外 的 的 错误集 有 不 是 改变了 通过 使用 设置 要么 组, 和 如果不 损伤 具有 是 完成 通过 伪功能 可能是 可能 至 继续计算 在 不同的 方向 什么时候 一 路径 结果 在一个 错误。

这清楚地表明,该结构适合于局部捕获错误,然后进行恢复(“在一条路径导致错误的情况下,以不同的方向继续进行计算”)。

ANSI Common Lisp“条件”从PL / I“条件”系统中获得了很多启发。但是,在Lisp 1.5的errset之后几年,PL / I为first available in 1966first PL/I reference manual(日期为1965年)已经描述了接通装置和条件。