morale [was: parascriptum: release v0.2]

Justin Forest <[email protected]> Wed, 31 Mar 2004 15:59:28 +0400
Newsgroups gmane.comp.misc.faerion.devel
Message-ID <[email protected]>
Я не думаю, что функции API быстрее ищут функции в PE бинарнике, чем ты 
бы их нашёл в уже чётко структурированном массиве.  Функции API 
используют точно такой же перебор и строковые операции, другого способа 
у них нет.  Тебе же никто не мешает слегка оптимизировать поиск 
задействовав какое-нибудь хэширование (например, как я задействовал 
CRC32 для поиска сообщений в paracore (оптимизация приветствуется)).

Бинарный поиск с требованием сортировки массива по алфавиту -- 
потенциальные грабли, система не должна зависеть от таких вещей.

Номера версий тебе как отслеживать -- очень просто: руками.  Сменил 
структуру таблицы функций так, что потерялась совместимость -- увеличил 
версию интерфейса на единицу.  Модуль же возвращает таблицу для нужной 
версии (если модуьл поддерживает их несколько, и если такая ситуация 
вообще возникнет (но быть к ней заранее готовым -- скорее хорошо)).

Идея с использованием машинного стэка в качестве стэка парсера понятна. 
  Работать будет, безусловно, но уровень вложенности придётся 
ограничить.  Плохо, что приходится отказывать пользователю в 
удовольствии рисовать фракталы конфигурационными файлами, но всё же. 
Парсер конфигов в парабеллуме (пра-лэйн) тоже был рекурсивным, и даже 
без ограничения на глубину.  Однако представляя на сколько придётся всё 
усложнить, я даже не знаю, стоит ли.  Пока из идей по превращению 
рекурсивного парсера в линейный есть одна: выделять в обычной памяти 
(динамический) массив структур, хранящих всю нужную информацию, и 
использовать его, собственно, как стэк.  Собственно, ничего такого, до 
чего ты сам не смог бы дойти.

На счёт регистра, отвечающего за выполнение блока.  В самом начале 
работы с файлом он установлен, и возможно с ним сделать только одно: 
сбросить.  При входе в новый блок он копируется (не инициализируется), и 
если он сброшен -- все команды выполняются вхолостую.  Есть два способа 
его снова установить: закрыть фрэйм, в котором регистр был сброшен, или 
else-подобным оператором.

Одно замечание на счёт блоков: не хочется допускать сишных вольностей, 
вроде "если в блоке лишь одна команда, то не обязательно его выделять 
скобками".  Это приводит либо к ошибкам при использовании ветвящихся 
else, либо к необходимости их отслеживать и кричать "рекомендуем явный 
блок", т.е. лишний код.

> текущие планы, после внедрения всех выше указанных замечаний -
> реализация переменных. и сразу за ними функций.

Джет, давай ещё раз определимся с задачей?  Ты, кажется, пишешь 
скриптинг для парабеллума.  Зачем он нужен -- загружать модули и 
запускать их?  Кажется именно для этого.  Однако в некоторых случаях он 
мог бы помочь строить системы с жизненным циклом, отличным от "старт, 
работа, стоп".  В частности, это подразумевает комплексную инициализацию 
подсистем (задействовав функции отправки и получения сообщений [1]).  По 
этому поводу несколько концептуальных замечаний.

Во-первых, не забывай, что каждое приложение может захотеть написать 
собственный загрузчик, я об этом писал в документации.  Доводя до 
функций типа "main" ты ограничиваешь область применения модуля 
системами, которым достаточно дефолтного консольного загрузчика, или 
обрекаешь себя на повтор уже имеющегося кода.  Что заманчивее?

Мораль: парсер должен быть модулем.  Модуль загружается стандартным 
стабом (коих будет несколько: консольный, графический итд) и начинает 
работу: читает конфигурационный файл (дефолтный; способ передачи имени 
конкретного файла ещё предстоит обдумать).

Во-вторых, чем больше побочных библиотек тянет за собой парсер, тем 
меньше шансов, что кому-то захочется его использовать.  Пусть даже эти 
библиотеки -- ни что иное, как непосредственно исполнители команд. 
Следовательно, сама идея внешних парсеров ставится под сомнение.

В-третьих: интерактивная консоль будет совершенно отдельным модулем.

[1] Получение сообщений -- с возможностью указания времени ожидания, и 
если сообщение не получено -- функция возвращает false, в противном 
случае -- true.



-------------------------------------------------------
This SF.Net email is sponsored by: IBM Linux Tutorials
Free Linux tutorial presented by Daniel Robbins, President and CEO of
GenToo technologies. Learn everything from fundamentals to system
administration.http://ads.osdn.com/?ad_id=1470&alloc_id=3638&op=click
Discussions in this list are held in two languages: English and Russian.
When replying, please use the language that the sender of the original
message is guaranteed to understand, or use English.