Skip navigation.

проФорт

Форт и всё такое

Прекомпилированные константы

,

При написании прикладных программ на 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-файлы.

Summary 2007Оптимизатор SPF

Comments

Ilya73 14. January 2008, 20:41

Есть ещё достойным метод, который используют в win32for и Николай Немцев (AKA ~nn) и собственно я :wink:. А заключается в использовании врапера для wincon.dll. Очень рекомендую!!! :smile:

exs 26. January 2008, 10:41

Опишете подробней? Если я правильно помню то суть в том что все константы хранятся в этой dll, а во время компиляции туда идут запросы.
А как с расширяемостью? Т.е. чтобы добавить новых констант надо пересобирать wincon.dll?

Anonymous 7. June 2009, 18:52

Аноним writes:

Достойный, но не для джедаев :)

How to use Quote function:

  1. Select some text
  2. Click on the Quote link

Write a comment

Comment
(BBcode and HTML is turned off for anonymous user comments.)

If you can't read the words, press the small reload icon.


Smilies