spamsink: (Default)
[personal profile] spamsink posting in [community profile] besm6
Вложенные процедуры делаются относительно просто. Основной механизм таков:
function Func(args...): RetType;
var
    ...vars...
...nested procedures...
begin 
    ...body...
end;

превращается в
struct Func {
    static std::vector<Func*> super;
    RetType ret;    // Assignments to Func become assignments to ret
    operator RetType() const { return ret; }
    ...vars...
    Func(args...);
    ~Func() { super.pop_back(); }
};
...nested procedures... using Func::super.back()-> to access vars
Func::Func(args...) {
    super.push_back(this);
    ...body...
}

Если вложенная процедура не имеет собственных вложенных и вызывается только из сиблингов, то она может быть оформлена как метод класса.

Но это всё цветочки. Ягодки заключаются в том, что в БЭСМ-6 разрядность адреса была всего 15, поэтому можно было кастовать указатель к целому, добавлять в старшие разряды разнообразные флаги, и передавать это целое в процедуры, которые анализировали флаги, при необходимости кастовали целое обратно в указатель, и что-то там с ним делали. Так, например, устроена работа с переходами вперёд.

Придется делать собственный аллокатор, что на С++ несложно, а вот какие усилия потребовались бы для достижения функциональности при портировании на FreePascal, я даже боюсь себе представить.

Заодно реализация работы с динамической памятью путем setup/rollup станет тривиальной.
This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting

Profile

Сообщество любителей БЭСМ-6

January 2026

S M T W T F S
    123
45678910
11121314151617
18192021222324
2526272829 3031

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Mar. 4th, 2026 12:26 am
Powered by Dreamwidth Studios