24 дня (почти месяц) DEmbro был в ауте в связи с глобальным переписыванием ядра для поддержки отдельного стека для строк. Переписывание закончено, и теперь, фактически, получился немного другой язык.
Необходимость отдельного стека исходила из двух желаний
1) Сделать поддержку человечных строк (т.е. чтобы не нужно было заморачиваться с ручным отслеживанием за выделенной памятью, как в случае со строками с завершающим нулём), и можно было бы делать со строками всё что угодно: складывать, искать подстроки, вырезать участки и т.д.
2) Сохранить приличную скорость, характерную статически типизируемым языкам.
До недавнего времени я хранил строки в одном стеке с числами и указателями. Чтобы при копировании строк не копировать все символы (что является ИМХО не лучшей идеей, т.к. строка может занимать память неограниченно большого размера), в строке хранится счётчик ссылок на неё. Как только счётчик обнуляется, строка освобождается.
И тут начинается много проблем. Одна из самых существенных — при перехвате исключения, когда стек возвращается к некоторому исходному состоянию, нет возможности отследить где на стеке строки, а где числа (типы элементов стека нигде не хранятся, иначе это замедлило бы работу). Строки утекут, написать корректные исключения не представляется возможным.
С отдельным стеком эта проблема решается легко: нужно при срабатывании исключения откатить строковый стек, скинув у каждой лишней строки ссылку. Кроме того, в качестве бонуса, с новым стеком код стал заметно проще: существенно сократилось число манипуляций с основным стеком.
Кстати говоря, в этом же стеке будут находиться не только строки, но и любые другие элементарные типы переменной длины: длинные числа, например.
Из других нововведений появились:
1) Поддержка пространств имён (namespaces)
http://code.google.com/p/dforth/source/browse/trunk/release/units/core/voc.de#9
2) Возможность написания документации к командам непосредственно в исходном коде при помощи ключевых слов summary и detail:
http://code.google.com/p/dforth/source/browse/trunk/release/units/utils/parser.de
В REPL режиме на основе этого можно запрашивать инфу о командах при помощи вызова «help command», а в дальнейшем из этих же данных будет генерироваться документация в вики. Планируется сделать поддержку возможности написания документации на нескольких языках (что необходимо как минимум для функций из rtl).
http://code.google.com/p/dforth/source/browse/trunk/release/units/core/help.de#38
3) Поддержка строк произвольной кодировки, для этого строка может быть в одном из трёх состояний: ansi/wide/unicode.
2 комментария:
Как будет выглядеть работа со строками?
Блогспот не захотел принимать html в комментариях, поэтому отвечаю постом:
http://keyfighter.blogspot.com/2011/03/dembro.html
Отправить комментарий