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 станет тривиальной.

Profile

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

January 2026

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

Most Popular Tags

Page Summary

Style Credit

Expand Cut Tags

No cut tags
Page generated Mar. 3rd, 2026 09:21 pm
Powered by Dreamwidth Studios