августа 10, 2011

Добавление команд в ядро DEmbro

Упростил процедуру добавления команд в ядро DEmbro.



Допустим, что я хочу добавить группу команд «file», в которую входят fopen, fclose, fwrite и fread.

Как это было раньше
Заходим в директорию source\DEmbro\commands, создаём там файл DCommandsFile.pas4, в нём пишем паскалевский модуль, в котором реализуем все команды.

Создаём в модуле публичную функцию LoadCommands, в которой добавляем каждую команду в ядро (при помощи функции AddCommand).

Далее, заходим в главный файл проекта source\DEmbro\dembro32.dpr, в разделе uses добавляем подключение нового модуля.

Теперь, заходим в source\DEmbro\DForthMachine.pas4, в приватной секции uses тоже прописываем новый модуль. В методе OForthMachine.Create того же файла добавляем строку DCommandsFile.LoadCommands(@Self);.

В этот момент команда появилась в ядре дембро, проект можно компилировать. Чтобы при стандартном запуске дембро эти команды были видны, нужно проделать ещё пару шагов.

Заходим в core\release\default, создаём файл file.de, в нём при помощи команды samebuiltin прописываем подключаемые команды.

В файле core\release\default\system.de прописываем
str" core\default\file.de" evaluate-file

Теперь всё сделано. За исключением того, что ещё желательно писать хелп для каждой команды. Ужас, не правда ли?

Как это будет теперь
Заходим в source\DEmbro\commands, создаём файл file.cmd, в нём реализуем команды в таком виде:

DECLARE(fopen)
    body( code for open );
RUS SUMMARY ( i B: s -- f) открывает файл по имени с заданными флагами

DECLARE(fclose)
     body( code for close);
RUS SUMMARY ( f --) закрывает файл, открытый ранее при помощи команды fopen

DECLARE(fread)
     body( code for read);
RUS SUMMARY ( pif --) читает i байт в область памяти p из файла f

DECLARE(fwrite)
     body( code for write);
RUS SUMMARY ( pif --) записывает i байт из области памяти p из файла f

Далее, в файле source\DEmbro\commands\groups.list добавляем строку GROUP(file).

Теперь в директории source\DEmbro можно выполнить make commands и команды будут автоматически разнесены по всем нужным файлам, остаётся только скомпилировать ядро.

Как это работает
Файлы *.cmd и groups.list обрабатываются при помощи m4 в несколько проходов, каждый раз предварительно подгружаются разные библиотеки. Библиотеки распологаются в source\m4 и начинаются с буквы «c» (от слова commands).

Например, чтобы сгенерировать список подключения команд в ядре, используется cload.m4 в следующей команде
    m4 ..\m4\cload.m4 temp\all.cmd > temp\load.inc4

Сгенерированный файл load.inc4 выглядит примерно так:
    AddCommand("malloc", _malloc, False);
    AddCommand("free", _free, False);
    AddCommand("realloc", _realloc, False);
    AddCommand("move", _move, False);
    AddCommand("fill", _fill, False);
    AddCommand("current-directory", _current_directory, False);

А если проделать то же самое, но подключать cbuiltin.m4, то получим файл вида mem.de.

Аналогичным образом строятся другие файлы, а в будущем будут строиться хелпы. Напоследок приведу текущий код скрипта, раскидывающий команды (таргет commands в главном makefile):
    type commands\mem.cmd commands\misc.cmd > temp\all.cmd
    m4 ..\m4\cgroups.m4 commands\groups.list > temp\all.cmd
    m4 ..\m4\cload.m4 temp\all.cmd > temp\load.inc4
    m4 commands.m4 temp\load.inc4 > temp\load.incq
    dquotes temp\load.incq load.inc
    m4 ..\m4\cbody.m4 temp\all.cmd > temp\body.inc4
    m4 commands.m4 temp\body.inc4 > temp\body.incq
    dquotes temp\body.incq body.inc
    m4 ..\m4\cevaluate.m4 commands\groups.list > ..\..\release\core\builtin\all.de
    m4 ..\m4\cbuiltin.m4 commands\mem.cmd > ..\..\release\core\builtin\mem.de
    m4 ..\m4\cbuiltin.m4 commands\misc.cmd > ..\..\release\core\builtin\misc.de


Комментариев нет:

Отправить комментарий

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

Обо мне

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