Этимология
By Azamadt Smaguloff. Tuesday, 27. March 2007, 15:25:44
По идее, при грамотных и ясных как слеза принципах именования, и при последовательности в следовании ему так получается что и комментарии к программе не особо нужны становятся и дополнять программу много легче становится. В реальности же на то чтобы назвать кратко, просто и остроумно -- не хватает терпения (программу хочется быстрее допроверить и пустить в дело), а на то чтобы соблюдать старые общепринятые соглашения, или новые, даже собственные -- принципиальности или памяти (часто забываешь).
Этим сводом правил (и исключений) ставится цель показать сложившиеся правила которыми желательно руководствоваться при выборе названий для своих слов или во время разбора чужих слов и лексиконов. Само собой, вы лично можете называть свои слова как хотите или как сейчас понятней для вас, но едва ли вы так поспособствуете взаимному использованию кода.
Форт никак не ограничивает выборе названий для своих слов. Можно переопределять любые слова, включая например IF THEN. Можно писать любыми буквами или символами (единственно, чтобы только пробелов в названии не было) -- имена слов на русском языке, имена вообще без единой буквы, имена начинающиеся с цифры, (1+ 2@ , \ ), или вообще полностью состоящие из них (например, во многих форт-системах есть слова с названиями 0 , 1 ).
Также в общем случае название слова в Форте не оказывает никакого влияния на его семантику (действие), и потому выбор названия полностью ложится на плечи программиста. От него (и только от него) будет зависеть насколько (не)понятно и (не)разборчиво будут называться сущности в формируемом лексиконе.
Многолетней практикой фортеры постепенно выработали более-менее общепринятую практику именования, когда тот или иной символ в названии что-то обозначает. Соответственно, другим фортером при разборе кода это существенно облегчает жизнь и позволяет одним только взглядом на слово _CLITERAL-CODE понять для чего оно, каким словом используется и когда (в конце мы разберём это название).
Начнём с обозначений взятых по аналогии с другими словами.
В Форте есть слова:
-
! ( value addr -- ) -- записывает значения
-
@ ( addr -- value ) -- значения выдаёт
По аналогии с ними названы слова:
-
C@ С! -- чтение и запись байтовых значений ("C" обозначает "char", т.е. байт)
-
W@ W! -- чтение и запись 16-битных значений ("слов" т.е. -- "W", "word")
"," (запятая) в имени обозначает что слово что-то записывает в кодофайл (как и само слово ","):
-
C, -- взять число со стека и скомпилировать его нижний байт в кодофайл
-
LIT, -- скомпилировать действие "класть число на стек" ("LIT", литерал, т.е. в данном случае -- число)
-
RLIT, -- скомпилировать действие "класть число на стек возвратов" (буква "R" обозначает стек возвратов, return-stack)
-
RET, -- скомпилировать действие "выход" (RET -- return)
и так далее...
Для именования также используются сокращения не имеющие своих аналогов в виде слов, но обладающие собственным смыслом (заметьте что, как правило, обозначения состоящие из одной буквы ставятся в начало имени):
-
C -- обозначает "char", он же байт (то что через n лет символ может стать не равен байту не знали когда это вырабатывалось). Примеры слов: CMOVE C@ C, C!
-
W -- "word", 16-битное слово. Использовано в: W@ W! W,
-
S -- "string", строка. При этом буквой "S" обозначается только один конкретный вид строк используемый в Форте, а именно строки в виде двух значений на стеке (адреса и длина строки). Тут надо также упомянуть, что есть ещё и историческое обозначение "counted-string" для "паскалевских строк", которое тоже обозначается буквой "C", но это: 1) достаточно редко 2) разносимо по контексту. Использовано в: SFIND SLITERAL SHEADER .
-
LIT (сокращение от LITERAL) обозначает "литерал" -- константу на этапе компиляции, литерал может быть числовой (подразумевается по умолчанию), или строковый (снабжаются нужным префиксом, определяющим тип строки, см. выше)
-
R -- "return-stack", стек возвратов. Слова: R> >R 2R> 2>R R@ и т.д.
-
2 вначале слова обозначает что он работает с двойными значениями (для SPF "двойные значения" значат -- 64-битные). Использовано в: 2! 2@ 2DUP 2SWAP 2CONSTANT 2VARIABLE 2R> и т.д.
-
D тоже используется для обозначения двойных значений: DLIT, DABS D. D0< (дополнение: мне дали ссылку на замечание Elizabeth D. Rather относительно различия между этими префиксами)
-
# -- это американизм, засевший в традициях Форта, который обозначает "number", "номер" или "количество", "длина". Из слов ядра SPF могу найти только #TIB (переменная хранящая длину в символов в т.н. "входном буфере"), но часто используется и в комментариях и для именования например полей структур которые обозначают длину чего-либо.
-
/data -- размер некоей структуры data. Используется повсеместно, примерно в таком виде:
0 CELL -- next-link CELL -- data# 256 -- data CONSTANT /data
"Перекрываемые" определения (scattered colons) в SPF принято называть с "AT-": AT-THREAD-STARTING AT-THREAD-FINISHING AT-PROCESS-STARTING и т.д.
Символу > надо пожалуй, дать целый раздел, так как он может обозначать множество понятий. В том числе может обозначать направление пересылки значения:
-
>R -- "на R", снять значение со стека возвратов и положить на вершину стека
R> -- "c R", записать значение со стека данных на стек возвратов
Слова реализующие дополнительные стеки, обычно называются похожим образом (например для дополнительного L-стека будут L> и >L ).
Также такой "стрелочкой" могут обозначать преобразование от одного вида/формата к другому, как в словах NAME> >BODY и >NUMBER .
При этом слова > и < не имеют к стрелочкам никакого отношения -- это обычные сравнения двух чисел на стеке. Равно как и их аналоги на F-стеке (аппаратном стеке математического сопроцессора): F> и >F .
В словах >MARK <MARK >RESOLVE <RESOLVE "стрелочки" имеют смысл указателя направления для ссылки которую мы сейчас ставим или разрешаем (ссылка вперёд или назад).
И наконец, есть ещё такие группы слов:
-
VARIABLE -- создать переменную
-
->VARIABLE -- создать переменную с одновременным заданием её значения (берётся со стека)
и
-
VECT -- создать вектор (изменяемую заглушку для процедур)
-
->VECT -- создать вектор с одновременным заданием его действия (адрес процедуры берётся со стека)
Последний пример открывает ещё одну область: связанные группы слов. Выше уже было показано как префикс "S-" связывает слова SFIND и FIND , SHEADER и HEADER . Примерно похожую связь обозначает окончание "-ED" из слов CREATED INCLUDED REQUIRED ALIGNED . Они являются результатом рефакторизации обычных слов CREATE INCLUDE ALIGN , и явно выносят параметры этих слов с входного потока (или из другого подразумеваемого источника, как в случае с ALIGN ) на более удобный для Форта стек данных.
Символ подчёркивания вначале (или в конце) обозначает что слово это "внутреннее" и к нему есть ещё его "босс". В SPF много таких пар, например, INTERPRET_ (слово которое на самом деле и делает всю работу) и INTERPET (вектор, который только перенаправляет вызовы).
В ядре SPF есть ещё больше похожих связок с векторами и их действиями "по-умолчанию": TYPE и TYPE1 , ACCEPT и ACCEPT1 , SEARCH-WORDLIST и SEARCH-WORDLIST1 , но уже обозначаемые через единицу в конце.
А вот ноль в конце используется для обозначения начала некоей области данных (по крайней мере для стеков это применимо):
-
S0 -- адрес "дна" стека данных
-
R0 -- адрес "дна" стека возвратов
Также иерархическую зависимость обозначают более распространённые среди всех форт-систем круглые скобки. "Боссы" могут компилировать своими скобочных "подчинённых" в создаваемые ими слова или структуры, как в DOES> и (DOES1) , (DOES2) или могут строить вокруг "подчинённого" слова какие-нибудь дополнительные слои обработки: (INCLUDED) и INCLUDED , (DP) и DP .
NB: Может быть, аналогия "слоёв" объясняет выбор в незапамятные времена скобок для обозначения какое слово ниже относительно другого?.. Визуально такое написание слова в скобках похоже на плод с кожурой (скажем, луковицу) и "ядро" внутри него.
В Форте встречается так же принцип акына: "что вижу -- то пою". То есть программист, не мудрствуя лукаво, сразу так и пишет в имени слова, что оно делает.
1 + --> 1+ CELL + --> CELL+ 0 < --> 0< 0 addr ! --> addr 0! 1 addr +! --> addr 1+! [ ' word ] --> ['] word [ CHAR a ] --> [CHAR] a
Само собой, что достаточно сложные и мощные слова так не назовёшь -- слишком длинно и неудобно:
: снять-чайник-с-огня-выключить-газ-попить-чай чайник с-огня снять выключить газ чай попить ;
Тут лучше подумать и подобрать название покороче:
: чифирнуть чайник с-огня снять выключить газ чай попить ;
Обрамлением в квадратные скобки обозначают временное переключение режима интерпретации/компиляции во время выполнения слова: ['] [CHAR] [COMPILE] [IF] [ELSE] [THEN] . И если ['] [CHAR] также подходят и как пример именования "что вижу то пою", то остальные уже скорее названы не строго алгоритмически а скорее по-человечески, интуитивно: " [IF] -- это тоже самое что и IF только в другом режиме".
И, под конец, возьмёмся за разбор названия слова _CLITERAL-CODE .
Подчёркивание означает подчинённый статус слова. Хозяином его является слово CLITERAL которое тоже разложимо на префикс "C-" и "LITERAL". По аналогии со имеющимся словом LITERAL уже можно даже только взглянув на название предположить что слово CLITERAL компилирует в шитый код какой-то литерал. Префикс "С-" в данном случае обозначая "паскалевскую" строку (counted-string), говорит о том какого типа литерал компилируется.
Теперь обратно к _CLITERAL-CODE: "-CODE" означает что это слово написано на ассемблере (через CODE ... END-CODE). Это слова низкоуровневые слова пишутся как правило, для задания действий компилирующихся в кодофайл (компилируют их туда "начальники": CREATE VARIABLE и т.д.). Такое "-CODE" слово мы уже видели в материале про кодофайл.
Итого: _CLITERAL-CODE -- низкоуровневое слово компилируемое в кодофайл словом CLITERAL .
Само собой, практически стихийно, лишь из практики, сложившаяся традиция именования поддаётся систематизации только с потерями. Не упрощают дела и тянущиеся с семьдесят-мохнатых годов этимологические реликты вроде имени слова DOES> (его этимология "работала" только в паре с другим словом давно почившим в бозе, и поэтому сейчас это имя никуда нельзя скатегоризировать и не получится внятно объяснить его название кроме иначе как "так сложилось"). Оставлены они по вполне благородной причине -- для совместимости, но понимания это никак не облегчает.
Ссылки по теме:
-
Соглашения по именованию слов в Форте, написанные для проекта JBForth.
-
Рекомендации по оформлению программ Лео Броуди. На англ., но так как это выдержка из книги его "Thinking Forth", то можно взять эти рекомендации на русском из перевода книги[url].
- Заметки Михаила Гасаненко (~mlg) по подбору имён слов: Set something и Type-prefixes.








How to use Quote function: