spamsink: (Default)
[personal profile] spamsink
В этом посте речь пойдёт о забавной конструкции для обработки исключений в одном из диалектов языка Паскаль.



В языках АЛГОЛ-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 are

        EXIT(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.

Date: 2022-07-07 12:12 am (UTC)
sab123: (Default)
From: [personal profile] sab123
Да, я помню, но это в отдельных убогих реализациях. И с другой стороны был Алгол-68 с его вообще сборкой мусора. Паскаль был реакцией на сложность Алгола-68. Поэтому логично было бы как альтернативу сборке мусора предусмотреть _опциональный_ и упрощенный способ со счетчиком ссылок. И если его сделать на уровне языка, то выйдет удобное автоматическое освобождение памяти при выходе из блока.

Date: 2022-07-07 04:25 am (UTC)
sab123: (Default)
From: [personal profile] sab123
Ну так обычные ссылки тоже оставить. А так счетчик ссылок решает большинство типовых проблем.

Date: 2022-07-08 02:55 pm (UTC)
sab123: (Default)
From: [personal profile] sab123
Да вроде именно такой - ставил целью оставить простых шлюх, а сложных повыбрасывать.

Date: 2022-07-08 07:33 pm (UTC)
sab123: (Default)
From: [personal profile] sab123
Ссылки со счетчиком - совершенно G-rated по сравнению с развратными простыми ссылками.

Date: 2022-07-09 05:39 pm (UTC)
sab123: (Default)
From: [personal profile] sab123
Он разрешается не так сложно, присвоением null в обратные ссылки при аккуратной разборке объектов. Что, собственно, и делается в Перле. Конечно, weak references лучше, но тогда они еще не были придуманы.

Profile

spamsink: (Default)
spamsink

May 2025

S M T W T F S
     123
4 567 8910
11121314151617
18 19 2021222324
25262728293031

Most Popular Tags

Page Summary

Style Credit

Expand Cut Tags

No cut tags
Page generated May. 24th, 2025 10:09 pm
Powered by Dreamwidth Studios
OSZAR »