Konilo: персональная вычислительная Forth система.

В этой публикации я постараюсь обзорно описать Konilo [1]. Это переносимая вычислительная Forth система во многом вдохновлённая colorForth [2].

Вообще Konilo это система, физически состоящая из трех составных частей:

Виртуальная машина ilo

В сердце Konilo расположена виртуальная машина ilo. Это процессор с небольшим набором инструкций в котором нет регистров общего назначения. Зато есть два стека: стек данных и стек адресов возвратов. Наличие стека подразумевает наличие регистров вершины стека (sp и rp соответственно), но они не доступны напрямую через набор инструкций. Также есть указатель текущей исполняемой инструкции (недоступный напрямую регистр ip). Память стеков независима от обшей памяти виртуальной машины (каждый стек и основная память адресуются отдельно и не пересекаются). Плюс у виртуальной машины есть инструкции ввода/вывода.

Автора Konilo можно причислить к полиглотам языков программирования. В репозитории можно найти какое-то невероятное количество реализаций виртуальной машины ilo с использованием разных языков. Среди поддерживаемых платформ: Windows, Linux, *BSD, Plan9, DOS и bare metal. Но самое поразительное, что прямо сейчас автор проекта пополняет множество реализаций новыми (#DecemberAdventure 2025-го).

Память

Память виртуальной машины ilo адресуется ячейками. Каждая ячейка занимает четыре байта. Это означает, что нельзя адресовать произвольный байт, только четырехбайтовую ячейку. И весь набор инструкций ilo оперирует только четырехбайтовыми значениями. На мой взгляд это одна из ключевых особенностей Konilo. Здесь скрыты как плюсы, так и минусы.

Образ памяти виртуальной машины собирается в виде файла ilo.rom. Фактически это начальное состояние всех адресуемых ячеек памяти. Исполнение начинается с самой первой (нулевой) ячейки.

Начальное содержимое образа памяти формируется заранее. У виртуальной машины ilo есть свой формат ассемблера - pali. Этот формат описывает отдельные ячейки памяти, плюс имеет специализированную директиву формирования элемента Forth словаря. Соответственно из файла rom/konilo.pali формируется тот самый ilo.rom. Именно здесь (в pali-файле) определены начальные слова для Forth системы, на основе которых будет работать полноценная система Konilo.

Плюс у виртуальной машины ilo есть возможность сохранить текущее состояние памяти в ilo.rom. Для этого в подсистеме ввода-вывода предусмотрены специальные значения виртуальных устройств. Помимо сохранения ilo предоставляет возможность сброса содержимого памяти до состояния образа и перезапуск виртуальной машины.

Накопитель

Накопитель по заветам "старой школы" в Konilo представлен блоками. Никаких файлов, только блоки, каждый из которых занимает 1024 ячейки (то есть по 4 килобайта). Все блоки последовательно адресуются с нулевого. Читаются и пишутся блоки только целиком. Чаще всего реализация виртуальной машины ilo хранит содержимое всех блоков в одном плоском файле (тот самый ilo.blocks).

Именно в блоках определено основное "мясо" Forth системы, вся её высокоуровневая часть. Хотя для меня здесь многое показалось знакомым, так как я уже имел дело с Retro Forth [3]. Но теперь это не просто язык с набором библиотек, а целая система с полноценными утилитами. В стандартную поставку входят редакторы, гипертекстовое руководство, система ведения личных заметок. Весь программный код, расположенный в блоках, представлен в виде исходного кода. Он загружается, разбирается и исполняется "на ходу".

Вместо заключения

На самом деле я пишу свою реализацию виртуальная машины ilo. Поэтому личные впечатления а оставлю для публикации, описывающей мою реализацию ilo.

Ссылки

[1] Konilo: a personal computing system in forth

[2] colorForth: радикальный минимализм Чака Мура

[3] Retro: современный диалект Forth