Добро пожаловать!

Я Дож, программирование — моё хобби. По мере того, как я осваиваю что-то новое, стараюсь об этом написать пост.
На текущий момент в блоге затронуты следующие темы: vim, free pascal, lisp, forth, m4
Занимаюсь разработкой своего языка под названием DEmbro, подбробней: wiki и svn
Для постов, не связанных с программированием, у меня есть отдельное жж.

февраля 28, 2011

DEmbro: стек блоков (для строк)

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.


Читать дальше......

февраля 15, 2011

Кодировки в названиях файлов

Допустим, что в папке большое число файлов в неправильной кодировке, и вам нужно
найти какой-то файл. (Например, с такой проблемой вы столкнулись в папке
с фильмами в локальной сети.)

В уме догадываться как что называется — не вариант. Можно воспользоваться
командой dir: набираем
dir путь_до_папки > имя_какого-то_файла

Например:
dir \\172.16.0.22\Video\Films\ > d:\films.txt

После выполнения этой команды в файле films.txt окажется список всех файлов, а
его уже можно переконвертировать в своём любимом редакторе в нужную кодировку.


Читать дальше......

Постоянные читатели

Обо мне

Моя фотография
Мой e-mail: vitek_03(at)mail(dot)ru