Inni słusznie odpowiedzieli „Nie” z przykładami języków. Pomyślałem, że mogę rozszerzyć, dodając przykład dodawania wyjątków do języka bez angażowania OOP.
Zrobię to w przypadku DSKL (deklaratywnego języka sekwencyjnego jądra) OZ , języka dobrze przystosowanego do tego rodzaju zajęć akademickich. DSKL (lub DKL) można zobaczyć tutaj (losowy wynik wyszukiwania), część Oświadczenia i wartości. Dokładna definicja nie jest ważna, poza tym, że jest to bardzo prosty język bez zmiennych, które można modyfikować (są zadeklarowane i później powiązane), i nie ma wbudowanego OOP.
Nie można nawet dodać OOP jako abstrakcji językowej do tego języka jądra. Dodając unikalne nazwy do języka jądra (NewName) i używając lokalnego zakresu, można uzyskać enkapsulację. Lub dodając zmienny stan do języka jądra (NewCell) i używając lokalnego zakresu można uzyskać właściwe OOP z enkapsulacją. Ale nie można tego osiągnąć tylko z określonym językiem jądra.
Jeśli następnie dodamy wyjątki do języka jądra, będziemy mieli język bez obsługi OOP, ale z wyjątkami. Pokażę jak:
Definiując maszynę abstrakcyjną ze stosem i pamięcią, możemy zdefiniować, co powinna zrobić każda instrukcja w naszym języku ( semantyka instrukcji). Na przykład skip
w stosie nie należy nic robić, A = 3
w stosie należy powiązać (/ ujednolicić) A z (/ with) 3.
Zaczynamy od dodania składni sposobu definiowania naszych wyjątków. Robimy to, dodając kolejne dwie klauzule do <statement>
DKL.
<statement> ::== ... (old stuff)
| try <statement> catch <id> then <statement> end
| raise <id> end
Oto znany try / catch i sposób na zgłaszanie wyjątków.
Ich semantykę definiujemy według tego, jak powinny działać na maszynie abstrakcyjnej:
Spróbuj
Oświadczenie semantyczne brzmi: (try <statement1> catch <id> then <statement2> end)
Wykonaj:
- Wciśnij na stos instrukcję semantyczną
(catch <id> then <statement2> end)
- Wciśnij na stos instrukcję semantyczną
(<statement1>)
Zauważ, że instrukcja 1 będzie na górze stosu i najpierw zostanie wykonana.
Raise
Stwierdzenie semantyczne brzmi: (raise <id> end)
Do:
- Jeśli na stosie nie ma nic więcej, zatrzymaj się i zgłoś nieprzechwycony wyjątek.
- W przeciwnym razie wstaw pierwszą instrukcję semantyczną ze stosu. Jeśli nie jest to instrukcja catch, przejdź do kroku 1.
- Mamy haczyk, w formie
(catch <id> then <statement> end)
Push (<statement>)
na stosie.
Catch
Jeśli podczas normalnego wykonywania widzimy instrukcję catch, oznacza to, że wszystko, co było w środku, zostało wykonane bez podniesienia wyjątków do tego poziomu. W ten sposób po prostu otwieramy catch
stos i nic nie robimy.
QED, mamy język z wyjątkami i brak możliwości OOP.
Usunąłem część środowiska z abstrakcyjnej maszyny, aby była prostsza.