Комментарии 26
Забавно наблюдать, как опыт автора от использования предыдущих языков влияет на синтаксис и фичи придумываемого им языка.
P.S. Я пробовал создать свой язык, он у меня совсем другим получался. (По крайней мере, идея, до практики я не довёл). И синтаксис, и фичи, и базовые термины, в которых я мыслил — всё иное.
- Насколько я вас понял, сборщик мусора убивает только того, для кого явно вызвали rem(). Тогда зачем он вообще нужен, если после вызова rem() можно сразу очищать объект?
- Вы плохо меняете размер стека. Так как реаллокация памяти работает за линию от размера буфера, у вас сейчас асимптотика — квадрат. Пример плохого теста — 1е6 раз сделать push. Чтобы ускорить работу стека до O(1) в среднем, нужно не прибавлять что-нибудь к размеру, а увеличивать его в несколько (например в 2 раза). А если, например, потребляется меньше четверти буфера — то сократить в 2 раза. По-прежнему остается недомтаток, что некоторые обращения к стеку будут медленными, но суммарно все отработаеи быстро.
Есть другие подходы, но этот самый простой.
rem() вызывается для классов, чтобы освободить память из под структуры класса. Это генерируемый деструктор класса.
Стек не используется таким образом. Он используется для вычислений, вызовов и прочих операций но почти всегда он остается пустым по завершении операции.
- Но вызов rem() или Free() или подобного все равно пишется вручную, так?
- В байткоде ВМ есть push. К тому же рекурсия может отъесть тот самый миллион фреймов в стеке вызовов.
2. Мне кажется, что увеличение в 2 раза размера стека каждый раз может привести к Access Violation.
- Тогда в чем проблема, когда программа на каком-то объекте вызывает rem(), сразу вычистить все? Это позволит выпилить из ВМ целую подсистему.
- Не каждый, а когда он заполнен до отказа.
Оверхед по памяти от 0 до 3 раз. Но вообще, меняя границы реаллока, можно добиваться разных компромиссов между оверхедем по памяти и производительностью, но в любом случае O(N) памяти и времени.
В принципе, вы можете организовать стек как односвязный список блоков, т.е. каждый блок имеет указатель на предыдущий, и буфер на, скажем, 256 элементов. Тогда оверхед по памяти вообще крошечный, время работы — О(1) на любой запрос. Единственная потеря — сложная и медленная индексация, но вам это вроде как не нужно.
Object Pascal — прекрасный язык общего назначения. Транслятор мне на нем было писать одним удовольствием, спасибо удобной реализации строк в языке. На плюсах я бы возился гораздо дольше. Да и переписывать нет смысла проект. Хочу в качестве бекенда LLVM взять. Позже соответственно и статью накатаю, если разберусь с этим.
Третья статья (ч. 2) уже на подходе ;)
Надеюсь, что проделанная работа будет оценена обществом по достоинству.
Не очень удачное название, т.к. SVM довольно устоявшаяся аббревиатура для Support Vector Machine («Метод опорных векторов»).
Пишем свой язык программирования, часть 1: пишем языковую ВМ