На WingLion.Ru

RuF09WE (РуФ09РК)

Russian Forth standard 2009. WingLion Edition. (RuF09WE)
Русский Форт стандарт 2009. Редакция Крыльва.(РуФ09РК)
version 1.10 (09.12.2010)

Вольному − Воля!

© настоящий документ с момента своего появления объявляется общественным достоянием, и может без всяких ограничений распространяться, копироваться, переводиться на другие языки, изменяться с соответствующим уведомлением об этом в начале документа.

изменения − внесено  − краткое описание изменения
15.01.2009 − WingLion − первая редакция для публикации в internet
16.01.2009 − WingLion − продолжено наполнение документа содержательной частью
17.01.2009 − WingLion − продолжено наполнение документа содержательной частью
04.02.2009 − WingLion − начато оформление оглавления, добавлен п 2.3.
17.03.2009 − WingLion − продолжено наполнение таблицы слов
29.03.2009 − WingLion − добавлена таблица команд ФП и ФВМ
12.03.2010 − WingLion − изменения
13.03.2010 − WingLion − произведена крупная реорганизация и правка
14.03.2010 − WingLion − добавлен раздел 1.7 Классический форт
09.12.2010 − WingLion − мелкие правки
09.12.2010 − WingLion − начато заполнение описания МЯФ

Оглавление

0. Введение
0.1. Концепция-Манифест
0.2. Небольшое отступление
0.3. Способ изложения
0.4. Список терминов и сокращений
0.5. Соглашения.
1. Краткое введение в Форт
1.1. Что такое Форт
1.2. Интерпретация и компиляция
1.3. Типы данных
1.4. Стеки и стековая нотация
1.5. Форт процессор и виртуальная форт машина
1.6. Сведения из языка Форт, необходимые для понимания.
1.6.1 Простота. Расширяемость. Открытость.
1.7 Классический Форт.
1.7.1 Сравнительная таблица слов из стандартов 83-го и 94-го годов и их "классичность".
2. Минимальное Ядро Форта
2.1. О реализации
2.2. Что должно уметь ядро?
2.3. Сокращенный набор слов ФП и ВФМ
2.4. Способы расширения ядра
2.5. Дополнительный набор слов
4. Расширения ядра
5. Рекомендации
Приложения

0. Введение

0.1. Концепция-Манифест

Свобода неистребима. Стремление писать по-своему было, есть и никуда не денется. А по сему, данный стандарт на Форт описывает не столько сам язык, сколько свободу программиста, и рамки, в которых ему рекомендовано действовать, чтобы труд не пропадал впустую и мог быть использован коллегами и будущим поколением.
По отношению к старым стандартам Форта, данный документ объявляет, что они никуда не пропадают и становятся частями мультистандарта, о чем будет более подробно сказано далее. Программист обладает никем не ограниченным правом использовать любой из имеющихся старых стандартов.
Единственный требуемый шаг - соответствующее оформление программ, о чем будет сказано в 5-м разделе.
Разумеется, в соответствии с главной концепцией свободы, программист может оформлять свои программы ровно так, как ему хочется, писать хоть на папирусе, однако, в этом случае он рискует остаться в одиночестве и забытьи со своими работами, чего мы никому не желаем.
Сложившееся на момент написания данного документа положение нас удручает, поэтому мы и взялись за его написание, дабы не навести порядок, но указать возможную дорогу к порядку и призвать программистов следовать рекомендуемому пути.
Форт, как и любой другой язык программирования, является инструментом программиста, и содержание его в порядке является необходимостью.
Мы, форт-програмисты, нижеподписавшиеся, объявляем, что данный документ может свободно распространяться, копироваться и изменяться с уведомлением об изменениях. Подпись не обязывает программиста ни к чему, а всего лишь обозначает его согласие с представленной здесь концепцией. Присоединиться (и подписаться) к данной концепции может каждый желающий. Присоединяясь и подписываясь вы всего лишь высказываете свое положительное мнение, но не берете на себя каких-либо обязательств. Следование рекомендациям данного стандарта является делом сугубо личным и добровольным.

Подписи:
WingLion

0.2. Небольшое отступление

Современное состояние вычислительной техники не ставит реальной задачи экономии памяти и ресурсов. Времена, когда 64 / 640 / 4096 килобайт памяти было верхом мечтаний компьютерщика, а на частоту процессора чуть ли не молились, выставляя ее на жирных индикаторах на самом видном месте, давно прошли, поэтому, при выборе минимального набора слов для ядра Форта не ставится задача получить действительный минимум. Часть слов можно выразить через другие, и это свойство будет использовано для описания слов, поведение которых не очевидно или может трактоваться по-разному.
В то же время, возможности современных программируемых систем таковы, что на них возможна реализация самых разнообразных внутренних схем кодирования, в связи с чем фиксировать тип кода для Форта становится совершенно незачем. Программист волен сам выбирать, какой из типов кода подходит для его задачи. Стандарт предусматривает лишь терминологическую фиксацию известных типов кода и дает программисту понятие об их устройстве.
Так же стандарт вводит терминологическую фиксацию для понятий форт-процессор и виртуальная форт машина. Тем не менее, стандарт не претендует на глобальность и объявляет, что Фортом может называться не только то ПО, что написано для форт-процессора или виртуальной форт-машины. Может быть и совершенно иная организация Форта. Важно лишь поведение ПО, которое должно вести себя как Форт.
О разрядности. Разрядность современных компьютеров неуклонно возрастает, поэтому стандарт не указывает, какая разрядность "должна быть", а утверждает, что разрядность Форта может быть любой разумной величиной от 8бит (до 64..128 на настоящий момент), а в будущем может возрастать без изменения функций минимального форт ядра, но с включением расширений, связанных с повышенной разрядностью. Само же минимальное форт ядро будет таковым при любой разрядности, если несет функциональность той части форт ядра, которой достаточно для работы форт-программы.
Так, вряд ли можно ожидать возможность построения полного форта на 8-битном форт-процессоре с 8-битным адресом, однако он из-за этого не перестанет быть форт-процесором, ибо будет исполнять примитивы форта, и программы для него будут писаться на Форте.

0.3. Способ изложения

Некоторая сумбурность изложения является следствием того, что работа над документом не закончена. Работа будет продолжаться до достижения логической целостности и последовательности изложения, так, чтобы материалы не были набором вырванных из контекста мыслей.

0.4. Список терминов и сокращений

Бит (Bit) - минимальный элемент информации, принимающий два возможных значения.
Байт (Byte) - стандартный элемент информации, содержащий 8 бит.
Ячейка памяти (Cell) - Место в памяти, адресуемое одним адресом. Ячейка имеет размер, указываемый в битах или байтах, обычно определяемым используемым в программируемой системе процессором, и формально может быть какого угодно размера, но в настоящее время используются размеры 16 бит (устаревшие системы), 32 бит (современные системы), 64 бит (новейшие системы). Следует заметить, что вполне могут существовать Форт-системы с очень маленькими размерами ячеек (4 бита, например).
Слово (Word) - этот термин используется очень много и в разных контекстах. В Форте существует понятие Слово, как элемент языка. Другой смысл в понятие слово вкладывался на заре компьютерной техники и нередко используется сейчас - это понятие "машинное слово". В контексте данного документа на роль машинного слова более подходит понятие ячейка. Здесь же термин "слово" будет означать "элемент языка Форт".
Форт-системa - программа, реализующая возможности языка Форт, по сути - синоним понятия Форт-транслятор
Стековый процессор - процессор, имеющий в своем составе несколько (от 2-х) аппаратных стеков и позволяющий производить некие (не обязательно одинаковые для всех стеков) операции с элементами стека.
Форт-процессор (ФП) - стековый процессор, позволяющий реализовать с его помощью возможности языка Форт.
Виртуальная Форт Машина (ВФМ) - Программный эмулятор (возможно гипотетического) Форт-процессора.

0.5. Соглашения.

0.5.1. Документ изначально пишется на русском языке, и может быть переведен на любой другой язык, в том числе, с подходящим переводом терминов. Использование английского (а не русского) алфавита для написания программ, применяемое в данном документе является лишь признанием исторически сложившегося стандарта de facto и ничуть не мешает программисту использовать свой родной алфавит для написания своих программ. Английский алфавит (и язык) рекомендуется использовать только для достижения взаимопонимания в международной среде.
0.5.2. Форт бесконечно-расширяем, поэтому и стандарт для него должен быть расширяем, а не застывшим. Это значит, что стандарт должен предусматривать возможность добавления к самому себе дополнительных секций с описанием появляющихся в процессе развития вычислительной техники и программирования возможностей. Принципы добавления секций в стандарт - подобны принципам добавления новых слов в Форт. Секции добавляются в конец документа в соответствии с добавляемыми возможностями. Вклинивание добавлений в центр документа следует считать недопустимым, пока для этого не появится объективная необходимость.
Поэтому и сам форт должен состоять из нескольких функционально различных частей. Первая и центральная часть - ядро Форта, включающее в себя минимальное ядро форта и расширение ядра, которое представляет собой дополнение минимального ядра до полноценного Форта.
Полноценым фортом следует признавать Форт, поддерживающий один из существующих стандартов Форта. В том числе, и представленный в данном документе.

1. Краткое введение в Форт

Этот раздел предназначен для того, чтобы разъяснить читателю некоторые элементарные вещи, которые для программиста на языке Форт являются прописными истинами и не требуют особого упоминания. Тем не менее, во избежание разногласий, здесь будут изложены эти истины, так как они могут показаться новичку в Форте неочевидными или непонятными.
Опытный форт-программист может этот раздел спокойно пропустить или прочитать для синхронизации своего понимания и видения с пониманием авторов документа, дабы в дальнейшем исключить излишние вопросы.

1.1. Что такое Форт

Форт - это язык программирования. Можно много писать о его истории, сравнивать его характеристики с другими языками, но здесь это не нужно. Целью же этой части документа является введение в язык - объяснение самых элементарных вещей, которые, быть может, в иных местах прописаны не прямо или не очень понятно. Часто Фортом называют саму Форт-систему, приписывая ее действия Форту.

1.2. Интерпретация и компиляция

Не так давно вопрос о скорости исполнения программы был одним из главных при выборе языка программирования, и немаловажную роль играл ответ на вопрос "интерпретатор это или компилятор?" - Форт в этом смысле всегда был белой вороной, потому что он не является ни интерпретатором, ни компилятором в прямых смыслах этих слов. Или, можно и так сказать, Форт является и тем и другим одновременно.
Программа на Форте пишется непосредственно в текстовом файле и исполняется через пословное (построчное) считывание этого файла и исполнение - это и есть режим интерпретации. Однако, в то же время, эта же программа может быть откомпилирована, сохранена, а затем исполнена в машинных кодах - это есть режим компиляции.
В процессе работы Форт может многократно переключаться между режимами интерпретации и компиляции. Это позволяет организовать работу программы наиболее гибко и удобно (и для программиста, и для пользователя).
Гибкости использования способствует так же и интерактивный режим работы Форта, в котором программист может непосредственно писать и отлаживать части программы в режиме интерпретации. И в то же время, при таком написании, отлаженные части программы могут быть немедленно откомпилированы и сохранены для их последующего исполнения и использования в других частях программы.

1.3. Типы данных

Типы данных по сути являются закреплением интерпретации элементов информации и фиксацией правил ее использования. С этой точки зрения Форт считается бестиповым языком, т.е. для языка все элементы информации, это не более чем биты, байты и ячейки. Тем не менее, совсем без какой-либо интерпретации язык обойтись не может, поэтому в Форте существуют следующие интерпретации данных:
    • Байт - число в пределах от 0 до +255 (иногда от −128 до +127)
    • Символ - обычно код ASCII, но может быть и иная кодировка символов - размер соответствует кодировке
    • беззнаковое целое - число от 0 до +2N−1, где N - разрядность ячейки - размер одна ячейка
    • знаковое целое - числов от −2N−1 до +2N−1−1, где N - разрядность ячейки - размер одна ячейка
    • Адрес - число от 0 до +2−1, где NA - разрядность адреса - размер обычно одна ячейка, но может отличаться
    • Данное - размер одна ячейка - безотносительно к интерпретации
    • Строка - массив, состоящий из множества символов - размер определяется реализацией, которая для строк может различаться в пределах одной Форт-системы

1.4. Стеки и стековая нотация

Одной из основ работы программ являетая организация взааимодействия между частями программы - организация передачи параметров и данных.
В Форте эта передача преимущественно организовывается с помощью стека (стеков). Стек по своей сути является массивом данных с непроизвольным доступом.
В Форте используется Стек LIFO (Last In First Out) - данные пишутся в стек последовательно и последовательно считываются. При этом данные, записанные в последнюю очередь считываются первыми. Подобно тому, как вставляются и вынимаются патроны в магазине автомата. Именно такой стек используется в Форте для передачи данных между программами. Этот стек в Форте обычно называют Стеком Данных или просто Стеком. Такой же стек используется для организации работы подпрограмм и возврата из них. Этот стек называется Стеком Возвратов.
Для пояснения того, как слова Форта работают со стеками применяется стековая нотация, представляющая собой запись, содержащую в себе информацию о состоянии стека перед выполнением слова и после. Выглядит стековая нотация так:
     ( data1,data2,... -> result1,rezult2,... )
Здесь запись слева от стрелки соответствует состоянию стека до исполнения слов, справа - после. Вершина стека условно находится слева, таким образом данная нотация означает, что на стеке лежали данные data2 и data1 - последнее на вершине стека, а после исполнения на стеке остались результаты работы слова - rezult2 и rezult1 - последнее на вершине стека.
Это условная запись, представляющая собой комментарий, применяемый для облегчения описания работы слов непосредственно в исходных файлах, и ее вид никак не ограничивается. Есть лишь рекомендация - применять именно такую стековую нотацию, для того, чтобы этот комментарий был понятен всем форт-программистам.

1.5. Форт процессор и виртуальная форт машина

Для реализации языка Форт обычно используется программная виртуальная машина (эмулятор гипотетического процессора со своей системой команд), называемая виртуальной форт-машиной. Такая машина может быть достаточно просто перенесена в железо, в результате чего получится форт-процессор. В дальнейшем все сказанное про форт-процессор так же относится и к виртуальной форт-машине и наоборот, если обратное не указано прямо.

1.6. Сведения из языка Форт, необходимые для понимания.

1.6.1 Простота. Расширяемость. Открытость.

Простота Форта заключается в его наипростейшем синтаксисе, определяемом фактически только двумя правилами:
    • 1. Все программы на Форте записываются СЛОВАМИ
    • 2. Слова отделяются друг от друга пробелами.

T.e. программа на Форте записывается просто последовательностью:

СЛОВО1 СЛОВО2 СЛОВО3 СЛОВО4 СЛОВО5  и т.д.


На практике разделяющими оказываются и некоторые другие символы, такие как перевод строки и табуляция. Все остальные символы, в том числе знаки препинания и спец-символы в Форте не являются разделителями и являются частями (имен) слов.
Расширяемость Форта означает, что в Форте можно определять новые слова через уже имеющиеся. Для этого в наборе слов Форта имеются так называемые определяющие слова, которые и позволяют записывать определения для новых слов. Наиболее широко используемым определяющим словом является слово : (двоеточие). Пример определения через двоеточие:

: НОВОЕ-СЛОВО СЛОВО1 СЛОВО2 СЛОВО3 СЛОВО4 ;


Здесь НОВОЕ-СЛОВО (для форт-программиста должно быть очевидно) является определяемым новым словом, а последовательность СЛОВО1 СЛОВО2 СЛОВО3 СЛОВО4 - это последовательность, которая будет исполнена при вызове на исполнение слова НОВОЕ-СЛОВО
Слово ; (точка с запятой) является словом, заканчивающим определение. В полном соответствии с правилом 1, точка с запятой отделена от последнего слова в записи определения пробелом.
Здесь же надо подчеркнуть, что произвольная программа представляет из себя далеко не линейный список исполняемых действий. В Форте для изменения порядка исполнения имеются специальные слова для создания условных переходов, циклов и других структур кода, позволяющих менять порядок исполнения согласно требуемому алгоритму. Об этих словах будет рассказано ниже, и надо особо отметить, что с точки зрения синтаксиса они ничем не отличаются от всех остальных слов, т.е. они пишутся так же, как все слова Форта - окруженными пробелами.
Открытость Форта означает, что Форт полностью открыт для программиста как программа, т.е. он может быть изменен в любой момент в процессе исполнения/интерпретации входнoго текста. Это позволяет модифицировать Форт так, как удобно программисту. И в то же время, заставляет программиста следить за своим кодом, чтобы из-за ошибок не нарушилась работа самой Форт-системы.

1.7 Классический Форт.

Понятия классический форт в настоящее время не существует. Тем, не менее, это сочетание слов частенько используется, когда надо подчеркнуть что предлагаемый код на Форте одинаково понимается во всех Форт-системах. Поэтому здесь будет опрделено это понятие для того, чтобы в дальнейшем его можно было использовать, не опасаясь двусмысленного понимания.
Определение: Классический форт - это небольшая часть языка Форт, одинаково определяемая в современных стандартах на язык Форт, предназначенная для написания простых программ и для описания поведения других слов Форта с помощью самого Форта.

1.7.1 Сравнительная таблица слов из стандартов 83-го и 94-го годов и их "классичность".

Имя слова Forth-83ANSI94Classic Forth
манипуляции со стеком данных
DUPестьестьвключено
DROPестьестьвключено
SWAPестьестьвключено
OVERестьестьвключено
ROTестьестьвключено
-ROTестьестьвключено
работа с памятью
@естьестьвключено
!естьестьвключено
C@естьестьвключено
C!естьестьвключено
D@естьестьвключено
D!естьестьвключено
MOVEестьестьвключено
<MOVEестьестьвключено
HEREестьестьвключено
ALLOTестьестьвключено
,естьестьвключено
арифметика и логика
+естьестьвключено
естьестьвключено
*естьестьвключено
/естьестьвключено
D+естьестьвключено
D−естьестьвключено
D*естьестьвключено
D/естьестьвключено
ANDестьестьвключено
ORестьестьвключено
XORестьестьвключено
NEGАТЕестьестьвключено
NOTестьестьвключено
=естьестьвключено
<естьестьвключено
>естьестьвключено
=0естьестьвключено
определяющие слова
:естьестьвключено
;естьестьвключено
IMMEDIATEестьестьвключено
CREATEестьестьвключено
DOES>естьестьвключено
VARIABLEестьестьвключено
CONSTANTестьестьвключено
слова управляющие порядком исполнения
IFестьестьвключено
THENестьестьвключено
ELSEестьестьвключено
DOестьестьвключено
LOOPестьестьвключено
BEGINестьестьвключено
WHILEестьестьвключено
REPEATестьестьвключено
???естьестьне включено
работа с внешними накопителями
блокиестьнетне включено
файлынетестьне включено
телепатиянетнетне включено
консольный ввод/вывод
KEYестьестьвключено
TYPEестьестьвключено
."естьестьвключено
.естьестьвключено
EMITестьестьвключено
CRестьестьвключено
EXPECTестьестьвключено
строки и работа с ними
"естьестьвключено
FINDесть?включено
WORDесть?включено
'есть?включено
компиляция/исполнение
INTERPRETестьестьвключено
[естьестьвключено
]естьестьвключено
EXECUTEестьестьвключено
COMPILEестьестьвключено
[COMPILE]естьестьвключено
много-много других слов
=^ф^=естьестьне включено

2. Минимальное Ядро Форта

Вопрос о самозарождении МЯФ-а оставим философам будущего, а здесь просто опишем его и способ работы с ним.

2.1. О реализации

Реализация МЯФ может быть любой.
Главное, чтобы она исполняла свое предназначение - а именно быть первым инструментом, с помощью которого строится все остальные инструменты и программа Форта.
МЯФ является консольным приложением (или его имитацией в графическом интерфейсе), которое по своей сути должно быть целевым компилятором, целевая система которого совпадает или не совпадает с системой, на которой работает ядро. В случае совпадения - МЯФ является простейшим Фортом для этой системы с возможностью сохранения своего текущего состояния под новым именем. Исходный текст ядра должен компилироваться на самом ядре (и на его расширеных версиях за исключением особых случаев, когда расширение ядра превращается в новую программу и перестает исполнять первоначальную функцию МЯФ)

2.2. Что должно уметь ядро?

МЯФ должен уметь следующее:
    • Уметь компилировать самого себя одним из перечисленных способов.
      • по шестнадцатеричному (двоичному, десятичному, любому другому) дампу (представление дампа - самое простое - последовательность чисел, соответствующих ячейкам целевой системы, разделенных пробелами, табуляциями или переводами строк);
      • по исходному коду компилируемому самим минимальным ядром;
      • использовать собственную копию с модифицированием данных по дополнительному патч-файлу, содержащему простейшие инструкции для вставки/замены (метод copy-past);
    • Работать подобно Форту с сокращенным набором слов (стандартов F83, ANS94 или иного) используемым для построения целевого Форта - Форта на целевой системе.
    • "Работа подобно Форту" означает следующий набор свойств и возможностей:
      • Организация, как минимум, одного списка форт-слов;
      • Реализация слова INTERPRET и всех слов, необходимых для его работы;
      • Наличие механизма подгрузки исходных текстов для дальнейшей компиляции/исполнения;
      • Наличие механизма сохранения результата работы в виде исполняемого файла(.exe файла или иного исполняемого в целевой системе файла);

2.3. Сокращенный набор слов ФП и ВФМ

Представленный здесь набор команд ФП или ФВМ является минимальным набором, необходимым для реализации МЯФ. Доказательства минимальности не предоставляются ввиду отсутствия необходимости уменьшения такого достаточно небольшого набора команд. Поиск подобного минимума может представлять разве что академический интерес.
Сокращенный набор команд Форт Процессора или Виртуальной Форт Машины
?BRANCHусловный переходD:(flag --> )
LITлитералD:( --> lit)
CALLВызов подпрограммыR:( --> RetAddr)
RETВозврат из подпрограммыR:(RetAddr --> )
DUPКопирование вершины стека данныхD:(D1 --> D1,D1)
DROPУдаление вершины стека данныхD:(D1,D2 --> D2)
SWAPПерестановка двух элементов на вершине стека данныхD:(D1,D2 --> D2,D1)
OVERКопирование второго элемента стека данных на вершину стека данныхD:(D1,D2 --> D2,D1,D2)
ANDОперация "И" над двумя верхними элементами стека данныхD:(D1,D2 --> D1 and D2)
ORОперация "ИЛИ" над двумя верхними элементами стека данныхD:(D1,D2 --> D1 or D2)
XORОперация "XOR" над двумя верхними элементами стека данныхD:(D1,D2 --> D1 xor D2)
ADDСуммирование двух верхних элементов стека данныхD:(D1,D2 --> D1+D2)
2/Сдвиг вправо верхнего элемента на один битD:(D1 --> D1/2)
@ = FETCHИзвлечение данного из ячейки памяти по адресу из стека данных D:(Addr --> Memory(Addr))
! = STOREСохранение данного в памяти по адресу из стека данныхD:(Addr,Data --> )
AR>Перемещение адреса со стека возвратов на стек данныхR:(Addr -->) D:(--> Addr)
A>RПеремещение адреса со стека данных на стек возвратовR:(--> Addr) D:(Addr -->)

2.4. Способы расширения ядра

2.5. Дополнительный набор слов

4. Расширения ядра

4.1. О старых стандартах
4.1.1. Forth-83
4.1.2. ANSI-94
4.1.3. О RuF09
4.1.4. О будущих стандартах
4.1.5. Стандартизация расширений
4.2. Расширение набора слов ядра
4.2. Подключаемые модули
4.2.1. Модуль XXX для YYY
4.2.2. Модуль ZZZ для XXX

5. Рекомендации

5.1. Рекомендации по оформлению программ
5.2. Документирование программ

Приложения

В таблице приводятся предлагаемые наборы слов, разделенные по категориям. форт-определения в описании определяют поведение описываемых слов, но не закрепляют их реализацию, как определение через другие слова

обозначения:
А - непосредственная реализация слова (команда виртуальной машины или форт-процессора)
А' - реализация на Форте с использованием слов типа A или на более низком уровне - по сути -
ассемблерная реализация для виртуальной машины или микропрограммная для форт-процессора
F - реализация на Форте с использованием всех доступных на момент определения слов
? - между именами в первой колонке - альтернативные имена
? - в колонке типа слова означает, что реализация соответствуюющего слова в ядре не обязательна
в скобках в колонке типа слова укзана альтернативная возможность реализации
/\/\/\/\/\/\/
работа со стеком данных
/\/\/\/\/\/\/
Слово тип описание
DUP A ( w1 -- w1,w1 ) копировать вершину стека
?DUP A(F)? ( w1 -- w1,w1 / 0 ) копировать вершину, если она не 0
: ?DUP DUP IF DUP THEN ;
DROP A ( w2,w1 -- w2 ) удалить вершину
SWAP A ( w2,w1 -- w1,w2 ) поменять два верхних элемента стека
OVER A ( w2,w1 -- w2,w1,w2 ) копировать второй элемент стека
: OVER >R DUP R> SWAP ;
NIP A(А') ( w1 -- w1,w1 ) удалить второй элемент стека
: NIP SWAP DROP ;
ROT A(А') ( w3,w2,w1 -- w2,w1,w3 ) крутить три верхних элемента стека
: ROT >R SWAP R> SWAP ;
-ROT A(А') ( w3,w2,w1 -- w1,w3,w2 ) крутить три верхних элемента стека назад
: -ROT SWAP >R SWAP R> ;
2DUP ? DDUP A(А') ( w2,w1 -- w2,w1,w2,w1 ) дублировать два верхних элемента стека
: 2DUP OVER OVER ;
2DROP ? DDROP A(А') ( w4,w3,w2,w1 -- w4,w3 ) удалить два верхних элемента стека
: 2DROP DROP DROP ;
2SWAP ? DSWAP A(А') ( w4,w3,w2,w1 -- w2,w1,w4,w3 ) переставить по два верхних элемента стека
: 2SWAP ROT >R ROT R> ;
2OVER ? DOVER A(А') ( w4,w3,w2,w1 -- w4,w3,w2,w1,w4,w3 ) скопировать третий и четвертый элементы на вершину
: 2OVER >R >R 2DUP R> R> 2SWAP ;
S0 A(А')? ( -- addr ) константа: дно стека данных
SP@ A(А')? ( -- addr ) адрес текущей вершины стека данных
SP! A(А')? ( addr -- ) установить текущей адрес вершины стека данных
CSP! A(А')? ( -- ) запомнить текущий адрес вершины стека данных в переменной CSP
CSP A(А')? ( -- addr ) переменная CSP
/\/\/\/\/\/\/
работа со стеком возвратов
/\/\/\/\/\/\/
>R A ( w1 -- ) переместить слово со стека данных на стек возвратов
R> A ( -- w1 ) переместить слово со стека возвратов на стек данных
R@ A(F) ( -- w1 ) копировать слово со стека возвратов на стек данных
: R@ R> DUP >R ;
RDROP@ A(F) ( -- ) удалить слово со стека возвратов
: RDROP R> DROP ;
RP! A ( addr -- ) установить адрес стека возвратов на адрес, взятый из стека данных
RP@ A ( -- addr ) скопировать адрес стека возвратов и поместить на стек данных
R0 A ( -- addr ) константа: адрес дна стека возвратов
/\/\/\/\/\/\/
работа с памятью
/\/\/\/\/\/\/
! A ( data,addr -- ) записать слово по адресу
+! A ( data,var -- ) увеличить значение переменной
C! A ( byte,addr -- ) запомнить байт по адресу
D! A ( dd,addr -- ) запомнить двойное слово по адресу
@ A ( addr -- data ) взять слово по адресу
C@ A ( addr -- byte ) взять байт по адресу
C@+ A ( addr -- addr+1,byte ) взять байт по адресу, адрес увеличить на 1 и не удалять
D@ A ( addr -- dd ) взять двойное слово по адресу
/\/\/\/\/\/\/
арифметика одинарная и двойная
/\/\/\/\/\/\/
/\/\/\/\/\/\/
работа и операции со строками
/\/\/\/\/\/\/
/\/\/\/\/\/\/
логика
/\/\/\/\/\/\/
/\/\/\/\/\/\/
операции сравнения
/\/\/\/\/\/\/
/\/\/\/\/\/\/
операции сравнения для двойных слов
/\/\/\/\/\/\/
/\/\/\/\/\/\/
константы и переменные
/\/\/\/\/\/\/
/\/\/\/\/\/\/
компиляция и интерпретация, управление словарем
/\/\/\/\/\/\/
/\/\/\/\/\/\/
определяющие слова
/\/\/\/\/\/\/
/\/\/\/\/\/\/
среда форта
/\/\/\/\/\/\/
/\/\/\/\/\/\/
структуры управления
/\/\/\/\/\/\/
/\/\/\/\/\/\/
инструментальные средства
/\/\/\/\/\/\/

- 27 -