проФорт

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

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

,

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

[COLOR=darkblue]S" [/COLOR][COLOR=blue]~day/wincons/compile.f[/COLOR][COLOR=darkblue]"[/COLOR] [COLOR=darkblue]INCLUDED[/COLOR]

BEGIN-CONST
[COLOR=limegreen]1[/COLOR] [COLOR=darkblue]CONSTANT[/COLOR] [COLOR=darkblue]x[/COLOR]
[COLOR=limegreen]2[/COLOR] [COLOR=darkblue]CONSTANT[/COLOR] [COLOR=darkblue]y[/COLOR]
#define z [COLOR=limegreen]3[/COLOR]
#define q [COLOR=limegreen]4[/COLOR]
[COLOR=chocolate]\ etc[/COLOR]

[COLOR=darkblue]S" [/COLOR][COLOR=blue]my.const[/COLOR][COLOR=darkblue]"[/COLOR] SAVE-CONST
[COLOR=darkblue]BYE[/COLOR]



Думаю код в комментариях не нуждается. #define это тот же CONSTANT.

Для облегчения переноса констант из сишных файлов есть утилитка ~day/wincons/h2f.f, которая позволяет довольно быстро в полуавтоматическом режиме конвертировать h-файлы.

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

Comments

Ilya73 Monday, January 14, 2008 8:41:56 PM

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

exs Saturday, January 26, 2008 10:41:36 AM

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

Anonymous Sunday, June 7, 2009 6:52:46 PM

Аноним 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