"Новый синтез" / "New synthesis": preForth, seedForth

В федимире промелькнуло сообщение, которое напомнило о том, что на FOSDEM в 2020 году было отличное выступление, которое провёл Ulrich Hoffmann. В своей небольшой лекции он рассказал о симпатичной реализации Форт-системы: preForth и seedForth.

Внешние ссылки:

Запись выступления на youtube, где есть довольно подробное текстовое описание проекта.

Видео запись выступления (mp4, 142.2 MiB)

Видео запись выступления (webm, 112.6 MiB)

Репозиторий с исходным кодом на github

Проект разделил реализацию Форт-системы на два компонента:

preForth

preForth это проект небольшого минимально ядра Forth. Собирается он из preForth.asm, который не храниться в репозитории, а генерируется с использованием gforth. Потом полученный preForth.asm ассемблируется fasm'ом, а результирующий объектный файл компоновщиком ld превращается в исполняемый ELF. На Linux это выглядит как-то так:

cat preForth-i386-rts.pre preForth-rts.pre preForth-i386-backend.pre preForth.pre \
    | gforth load-i386-preForth.fs > preForth.asm

fasm preForth.asm preForth.Linux.o

LDEMULATION=elf_i386 ld -arch i386 -o preForth.Linux \
   -dynamic-linker /lib32/ld-linux.so.2 \
   /usr/lib/i386-linux-gnu/crt1.o /usr/lib/i386-linux-gnu/crti.o \
   preForth.Linux.o \
   -lc /usr/lib/i386-linux-gnu/crtn.o

Получилось, как по мне, жирновато для минималистичного бустрапера (gforth + fasm + ld). Про использование докера я промолчу, ведь никто не требует сборку именно в нём. Но заявление авторов о "can bootstrap itself" в отношении preForth с учётом требования fasm и компоновщика из gcc выглядит немного преувеличенным.

Да, стоит отметить, что собирается это все в 32-х разрядном режиме. Могу предположить, что идея была в том, что бы одним asm файлом охватить i386 и amd64 Linux-системы. Но, например, на OpenBSD такой фокус не пройдёт. С другой стороны arm, arm64, да и riscv системы уже не редкость (я, откровенно говоря, не в курсе совместимости elf файлов для i386 с этими аппаратными архитектурами в Linux).

Честно говоря у меня в голове уже давно маринуется идея написать что-то похожее, но без начального требования какого-либо Forth на системе. Плюс мне не нравится зависимость от внешнего ассемблера. Поэтому, хотя именно эта конкретная реализация меня не устроила, проект preForth даёт положительный пример того, что это в каком-то виде реализуемо.