Честный дисклеймер
Эта статья - про мой собственный проект, который я сделал 27 лет назад. Я сам сейчас в лёгком шоке от того, что тогда это написал, и от того, что это до сих пор работает.Хочу поделиться и конечно немного похвастаться - не без этого.
Все... я вас предупредил - теперь моя совесть чиста. 😄
Содержание:
- Вступление. CD диск 27 лет спустя
- Как всё началось. Студенческая группа и RainBow Forth
- Что такое FORTH
- Шитый код - сердце Форта
- FORTH и 1С - общие корни
- Что внутри IDE - скриншоты и код из 1998 года
- Что думает современный ИИ об этом коде
- А что если добавить ИИ?
- Письмо себе в 1998 год
1. Вступление. CD диск 27 лет спустя
Идея написать эту статью родилась случайно. Когда я писал статью Перфокарты, ассемблер, объектно-ориентированные языки, промпты или почему скоро языки программирования станут не нужны, я вскользь упомянул что мы в институте делали свой язык - FORTH, даже вкратце описал как устроен текстовый редактор (система с двумя стеками). И тогда подумал: а ведь где-то должен быть мой старый диск, который я записывал после защиты диплома и куда я сохранил свой дипломный проект.
Нашёл. Старенький такой CD в коробке, тёмное место, 27 лет пролежал.

На фото, "Золотой", в то время диск, стоил дороже остальных, я покупал его специально, чтобы сохранить данные и он со своей задачей справился, хоть и не с первого раза
Достал DVD-привод, подключил - диск читается. Но читается, как оказалось, всё кроме того, что нужно. Папка с дипломным проектом и средой разработки для FORTH не копируется. Попробовал второй привод - та же история. Не копируются. Перепробовал несколько программ для восстановления с повреждённых дисков. Результат одинаковый.

На фото, второй уже по счету, подключенный привод
Расстроился. Забыл на какое-то время диск прямо в приводе. Компьютер стоял разобранный.
Недели через две решил наконец всё убрать на место. Отключил провода от DVD привода, и тут вспомнил - диск же там. Скрепки под рукой не оказалось, пришлось снова подключить привод.
И просто так, без особой надежды, попробовал ещё раз прочитать ту папку.
Она открылась и полностью скопировалась. С первого раза! Полностью и без ошибок!

Скриншет, папка MY, которая ни как не читалась, тут самая важная для меня была папка DIPLOM от 19.08.1999, потому, что там была и дипломная работа, и полностью рабочий релиз моего проекта IDE
Диск пролежал в закрытой коробке в тёмном месте 27 лет и не читался. Пролежал две недели в дисководе, подключённом к компьютеру, и прочитался. Я до сих пор не знаю, почему. Просто чудо.
После того как файлы наконец скопировались, я скачал DOSBox. Я нашёл готовый образ Windows 98 русской редакции, создал отдельно VHD файл, скопировал туда свою дипломную папку SHELL и подключил образ к DOSBox, как диск D.
Практически дрожащими руками. Вот, без преувеличения.
После загрузки Windows я нажал "Завершение работы" и выбрал пункт "Перезагрузить компьютер в режим MS-DOS". Набрал:
D:
cd shell
r32p.exe shell.bin

И оно запустилось. Моей радости не было предела!
Маленькое пояснение: r32p.exe - это наше ядро языка RainBow Forth. Можно было дать команду r32p.exe forth.bin и попасть в консоль самого языка. Но у меня был уже скомпилированный словарь shell.bin - это и есть моя среда разработки, поэтому запуск именно такой. Одна команда, и вся IDE поднимается из одного файла.
Обратите внимание на размеры файлов, это все в байтах!
Вот тогда и нахлынула ностальгия по-настоящему. Заставка моего IDE для RainBow Forth начала переливаться цветами - точно так же как 27 лет назад.

Скринсейвер, тогда это было популярно, реализовал и добавил себе в IDE
2. Как всё началось. Студенческая группа и RainBow Forth
Середина 90-х, я учусь в университете. Наш преподаватель по дискретной математике собрал небольшую проектную группу студентов - попал в неё и я. Задача была серьёзная: адаптировать язык FORTH под архитектуру x386 с защищённым режимом, чтобы использовать всю доступную плоскую память, а не жалкие 640 килобайт реального режима DOS.
За основу руководитель выбрал FIG-Forth (Forth Interest Group) - это была публичная эталонная реализация языка, своего рода "открытый стандарт" того времени, доступный для изучения и модификации. Существовали и другие реализации - коммерческие и любительские, под разные платформы - но FIG-Forth был хорошо документирован и идеально подходил как основа для портирования. Почему именно он - это решение руководителя, логику которого я уже не восстановлю спустя столько времени.
Мы разделились: одни писали ядро на ассемблере, другие - прикладные слова языка. Мне досталась среда разработки и я сам решил сделать её по образцу Borland Pascal: меню, окна, редактор, отладчик. Вдохновился и начал реализовывать, впоследствии по этой теме и защищал диплом.
Проект назвали RainBow Forth
Отдельная история - алгоритм текстового редактора. Преподаватель поставил задачу: текст должен работать без тормозов хоть со 100 символами хоть со 100 тысячами. Два дня думал - ничего. На третий день он рассказал простое решение: два стека, первый хранит текст до курсора, второй после. Любая операция - переложить символ из одного стека в другой. Никаких сдвигов массива, никаких тормозов. Гениально просто и я расстроился, что сам до этого не додумался. Подробнее об этом алгоритме (в картинках) в статье "Перфокарты, ассемблер, объектно-ориентированные языки, промпты или почему скоро языки программирования станут не нужны"
3. Что такое FORTH
FORTH - язык необычный. Настолько необычный, что большинство программистов, увидев написанный на нем код в первый раз думают, что это ошибка или какой-то шифр.
Но начну с истории названия. Привожу выдержку из моего диплома 1998 года:
"Название Forth происходит как сокращение от Fourth (четвертый). Такое странное название связано со следующим фактом из истории: изобретатель языка Forth Чарльз Мур, закончивший работу над языком в начале 1970-х годов, работал в то время с моделью IBM-1130 - ЭВМ третьего поколения. Полученные результаты показались ему настолько значительными, что он посчитал язык "языком машин четвертого поколения" и назвал бы его Fourth, если бы модель 1130 допускала шестибуквенные идентификаторы. Таким образом Fourth превратился в Forth - своеобразная игра слов."
Название придуманное потому что компьютер не мог хранить длинные имена. История IT полна таких случайностей. 😄
Язык FORTH использует обратную польскую нотацию и стек как основу всего. Не переменные, не выражения, а стек. Всё что делает программа - это класть значения на стек и забирать их оттуда.
Простой пример:
1 1 + .
Что здесь происходит:
1- положить число 1 на стек1- положить ещё одно число 1 на стек+- взять два числа с вершины стека, сложить, результат положить обратно.- взять число с вершины стека и вывести на экран
Результат: на экране появится 2.
Никаких скобок. Никаких приоритетов операций. Всё читается слева направо, всё предсказуемо. Стек - единственное место где живут данные.
Как определяются слова:
В FORTH программы состоят из слов - так здесь называются функции. Новое слово определяется так:
: qqq 1 1 + . ;
:- начало определения нового словаqqq- имя слова1 1 + .- тело: положить два числа, сложить, вывести;- конец определения
Теперь можно просто написать qqq и на экране появится 2. Слово стало частью языка - точно так же как + или ..
И вот здесь начинается самое интересное, язык FORTH можно расширять прямо во время работы. Определил новое слово - оно сразу доступно. Можно строить слова из слов, слои абстракции из слоёв абстракции. Именно поэтому говорят что FORTH написан на самом себе - только крошечное ядро реализовано на ассемблере, всё остальное это слова определённые через другие слова.
Это и делало FORTH идеальным для маленьких машин 90-х - минимальное ядро, максимальная гибкость и никакого лишнего кода.
4. Шитый код - сердце Форта
Теперь самое интересное - как FORTH работает внутри.
Большинство языков того времени, компилировались в машинный код - набор инструкций процессора. FORTH пошёл другим путём. Он использует технологию которая называется шитый код (threaded code).
Снова обращусь к своему диплому 1998 года:
"Интерпретирующий язык с шитым кодом записывает процедуру в память только один раз и делает переход к ней из любого места, где она потребуется. Поэтому Forth-программа может занимать в памяти значительно меньше места, чем эквивалентная программа, написанная, скажем, на Basic."
Идея гениально проста. Программа на FORTH - это не набор машинных инструкций. Это список адресов слов. Специальный интерпретатор - его называют "inner interpreter" или просто "движок" - берёт очередной адрес из списка, прыгает туда, выполняет код слова, возвращается и берёт следующий адрес. И так по цепочке - нить за нитью. Отсюда и название: threaded - нанизанный на нить.
Представьте это как список дел:
- Сделай пункт А
- Сделай пункт Б
- Сделай пункт В
Только вместо текста - адреса в памяти. Движок просто бежит по этому списку адресов и выполняет один за другим.
Почему это было гениально для 90-х:
Шитый код занимает минимум памяти. Вместо того чтобы копировать машинный код каждого слова в каждое место, где оно используется - хранится только адрес. Использовал слово + тысячу раз - тысяча адресов, а сам код сложения один. На машинах с килобайтами памяти это было критично.
И ещё одна выдержка из диплома - про то, как в нашем RainBow Forth можно было писать прямо на машинном коде внутри слова:
"Если определение слова начинается с CODES, то все, что следует после этого слова, описывается двоичным представлением мнемоники ассемблера и при компиляции превращается в машинный код, который становится частью определения этого слова. Поскольку слова языка Forth можно легко комбинировать с машинным кодом, он обладает мощью ассемблера и удобством языка высокого уровня."
Именно такие CODES-блоки есть в исходниках моей среды - там, где нужна была максимальная скорость, я вставлял машинный код прямо в Форт. Это граница между моей работой и работой ребят, которые писали ассемблерное ядро.
Наш RainBow Forth не мог работать под Windows - он работал в защищённом режиме процессора напрямую, управлял памятью сам, без посредников. Это была не ограниченность, а его сила - доступ ко всей памяти компьютера без жалких 640 килобайт DOS или постоянного переключения страниц памяти.
5. FORTH и 1С - общие корни
Те из вас, кто копал платформу 1С достаточно глубоко - знают: 1С компилирует код в байт-код, который выполняется виртуальной стековой машиной. Это не секрет.
Но вот вопрос, который задают реже: почему стековая машина? Откуда вообще эта идея?
Стековая архитектура виртуальной машины - штука, проверенная десятилетиями. Java Virtual Machine - стековая машина. Python внутри - стековая машина. .NET CLR - стековая машина. 1С - туда же.
А FORTH был одним из первых языков, который сделал стек не деталью реализации спрятанной от программиста, а явной частью самого языка. Никакого синтаксического сахара, никакой магии компилятора, рюшечек в виде объектов и т.д. - просто стек, прямо перед глазами.
Когда виртуальная машина 1С выполняет:
Результат = А + Б;
Она делает ровно то же самое, что делает FORTH, когда видит А Б + - кладёт операнды на стек, выполняет операцию, забирает результат. Только в 1С это спрятано за привычным синтаксисом.
И ещё одна параллель, которую мало кто замечает. Из моего диплома:
"Программа пишется путем определения новых слов с использованием слов, ранее уже определенных в словаре. Как только новые слова скомпилированы в словарь, они не отличаются по форме от тех слов, которые в нем уже имеются."
Звучит знакомо? В 1С вы точно так же строите процедуры из процедур, функции из функций - новый код становится частью системы наравне со встроенными функциями платформы. Идея расширяемого словаря живёт и в современных языках, просто называется иначе.
FORTH не изобрёл стековую машину, но он сделал её видимой и явной. И именно это делало его таким мощным инструментом для своего времени.
Мы реализовывали эти идеи в 1998 году, а они живут до сих пор - просто теперь они спрятаны поглубже.
История делает круг. 😄
6. Что внутри моего IDE - скриншоты и код из 1998 года
Итак, среда запустилась. Давайте посмотрим что внутри.
Но, прежде чем смотреть на скриншоты - важный момент. Всё что вы видите: окна, меню, диалоги, тени, скроллбары - написано на Форте с нуля.
Сначала я сделал базовые библиотеки: оконную систему, меню и inline-редактор, а уже потом использовал их в самой среде. Все они лежат в папке LIB и подключаются через include:
include lib\windows.frt
include lib\menu.frt
include lib\in_line.frt
Причём эти библиотеки универсальные, их можно было подключить к любому другому Форт-проекту и сразу получить полноценный оконный интерфейс. Готовых UI-фреймворков тогда просто не было, поэтому всё приходилось делать самому, заодно было интересно разобраться как это устроено.
Главное меню
Первое, что видит пользователь - классическая строка меню: File, Edit, Search, Compile, Debug, Tools, Options, Windows, Help, About. Зелёно-чёрная цветовая схема, тени у выпадающих окон - настоящий DOS-стиль 90-х. Визуально это осознанное решение - я брал за образец Borland Pascal и воспроизводил его стиль максимально точно. Лучшего образца для DOS-среды в то время просто не было.
-
Меню File - всё для работы с файлами плюс два специальных пункта: Forth для перехода в консоль языка и DOS shell для выхода в командную строку не закрывая среду.

Меню Edit - Undo, работа с блоками (Copy, Move, Del), буфер обмена и маркировка. Undo в текстовом редакторе 1998 года написанном студентом на Форте - это не само собой разумеющееся, это полноценный редактор, а не игрушка.

В меню Search есть пункт, который отличает эту среду от обычного текстового редактора - Forth's Word Find. Не просто поиск по тексту, а поиск по словарю Форта. Специфичная для языка фича, которую обычные редакторы не умеют.

Compile — всего два пункта: Compile (Ctrl+F9) и Make (F9) — скомпилировать текущий файл или собрать весь проект, как в настоящих больших IDE.

Debug - три инструмента: Deforth (декомпилятор - показывает, из каких слов составлено любое слово словаря, можно заглянуть внутрь любого определения), Stack data (содержимое стека в реальном времени) и Dump (дампер памяти) - всё, что нужно для отладки Форт-программы.

Дампер памяти - можно сразу менять, как в HEX представлении, так и в строковом

Tools - ASCII Table, Forth's Words и Forth Command - инструменты, специфичные именно для Форта, такого не найдёшь в обычном текстовом редакторе.

ASCII - таблица

Options - настройки среды: Memory (размер памяти для генерируемых программ), Primary file (главный файл проекта) и Edit setup (настройки редактора)

Windows - полноценный многооконный менеджер: Next, Previous, Close, Close all и List со списком всех открытых окон. Да, в 1998 году на Форте.

Help - многоуровневая система справки: Keys с подразделами (Cursor movement, Deleting text, Search and replace, File operations, Block operations) и Using help. Всё на английском, контекстно.

About - "Professional programming shell, Version 01.98, Copyright (C) 1997 by Livsoft Ltd". LIV - первые буквы моих фамилии, имени и отчества. Студенческий проект с собственным копирайтом. Livsoft Ltd впоследствии переименовался в GarriSoft - но это уже другая история. 😄
Редактор и живой код

Подсветку текущей строки я сделал как в Multi-Edit, статусная строка с номером строки и позицией курсора, горячие клавиши F1-F4 и Ctrl+F9 Compile. Всё как в Borland Pascal - именно этого я и добивался.
А теперь давайте посмотрим на реальный код из редактора. Помните алгоритм двух стеков из раздела № 2? Вот как он выглядит на Форте - реальный код 1998 года:
: Push_L ( Запись в левый стек )
( element -> ... )
Sp_L@ C!
Sp_L@ 1+ Sp_L!
;
: Push_R ( Запись в правый стек )
( element -> ... )
Sp_R@ C!
Sp_R@ 1- Sp_R!
;
: Pop_L ( Чтение из левого стека )
( ... -> element )
Sp_L@ 1- dup
c@ swap Sp_L!
;
: Pop_R ( Чтение из правого стека )
( ... -> element )
Sp_R@ 1+ dup
c@ swap Sp_R!
;
Четыре слова - и весь механизм текстового редактора. Push_L кладёт символ в левый стек, Pop_R достаёт из правого. Курсор двигается влево - один Pop_L и один Push_R. Вправо - наоборот. Никаких массивов, никаких сдвигов.
А вот как выглядит движение курсора - кнопка вправо в редакторе:
: Curr-Right ( ... -> ... )
Empty_R 0=
IF
HideCurs Pop_R DUP 13 =
IF
Push_R
ELSE
Push_L
Coord_X@ 1+ Coord_X!
Check-CoordX> Set-Down
ENDIF
ENDIF Set_Col Status-Line
Set_Coord
;
Читается почти как псевдокод: если правый стек не пуст - достать символ, если это не конец строки - переложить в левый стек и сдвинуть координату курсора. Вот и всё движение курсора вправо в редакторе.
Отладчик стека

Справа открыта панель Stack Data - отладчик стека в реальном времени. Для Форта это критически важная фича: видишь, что лежит на стеке в каждый момент выполнения. Без этого отлаживать Форт-программу очень сложно.
Контекстная справка

Контекстная справка на русском языке. F1 в любом месте открывает справку именно по текущему контексту. В 1998 году сделать русскоязычную контекстную справку в DOS - это отдельная работа, которую я почему-то сделал. Видимо, сильно хотел, чтобы было "как у взрослых". 😄
Граница между Фортом и ассемблером
И последнее - самое интересное. Там, где нужна была максимальная скорость, я вставлял машинный код прямо в Форт. Вот реальный пример из исходников - запись и чтение 16-разрядного числа:
HEX
CODES W! ( 16-разрядное число, Addr -> ... )
9C \ pushfd
53 \ push ebx
50 \ push eax
8B 5D 00 \ mov ebx,[ebp]
8B 45 04 \ mov eax,[ebp+4]
66 89 03 \ mov [ebx],ax
83 C5 08 \ add ebp,8
58 \ pop eax
5B \ pop ebx
9D \ popfd
;CODES
DECIMAL
CODES - и ты можешь писать машинный код, в комментария инструкция ассемблера. ;CODES - вернулся в Форт. Это и есть та самая мощь, о которой писал в дипломе: "он обладает мощью ассемблера и удобством языка высокого уровня". Это граница между моей работой и работой ребят, которые писали ассемблерное ядро.
Скринсейвер
И вишенка на торте - скринсейвер. Анимированная гифка была в первом пункте. Если долго не работать, запускается заставка RainBow Forth с переливающимися цветами, затем электронные часы во весь экран - тоже переливающиеся. Всё написано на самом Форте.
7. Что думает современный ИИ об этом коде
Я попросил Claude - современную языковую модель от Anthropic - оценить исходники RainBow Forth честно, без скидок на возраст проекта. Вот что получилось.
Архитектура - на удивление зрелая
Первое, что бросается в глаза - проект правильно разбит на модули. EDIT.FRT, DUMP.FRT, CR-MENU.FRT, WINDOWS.FRT - каждый файл отвечает за свою область. Зависимости прописаны через include, пространства имён изолированы через VOCABULARY. Это не свалка кода в одном файле - это продуманная структура.
Stack-effect комментарии - правильная практика
Почти каждое слово имеет комментарий в скобках, который описывает, что слово берёт со стека и что кладёт обратно:
: Push_L ( element -> ... )
: Pop_L ( ... -> element )
: W! ( 16-разрядное число, Addr -> ... )
Это стандарт хорошего Форт-кода - и он соблюдён. Сегодня это назвали бы "типизацией через документацию".
Паттерн геттер/сеттер - современно
Вот что реально удивило. Для каждой переменной состояния определена пара слов - читатель и писатель:
: Coord_X@ 4 EC@ ; : Coord_X! 4 EC! ;
: Coord_Y@ 5 EC@ ; : Coord_Y! 5 EC! ;
Это инкапсуляция. В 1998 году, на Форте, в студенческом проекте - паттерн, который сегодня считается хорошей практикой в любом языке. Случайно или осознанно - но правильно.
CODES-блоки - граница между уровнями
Вставки машинного кода прямо в Форт - W!, W@, -CMOVE - написаны чисто и с комментариями к каждой инструкции:
CODES -CMOVE ( Addr1 Addr2 Len -> ... )
9C \ pushfd
56 \ push esi
FD \ std
...
;CODES
Это не хак и не костыль - это осознанное решение там, где нужна скорость. Граница между высоким и низким уровнем чёткая и понятная.
Что устарело
Жёстко зашитые пути - "c:\\command.com", "f:\\dos6.00\\" - прямо в коде. Сегодня это вынесли бы в конфиг. Но в 1998 году на конкретной машине - вполне простительно.
Местами нет комментариев там, где они были бы полезны. Особенно в сложных словах типа Curr-Right и Home - логика работает, но читать без контекста тяжело.
Итоговая оценка
Для студенческого проекта 1998 года, написанного без Stack Overflow, без туториалов и на языке, который большинство программистов никогда не видели, - это очень сильная работа. Модульность, инкапсуляция, документация стека - это не случайные совпадения, это результат хорошей школы и думающего автора.
Если бы этот код показали мне без контекста и спросили, когда написан - я бы не угадал, что это студенческий диплом. Скорее решил бы, что это библиотека опытного разработчика.
8. А что, если добавить ИИ?
Глядя на этот код в 2026 году невольно думаешь, а что если бы тогда был ИИ?
Форт для этого подходит идеально. Стек виден явно, каждое слово изолировано, stack-effect комментарии уже описывают типы - ИИ понимал бы контекст без лишних объяснений. Дал задание "напиши слово, которое копирует блок текста" - получил готовое определение. Попросил объяснить, что делает Deforth - получил разбор.
MCP-сервер, который видит словарь Форта, понимает стек, может компилировать слова прямо в среде - это была бы идеальная связка. Лучше, чем многие современные IDE с ИИ.
Но в 1998 году у нас не было ИИ. С другой стороны, того, что было, нам хватило.
9. Письмо себе в 1998 год
Привет, Игорь.
Ты только что защитил диплом. Стопка распечаток на столе, в кармане - диск с дипломом и твоей средой разработки. Впереди - вся жизнь в IT.
И есть лёгкое чувство: как будто никто толком не понял, какую крутую штуку ты сделал. Ни однокурсники - у всех свои дипломы, ни кафедра. Хотя защитился ты на отлично. Поверь, это нормально.
Хочу тебе кое-что сказать.
Через 27 лет ты достанешь свой CD диск. Он не будет читаться - два разных привода, несколько программ восстановления, полное расстройство. Ты забудешь его в дисководе на две недели. А потом он вдруг прочитается - с первого раза, полностью, как будто ждал этого момента.
Ты запустишь DOSBox, наберёшь r32p.exe shell.bin - и заставка RainBow Forth начнёт переливаться цветами. Точно так же, как сейчас у тебя.
И ты поймёшь несколько вещей, которые сейчас тебе не очевидны.
Та книга про защищённый режим x386, которую вы зачитали до дыр, разговоры с преподавателем об архитектуре, алгоритмах - это была настоящая инженерная школа. Мало кто из твоих сверстников в 1998 году понимал, как работает процессор, на таком уровне, умел писать код на ассемблере и FORTH.
Алгоритм двух стеков который тебе объяснил преподаватель - ты будешь помнить всю свою жизнь. И однажды расскажешь о нём тысячам людей в статье на Инфостарте.
Паттерны, которые ты написал интуитивно - геттеры и сеттеры, модули, документация, стек - даже через 20 лет будут называться "хорошими практиками" в любом языке программирования. Ты просто делал так, как, казалось, будет правильно. И это было действительно правильно.
Livsoft Ltd ты переименуешь в GarriSoft. И под этим именем ты напишешь много статей на Инфостарте - маркетплейсы, маркировку, как менял мозги у стиральной машины на Arduino. Да, ты еще не знаешь, что такое Arduino, но поверь, тебе будет интересно. Будут и статьи, которые соберут десятки тысяч просмотров, а также статьи, которые оценит сам основатель Инфостарт.
Но эта статья - про RainBow Forth - будет для тебя особенной. Потому что это про то, с чего всё началось.
Обязательно сохрани этот диск. Он тебе еще пригодится.
Ссылка на githab: https://github.com/Nihixi/rainbow-forth-ide-
Русские символы в исходниках и справке используют кодировку DOS (CP866). При просмотре файлов на современных системах необходимо явно указывать кодировку, иначе русский текст будет отображаться некорректно.
Другие статьи автора:
Вступайте в нашу телеграмм-группу Инфостарт