Прекомпилированные константы
By exs. Sunday, 13. January 2008, 20:29:45
При написании прикладных программ на spf с использованием разнообразных внешних API приходится использовать множество констант определённых этими API. Обычно создатели API предоставляют заголовочные *.h файлы C/C++ которые можно сразу подключать и использовать. Мы же такой возможности лишены и поэтому приходится ручками задавать связь между символьным именем и числовым значением констант.
Можно конечно никаких лишних связей не задавать, а не мудрствуя лукаво в нужных местах использовать явное числовое значение подсмотрев в документации на API. Этот способ очень плох, т.к. разбирать и поддерживать такой код значительно сложнее.
Гораздо правильнее будет эту константу обьявить форт-словом с соответствующим именем
3 CONSTANT CURL_GLOBAL_ALL
Для небольших проектов этого вполне достаточно. Но при более интенсивном использованием API количество используемых констант растёт, а это влечёт за собой увеличение размера собранного exe - т.к. каждая константа представляется словом форта. При этом если константы складываются в отдельный файл - каталог констант - они подключается все вместе, хотя скорее всего далеко не все они используются в даном конкретном приложении.
Общепринятый способ решения этих проблем в SPF - использовать "прекомпилированные константы".
Общий принцип : файл описывающий константы загружается во временное хранилище, потом загруженные константы можно использовать, при этом в код компилируются сразу числовые значения - не ссылки на какие-то слова. При сохранении бинарника сам файл с константами в образ не попадает. Т.е. в compile-time константы есть, в runtime - нет. Это часто именно то что нужно.
Есть две библиотеки которые реализуют этот функционал.
~yz/lib/const.f.
Подключение - S" lib/win/winconst/windows.const" LOAD-CONSTANTS ( подключаются константы Windows)
Использование - W: WM_PAINT ( слово W: выбирает слово и ищет его в списке констант)
Удаление - REMOVE-ALL-CONSTANTS ( явно удаляет загруженные константы)
lib/ext/const.f
Подключение - S" ~ygrek/lib/data/opengl.const" ADD-CONST-VOC ( константы OpenGL)
Использование - GL_TRIANGLES ( расширяется NOTFOUND и поэтому имя константы автоматически распознаётся)
Удаление - REMOVE-ALL-CONSTANTS
Обе либы работают с одним форматом const файлов поэтому можно использовать любую (отличаются они как видно способом задания константы - явно или неявно). REMOVE-ALL-CONSTANTS вызывать необязательно т.к. динамическое хранилище всё равно не попадёт в собираемый бинарник, а структуры библиотек обнулятся при старте этого бинарника. Для ускорения поиска константы хранятся в виде двоичного дерева, так что с этим проблем нет.
В дистрибутиве SPF есть следующие готовые const файлы :
- ~yz/cons/windows.const
- ~yz/cons/commctrl.const
- ~yz/cons/sql.const
- ~day/wfl/controls/scintilla/scintilla.const
- ~ygrek/lib/data/scintilla.const
- ~ygrek/lib/data/farplugin.const
- ~ygrek/lib/data/opengl.const
- ~ygrek/lib/data/curl.const
- ~vsp/cons/mmedia.const
- lib/win/winconst/windows.const
Как самостоятельно создать const файл если нет готового?
S" ~day/wincons/compile.f" INCLUDED
BEGIN-CONST
1 CONSTANT x
2 CONSTANT y
#define z 3
#define q 4
\ etc
S" my.const" SAVE-CONST
BYE
Думаю код в комментариях не нуждается. #define это тот же CONSTANT.
Для облегчения переноса констант из сишных файлов есть утилитка ~day/wincons/h2f.f, которая позволяет довольно быстро в полуавтоматическом режиме конвертировать h-файлы.







Ilya73 # 14. January 2008, 20:41
exs # 26. January 2008, 10:41
А как с расширяемостью? Т.е. чтобы добавить новых констант надо пересобирать wincon.dll?
Anonymous # 7. June 2009, 18:52
Достойный, но не для джедаев :)