Інші справедливо відповіли "Ні" із прикладами мов. Я думав, що можу продовжити, додавши приклад того, як додавати винятки до мови, не залучаючи жодного разу OOP.
Я зроблю це у випадку, коли DSKL (Декларативна послідовна мова ядра) OZ , мова, яка добре підходить для подібних навчальних закладів. DSKL (або DKL) можна побачити тут (випадковий результат пошуку), частина Заяви та цінності. Точне визначення не є важливим, окрім того, що це дуже проста мова без змінних змінних (вони оголошуються та пізніше пов'язані), і немає вбудованого OOP.
OOP не можна навіть додати як мовну абстракцію до цієї мови ядра. Додаючи унікальні імена до мови ядра (NewName) та використовуючи локальний масштаб, можна досягти інкапсуляції. Або, додавши стан ядра до мови ядра (NewCell) та використовуючи місцевий масштабний OOP з інкапсуляцією, можна досягти. Але цього неможливо досягти лише за допомогою вказаної мови ядра.
Якщо тоді ми додамо винятки до мови ядра, у нас буде мова без підтримки OOP, але у нас є винятки. Дозвольте мені показати, як:
Визначаючи абстрактну машину зі стеком і сховищем, ми можемо визначити, що повинен робити кожен вислів нашою мовою ( семантика висловлювання). Наприклад, skip
у стеку нічого не повинно бути, A = 3
в стеку слід прив'язувати (/ уніфікувати) від A до (/ з) 3.
Почнемо з додавання синтаксису того, як слід визначити наші винятки. Ми робимо це, додаючи ще два пункти до <statement>
DKL.
<statement> ::== ... (old stuff)
| try <statement> catch <id> then <statement> end
| raise <id> end
Ось відомий спробу / ловіння та спосіб підняти / кинути винятки.
Ми визначаємо їх семантику , як вони повинні працювати на абстрактній машині:
Спробуйте
семантичний вислів: (try <statement1> catch <id> then <statement2> end)
Do:
- Висуньте на стек семантичний вислів
(catch <id> then <statement2> end)
- Висуньте на стек семантичний вислів
(<statement1>)
Зауважте, що оператор 1 опиниться на вершині стека і спробується виконати першим.
Підняти
Семантичний вислів: (raise <id> end)
Do:
- Якщо більше нічого не стоїть на стеці, зупиніться і повідомте про невловимий виняток.
- Інакше, вискакуй перший семантичний вислів із стека. Якщо це не заява про вилов, перейдіть до кроку 1.
- Ми дістали улов у формі "
(catch <id> then <statement> end)
Натисніть (<statement>)
на стек".
Catch
Якщо ми бачимо заявку на вилов під час звичайного виконання, це означає, що все, що було всередині, виконується без підвищення винятків до цього рівня. Таким чином, ми просто вискакуємо catch
стек і нічого не робимо.
QED, у нас мова з винятками та відсутність можливості OOP.
Я видалив частину середовища з абстрактної машини, щоб зробити її простішою.