2009-09-20 32 views
18

Câu hỏi này không phải là kỹ thuật mà là một câu hỏi lịch sử. Tôi đã suy nghĩ ngày hôm nay rằng tôi cũng nghĩ Java là ngôn ngữ "đầu tiên" để sử dụng xử lý ngoại lệ, cho đến khi tôi nhận ra rằng lý do của tôi để suy nghĩ theo cách này có thể là vì Java là ngôn ngữ đầu tiên I gặp phải sử dụng nó, nhưng tôi không có dữ liệu lịch sử để sao lưu kết luận đó. Ngày nay xử lý ngoại lệ là phổ biến trong tất cả các ngôn ngữ hiện đại, vì vậy tôi chỉ tự hỏi: không ai biết khi nào nó bắt đầu được sử dụng rộng rãi? Và ngôn ngữ nào là người đầu tiên bắt đầu sử dụng nó?Ngôn ngữ nào là người đầu tiên thực hiện xử lý ngoại lệ?

+0

java không phải là người đầu tiên có hầu hết mọi thứ –

Trả lời

29

Ngôn ngữ lập trình: Nguyên tắc và thực hành, ấn bản thứ 2 của Kenneth C. Louden (một sách giáo khoa đáng chú ý về ngôn ngữ lập trình) lưu ý rằng "Xử lý ngoại lệ được tiên phong bởi ngôn ngữ PL/I vào những năm 1960 và nâng cao đáng kể trong CLU vào những năm 1970. Tuy nhiên, chỉ trong những năm 1980 và đầu những năm 1990, những câu hỏi thiết kế đã được giải quyết phần lớn ”(283).

+0

+1 để tham chiếu –

+0

[Corbató] (http://en.wikipedia.org/wiki/Fernando_J._Corbató) tham chiếu đến việc sử dụng các điều kiện 'ON' trong bài viết 1969 Datamation có tiêu đề [_PL/I As Công cụ lập trình hệ thống] (http://web.archive.org/web/20080206153039/http://home.nycap.rr.com/pflass/PLI/plisprg.html), viết về trải nghiệm của nhóm [Multics] (http://en.wikipedia.org/wiki/Multics) với trình biên dịch PL/I "tạm thời" của họ, vào thời điểm đó đã 5 năm trong cuộc đời của nó. –

0

Chúng ta không nên quên C có setjmp(3)longjmp(3) trong thập niên 1970.

Và trước đó, cơ bản, với on error goto...

Tôi chưa bao giờ thấy một thực hiện algol68, nhưng tôi nghe nói nó có bồn rửa nhà bếp ...

+2

Tôi đã nghe nói rằng PL/1 là lớn và phức tạp cho ngày của nó, nó có thể có trường hợp ngoại lệ, có nghĩa là họ có thể là khá cũ, năm 1960 giữa. COBOL dường như có chúng ngay bây giờ, nhưng tôi tự hỏi khi chúng được thêm vào .. – DigitalRoss

+0

Ồ, tôi đã nghĩ đến một điều nữa. Rất có thể một trong số 999 phiên bản của Lisp đầu tiên với một cơ chế giống như ngoại lệ. – DigitalRoss

+1

Tôi đã viết PL/1 trên VAX vào năm 1986 và đã có xử lý ngoại lệ được tích hợp sẵn trong ngôn ngữ. – PaulMcG

7

C++ có ngoại lệ trước khi Java đã làm.

15

Xử lý ngoại lệ thực sự quay lại ngay cả trước các ngôn ngữ lập trình; lúc đầu, nó là một cơ chế phần cứng để bẫy các điều kiện lỗi (những điều đã gây ra sự ngừng thực thi) và phân nhánh tùy ý tới một chương trình con. Ví dụ, CPU VAX có thể phát hiện khi một địa chỉ ảo không có ánh xạ vật lý được truy cập và gọi vào một chương trình con đã tải trang thích hợp từ hoán đổi hoặc tạm dừng chương trình. Cơ chế cơ bản là giống nhau trong các bộ vi xử lý hiện đại (tra cứu "bộ đệm dịch lookaside"). Vì vậy, theo một nghĩa nào đó, ngôn ngữ đầu tiên có ngoại lệ là lắp ráp.

Các ngôn ngữ có cấu trúc sớm nhất có ngoại lệ dường như là PL/I và CLU (xem Mipadi ở trên).

+1

Phần cứng bẫy/ngắt khác với xử lý ngoại lệ. Bẫy/ngắt nói chung hoặc là có được lồng nhau trên ngăn xếp và cho phép xử lý để tiếp tục không bị quấy rầy, hoặc người nào khác họ giết một sợi và ngăn xếp của nó. Rất hiếm khi bẫy phần cứng/ngắt được sử dụng để làm gián đoạn luồng chương trình với bất kỳ mô hình nào từ xa giống với C++/C#/vb/.net/etc. ngoại lệ. – supercat

10

CLU có xử lý ngoại lệ vào đầu những năm 1970.

+1

Trên thực tế, theo giấy bạn liên kết đến, công việc xử lý ngoại lệ của CLU bắt đầu vào năm 1975 và nó đã ổn định vào năm 1977. Vì vậy, * cuối * 1970 sẽ là một đặc tính tốt hơn. –

4

Tôi có thể nhớ sử dụng trình xử lý ngoại lệ bằng ngôn ngữ Mesa của Xerox trong ... um ... 1984. Ngôn ngữ đã tồn tại tốt trước đó. Mesa có một mô hình ngoại lệ thú vị. Ngoài việc tuyên truyền và xử lý một ngoại lệ theo cách thông thường, một trình xử lý có thể "tiếp tục" một ngoại lệ, khiến cho việc thực hiện trở lại từ câu lệnh "ném".

+0

Khả năng tiếp tục một ngoại lệ thực sự tồn tại trong các ngoại lệ của Windows, mặc dù nó không phải là một điều nổi tiếng/được sử dụng ... –

+1

@Matthew. Vì vậy, có lẽ đây là nơi Windows sao chép nó từ :-) –

+0

Xem thảo luận của Stroustrup về ngữ nghĩa 'chấm dứt vs tiếp tục' trong "Thiết kế và Tiến hóa của C++". Hệ thống Cedar được xây dựng bằng cách sử dụng Mesa và ban đầu có một số ngoại lệ 'tiếp tục', nhưng theo thời gian, tất cả chúng đều bị loại bỏ để ủng hộ các ngữ nghĩa 'chấm dứt'. Cuối cùng, Cedar chỉ còn một ngoại lệ được sử dụng ngữ nghĩa 'tiếp tục', và trên đánh giá thêm, điều đó cũng bị loại bỏ. –

3

"chuyển đổi" của Algol 68 có xử lý "sự kiện", nhưng nó không đủ khả năng để người lập trình mở rộng phạm vi.

Tiêu chuẩn ALGOL 68 sử dụng thường trình sự kiện trong "chuyển đổi chuẩn" (stdio) để quản lý các sự kiện khác nhau phát sinh khi dữ liệu được đọc (hoặc ghi) vào tệp hoặc thiết bị bên ngoài. Việc xây dựng trong "về sự kiện" thói quen là:

  • về lỗi char, về lỗi định dạng, trên dòng kết thúc, kết thúc tập tin hợp lý, trên cuối trang, trên vật lý tập tin cuối & về lỗi giá trị

Năm 1983 Đề xuất đã được chấp nhận để cho phép một lập trình viên xác định ngoại lệ của riêng họ. AFAIK không có đề xuất nào trong số này được chấp nhận bởi IFIP của Liên Hợp Quốc.

Tuy nhiên người Nga tiêu chuẩn cơ "GOST" đã chuẩn xử lý ngoại lệ gần cuối Glasnost/Гласност trong tiêu chuẩn "GOST 27975-88 Programming language ALGOL 68 extended - Язык программирования АЛГОЛ 68 расширенный"

GOST 27.975-88 sử dụng các từ khoá bổ sung: MODULE, PUB, POSTLUDE, NEST, EGG, ON, EXCEPTION và RAISE.

Dưới đây là đề nghị Anh gốc:

  1. AB49.1983-May: "Một đề xuất cho Xử lý ngoại lệ trong ALGOL 68", bởi C. H. Lindsey - Trang: 10 - 15

  2. AB49.1983-May: "Một Exception- Cơ chế xử lý cho ALGOL 68 ", bởi Martyn Thomas - Trang: 16 - 17

Chúng xuất hiện tương tự với những gì hiện được triển khai trong python.

Lindsey của Ví dụ:

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; 

Exceptions bulitin là: thời gian cạn kiệt, không gian cạn kiệt, lỗi số học, lỗi giới hạn, phạm vi lỗi, transput không thể, tập cuối, lỗi char, lỗi giá trị và lỗi định dạng

Martyn Thomas Ví dụ:

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: Tàu con thoi Buran/Буран của Liên Xô đã hoàn thành một chuyến bay vũ trụ không người lái vào năm 1988, một hệ thống hạ cánh vô dụng được viết bằng Algol. Của Amercian vẫn triển khai nhiều bit của bộ máy quân sự/không gian trong Jovial (Algol 58), và điều này có thể chứa xử lý ngoại lệ từ những năm 1950. Bất cứ ai có ý tưởng về điều này? ...

Wikipedia: Buran_(spacecraft): Xe đưa đón quay quanh Trái đất hai lần trong 206 phút bay. Nó thực hiện hạ cánh tự động trên đường băng đưa đón tại Baikonur Cosmodrome ở đâu, mặc dù tốc độ gió bên của 61,2 km (38,0 dặm)/giờ, nó đã hạ cánh chỉ có 3 mét (9.8 ft) chiều ngang và 10 mét (33 ft) chiều dọc từ mục tiêu.

+1

Có giống như ngoại lệ OOP hay tín hiệu/bẫy (đôi khi còn được gọi là ngoại lệ phần cứng)? Một điều đặt ra các ngoại lệ OOP ngoài các khái niệm trước đó là các khái niệm trước đó như tín hiệu/bẫy sẽ xóa toàn bộ hoặc đẩy mọi thứ vào nó trước khi xử lý điều kiện ngoại lệ, trong khi các ngoại lệ OOP bật ngăn xếp trở lại các điểm cụ thể. – supercat

1

Về hỗ trợ COBOL cho xử lý ngoại lệ: cổ điển (I/O và số học) xử lý ngoại lệ đã được khoảng từ ít nhất tiêu chuẩn COBOL năm 1968. Xử lý ngoại lệ OO đã được thêm vào COBOL trong tiêu chuẩn 2002.