Những người khác đã trả lời đúng "Không" với các ví dụ về ngôn ngữ. Tôi nghĩ rằng tôi có thể mở rộng bằng cách thêm một ví dụ về cách thêm ngoại lệ vào ngôn ngữ mà không bao giờ liên quan đến OOP.
Tôi sẽ làm điều này trong trường hợp DSKL (Ngôn ngữ hạt nhân tuần tự khai báo) của OZ , một ngôn ngữ rất phù hợp cho các công cụ hàn lâm như thế này. DSKL (hoặc DKL) có thể được nhìn thấy ở đây (kết quả tìm kiếm ngẫu nhiên), phần Tuyên bố và Giá trị. Định nghĩa chính xác không quan trọng, ngoài việc đây là một ngôn ngữ rất đơn giản, không có các biến có thể sửa đổi (chúng được khai báo và ràng buộc sau này) và không có OOP nào được tích hợp.
OOP thậm chí không thể được thêm vào như một sự trừu tượng hóa ngôn ngữ cho ngôn ngữ hạt nhân này. Bằng cách thêm tên duy nhất vào ngôn ngữ kernel (NewName) và sử dụng phạm vi cục bộ, đóng gói có thể đạt được. Hoặc bằng cách thêm một trạng thái có thể thay đổi vào ngôn ngữ kernel (NewCell) và sử dụng OOP phù hợp với phạm vi cục bộ với đóng gói có thể đạt được. Nhưng nó không thể đạt được chỉ với ngôn ngữ kernel được chỉ định.
Nếu sau đó chúng ta thêm ngoại lệ vào ngôn ngữ kernel, chúng ta sẽ có một ngôn ngữ không có hỗ trợ OOP nhưng có ngoại lệ. Hãy để tôi chỉ cho bạn cách:
Xác định một máy trừu tượng với một ngăn xếp và lưu trữ, chúng ta có thể định nghĩa mỗi câu lệnh trong ngôn ngữ của chúng ta nên làm gì ( ngữ nghĩa của câu lệnh). Chẳng hạn, skip
trong ngăn xếp không làm gì cả, A = 3
trong ngăn xếp sẽ liên kết (/ thống nhất) A với (/ với) 3.
Chúng tôi bắt đầu bằng cách thêm cú pháp về cách xác định ngoại lệ của chúng tôi. Chúng tôi làm điều này bằng cách thêm hai mệnh đề khác vào <statement>
trong DKL.
<statement> ::== ... (old stuff)
| try <statement> catch <id> then <statement> end
| raise <id> end
Dưới đây là thử / bắt đã biết và một cách để tăng / ném ngoại lệ.
Chúng tôi xác định ngữ nghĩa của chúng bằng cách chúng hoạt động trên máy trừu tượng:
Hãy thử
Tuyên bố ngữ nghĩa là: (try <statement1> catch <id> then <statement2> end)
Làm:
- Nhấn vào ngăn xếp các tuyên bố ngữ nghĩa
(catch <id> then <statement2> end)
- Nhấn vào ngăn xếp các tuyên bố ngữ nghĩa
(<statement1>)
Lưu ý rằng câu lệnh 1 sẽ ở trên cùng của ngăn xếp và đã thử thực hiện trước.
Nâng cao
Tuyên bố ngữ nghĩa là: (raise <id> end)
Do:
- Nếu không có gì nữa trên ngăn xếp, hãy dừng lại và báo cáo một ngoại lệ chưa được lưu.
- Khác, bật tuyên bố ngữ nghĩa đầu tiên từ ngăn xếp. Nếu đó không phải là một tuyên bố bắt, hãy đến bước 1.
- Chúng tôi đã bắt được, trên hình thức
(catch <id> then <statement> end)
Đẩy (<statement>)
lên ngăn xếp.
Bắt
Nếu chúng ta thấy một câu lệnh bắt trong khi thực thi bình thường, điều này có nghĩa là bất cứ điều gì bên trong được thực thi mà không đưa ra ngoại lệ lên đến mức này. Vì vậy, chúng tôi chỉ bật catch
các ngăn xếp và không làm gì cả.
QED, chúng tôi có một ngôn ngữ có ngoại lệ và không có khả năng OOP.
Tôi đã loại bỏ phần môi trường khỏi máy trừu tượng để làm cho nó đơn giản hơn.