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

Date: 2019-04-26 05:12 am (UTC)
x86128: (Default)
From: [personal profile] x86128
Не совсем корректно выразился.
Не заглядывая в код, по описанию подумал, что раз речь шла про магию с указателями, то Вы сделали на С++ так, что написанное в том паскалевском стиле, под капотом распутывается образуя иерархию классов без магии.
Сейчас в исходный pas-код посмотрел хороший такой ребус :)
Получается там top-down парсер, машинный код образуется в памяти, все таблицы хранятся в виде однонаправленных связанных списков, компилируется без всяких там AST-деревеьев, SSA-form и прочих модных штучек :D

Интересно, с учетом, что памяти 32К слова, какой максимальный размер одного модуля получался?

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 02:13 pm
Powered by Dreamwidth Studios