Exception 第一个实现异常处理的语言是什么?

Exception 第一个实现异常处理的语言是什么?,exception,exception-handling,Exception,Exception Handling,这个问题不是技术问题,而是历史问题。我今天想,我也认为Java是使用异常处理的“第一”语言,直到我意识到我这样想的原因可能是因为Java是我遇到的第一种使用它的语言,但我没有历史数据来支持这一结论。现在异常处理在所有现代语言中都很常见,所以我只是想知道:有人知道它是什么时候开始被广泛使用的吗?什么语言是第一个开始使用它的?我们不应该忘记在20世纪70年代,C语言有setjmp(3)和longjmp(3) 在这之前,是Basic,错误转到… 我从未见过algol68实现,但我听说它有厨房水槽…C+

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

我们不应该忘记在20世纪70年代,C语言有
setjmp(3)
longjmp(3)

在这之前,是Basic,错误转到…


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

C++在Java之前就有例外

异常处理实际上可以追溯到编程语言出现之前;起初,它是一种硬件机制,用于捕获错误条件(导致执行暂停的错误条件)并选择性地分支到子例程

例如,VAX CPU可以检测何时访问了一个没有物理映射的虚拟地址,并调用一个子例程,该子例程要么从swap加载适当的页面,要么停止程序。这种机制在现代处理器中基本相同(查找“翻译查找缓冲区”)。所以在某种意义上,第一种有异常的语言是汇编语言


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

在20世纪70年代早期就有异常处理。

我记得在。。。嗯。。。1984这种语言早在那时就存在了。Mesa有一个有趣的异常模型。除了以正常方式传播和处理异常外,处理程序还可以“恢复”异常,导致执行从“throw”语句返回。

Algol 68的“transput”具有“事件”处理,但它的流线化程度不足以让程序员扩展它

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

  • 字符错误、格式错误、联机 结束,逻辑文件结束,页面结束, 在物理文件结束时&在值错误时
1983年,允许程序员定义自己的异常的提议被接受。AFAIK这些建议都没有被联合国IFIP接受

然而,俄罗斯标准机构“GOST”在该标准中的开放/Γааааааааааааа107

GOST 27975-88使用了额外的关键词:模块、发布、发布、嵌套、蛋、开启、异常和提升

以下是英国的原始提案:

  • :“ALGOL 68中异常处理的建议”,附页:10-15

  • :“ALGOL 68的异常处理机制”,附页:16-17

  • 它们看起来与现在在中实现的类似

    林赛的例子:

        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;
    
        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
    
    例外情况包括:时间耗尽、空间耗尽、算术错误、边界错误、范围错误、无法传输、文件结束、字符错误、值错误和格式错误

    Martyn Thomas的例子:

        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;
    
        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
    
    顺便说一句:苏联的航天飞机在1988年完成了一次无人驾驶的太空飞行,自动着陆系统是用Algol语言编写的。美国仍然在(Algol 58)部署大量的军事/空间设备,这可能包含20世纪50年代的异常处理。有人对此有什么想法吗


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

    编程语言:原理和实践,第二版,肯尼斯C.劳登(一本著名的编程语言教科书)指出,“异常处理在20世纪60年代由PL/I语言开创,在70年代在CLU中取得了显著的进步。然而,直到20世纪80年代和90年代初,设计问题才基本上得到解决”(283)。

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

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

    在Lisp1.5中,某些内置函数在给定错误参数时可能会发出错误信号,例如 发出错误信号通常会导致程序终止或调试器调用。 Lisp1.5也有这个功能 错误 ,这对于受控执行 可以 导致错误。特殊窗体

    (errset form)
    
    评估 形式 在错误不会终止程序或进入调试器的上下文中。 如果 形式 不会导致错误, 错误 返回值的单例列表。如果执行 形式 确实会导致错误 错误 形式悄然回归 无

    MacLisp添加了该函数 犯错误 ,表示错误。如果 犯错误 在动态 上下文 错误 形式,然后将参数 犯错误 作为的值返回 错误 形式

    程序员很快开始使用 错误 和 犯错误 不是陷阱和信号错误,而是更多 一般控制目的(动态非本地出口)。不可更改