Паскалевские хитрости
Apr. 18th, 2019 02:47 pmВложенные процедуры делаются относительно просто. Основной механизм таков:
превращается в
Если вложенная процедура не имеет собственных вложенных и вызывается только из сиблингов, то она может быть оформлена как метод класса.
Но это всё цветочки. Ягодки заключаются в том, что в БЭСМ-6 разрядность адреса была всего 15, поэтому можно было кастовать указатель к целому, добавлять в старшие разряды разнообразные флаги, и передавать это целое в процедуры, которые анализировали флаги, при необходимости кастовали целое обратно в указатель, и что-то там с ним делали. Так, например, устроена работа с переходами вперёд.
Придется делать собственный аллокатор, что на С++ несложно, а вот какие усилия потребовались бы для достижения функциональности при портировании на FreePascal, я даже боюсь себе представить.
Заодно реализация работы с динамической памятью путем setup/rollup станет тривиальной.
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 станет тривиальной.