Приближение к исключению
Jul. 6th, 2022 10:56 am![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
В языках АЛГОЛ-60 и Паскаль, для эффективной обработки исключительных ситуаций, требующих выхода из нескольких уровней вызовов процедур сразу, были предусмотрены нелокальные безусловные переходы. Например, на Паскале можно было написать
program main(output); label 1; procedure a; begin writeln('In a'); goto 1 end; procedure b; begin writeln('In b'); a; writeln('After a') end; procedure c; begin writeln('In c'); b; writeln('After b') end; begin writeln('Calling c'); c; writeln('After c'); 1: writeln('Back to main') end.
и при выполнении этой программы напечатается
Calling c In c In b In a Back to main
На Алголе, в сущности, аналогично, с точностью до деталей синтаксиса (в частности, метку не нужно было объявлять заранее). Собственно, из Алгола Паскаль эту идею нелокальных переходов и почерпнул.
Но не таковы были реализаторы диалекта Паскаля UCSD Pascal. Они решили минимизировать поводы для использования оператора GOTO и запретили нелокальные переходы, а для обработки исключений добавили вот такую уникальную конструкцию:
The EXIT procedure causes an orderly exit from a procedure or function,
or from the program itself. The forms areEXIT(procedurename) EXIT(programname) EXIT(PROGRAM)In the first form shown, EXIT accepts as its single parameter the
identifier of a procedure or function to be exited. Note that this need
not be the procedure or function in which the EXIT statement occurs.
EXIT follows the trail of procedure or function calls back to the
procedure or function specified; each procedure or function in the trail
is exited. If the specified procedure is recursive, the most recent
invocation of that procedure will be exited.When a procedure or function is exited via EXIT, any files local to it
are automatically closed, just as if it had terminated normally.
The use of EXIT to exit a function can cause the function to return an
undefined value if no assignment to the function identifier is made
before EXIT is executed.When the program name or the reserved word PROGRAM is used as the
parameter for EXIT, EXIT brings the program to an orderly halt.
То есть вместо примера выше нужно было бы писать что-то вроде
program main(output); var exception: boolean; procedure c; forward; procedure a; begin writeln('In a'); exception := true; exit(c) end; procedure b; begin writeln('In b'); a; writeln('After a') end; procedure c; begin writeln('In c'); b; writeln('After b') end; begin exception := false; writeln('Calling c'); c; if not exception then writeln('After c'); writeln('Back to main') end.
Интересно следующее:
- идентификатор EXIT - не зарезервированное слово, а системная процедура
- в качестве аргумента этой процедуры можно указывать зарезервированное слово PROGRAM (!)
- при выходе таким образом из функции может быть возвращено неопределённое значение
- нужны дополнительные телодвижения для различения нормального и исключительного выхода из процедуры
- выполняются "деструкторы" объектов типа файл, как и полагается при распространении исключения
- если в стеке вызовов не нашлось процедуры, упомянутой в вызове EXIT, то регистрируется ошибка времени выполнения Procedure not present at exit time
Насколько можно судить, эта фича так и осталась уникальной для UCSD Pascal.
no subject
Date: 2022-07-06 08:04 pm (UTC)А интересно, паскаль, небось, тоже компилируется line by line, как фортран. В таком случае можно много что.
no subject
Date: 2022-07-06 08:44 pm (UTC)no subject
Date: 2022-07-06 09:52 pm (UTC)no subject
Date: 2022-07-06 10:03 pm (UTC)no subject
Date: 2022-07-07 12:12 am (UTC)no subject
Date: 2022-07-07 01:25 am (UTC)no subject
Date: 2022-07-07 04:25 am (UTC)no subject
Date: 2022-07-08 12:47 am (UTC)no subject
Date: 2022-07-08 02:55 pm (UTC)no subject
Date: 2022-07-08 07:00 pm (UTC)no subject
Date: 2022-07-08 07:33 pm (UTC)no subject
Date: 2022-07-09 03:14 am (UTC)no subject
Date: 2022-07-09 05:39 pm (UTC)