"Новый синтез" / "New synthesis": preForth, seedForth
В федимире промелькнуло сообщение, которое напомнило о том, что на FOSDEM в 2020 году было отличное выступление, которое провёл Ulrich Hoffmann. В своей небольшой лекции он рассказал о симпатичной реализации Форт-системы: preForth и seedForth.
Внешние ссылки:
Проект разделил реализацию Форт-системы на два компонента:
- preForth: минималистичное неинтерактивное ядро Forth, которого должно быть достаточно для сборки самого себя ("can bootstrap itself"). По заявлениям авторов preForth может использоваться как портируемая основа для полной реализации Forth или реализации других языков программирования. С моей точки зрения эти требования не выполнены (смотри следующий раздел).
- seedForth: уже более комплексная реализация виртуальной машины Forth.
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 даёт положительный пример того, что это в каком-то виде реализуемо.