Comments 30
Недавно захотелось написать форт-систему на языке высокого уровня, чтобы поддерживался хотя-бы стандарт 83.
Но как-то не получилось. С интерпретируемым языком очень сложно придерживаться стандарта. Приходится делать кучу хаков, чтобы повысить производительность, либо строить одну виртуальную машину внутри другой. В общем, сложный выбор.
Единственный рабочий компромисс — не выполнять шитый код, а все определения слов, дублировать на языке машины и исполнять только их.
Очевидно, что форт это надстройка над ассемблером. Но у меня ровно противоположная ситуация. Есть встраиваемый скриптовой язык, если я на нем сделаю форт-систему, работать она будет очень странно. Если я на нем напишу эмулятор процессора, а для этого процессора форт-систему, это будет ужасающе бессмысленная трата ресурсов.
Можно сделать внешний интерпретатор и интерфейс, который будет взаимодействовать с пользователем через оболочку скриптового языка (только не понятно, как и зачем), тогда придется написать интерпретаторы под разные архитектуры (x86, x64, arm, risc), форт хоть и примитивен, его легко будет реализовать, но тащить бесполезные зависимости это сомнительная идея.
… вы знаете как можно избавиться от бОльшего количества примитивов — пожалуйста напишите...
Можно, сократив набор примитивов до уровня необходимого для реализации машины Тюринга. А для этого много вообще не требуется — двух команд достаточно: Mov is Turing-Comlete
Не уверен насчёт Форта, но вообще одной команды достаточно: One-instruction set computer.
изначально вы реализуете только набор Форт-примитивов для такой минимальной машины (может двух или трёх будет достаточно)
Я не вижу как это можно сделать и с благодарностью приму любые идеи как мой набор из 7 примитивов можно сократить еще сильнее. На данный момент единственными кандидатами на мой взгляд являются слова для работы с памятью, но идей как можно тот же lit выразить через "@" и "!" у меня нет.
1 может ещё как-то хитро?
А имея 0 и 1 арифметикой можно получить любое LIT-число.
Я думаю, в первых Фортах (ещё на 8-битных системах), не могло быть page fault, и DUP прочитал бы хоть что-то по указателю стека. То есть, значение не определённое, но ошибки чтения нет.
Есть тонкая разница между "инструкцией процессора" и "командой Тьюринг-машины". По ссылке как раз показано, что можно сделать командны для Тьюринг-машины, используя процессор как странный конечный автомат, игнорируя при этом инструкции процессора.
Но это не отменяет того, что у них Тьюринг-машина имеет команды.
ЗЫ Тьюринг-машина без команд никогда не остановится, т.е. как вычислитель бесполезна.
Наоборот, если система команд процессора позволяет, то желательно закодировать как можно больше команд в физические специфические команды аппаратного процессора.
Вот здесь я запускал аппаратный Forth в FPGAL habr.com/ru/post/523348
Philip J. Koopman, Jr. Стековые компьютеры: новая волна
R := A and B;
пишем
if A then begin if B then R := 1 else R := 0 end else R := 0;
Например, для 4-битных чисел
bit0 = bit1 = bit2 = bit3 = 0;
if (val >= 8) { bit3 = 1; val -= 8; }
if (val >= 4) { bit2 = 1; val -= 4; }
if (val >= 2) { bit1 = 1; val -= 2; }
if (val >= 1) { bit0 = 1; val -= 1; }
…
а дальше bit3..bit0 обрабатываются логикой и обратно складываются в число.
для 32-битных чисел копипасты будет побольше…
andreaferretti.github.io/factor-tutorial
rosettacode.org/wiki/Category:Factor
dxdy.ru/topic138111.html
Сколько нужно примитивов для реализации форт системы?