Каковы примитивные операторы Forth? - PullRequest
36 голосов
/ 02 января 2009

Я заинтересован во внедрении системы Forth, просто чтобы получить некоторый опыт создания простой виртуальной машины и среды выполнения.

Когда вы начинаете в Forth, обычно сначала узнают о стеке и его операторах (DROP, DUP, SWAP и т. Д.), Поэтому естественно думать о них как о примитивных операторах. Но это не так. Каждый из них может быть разбит на операторы, которые напрямую манипулируют памятью и указателями стека. Позже вы узнаете о store (!) И fetch (@), которые можно использовать для реализации DUP, SWAP и т. Д. (Ха!).

Так, каковы примитивные операторы? Какие из них должны быть реализованы непосредственно в среде выполнения, из которой могут быть построены все остальные? Я не заинтересован в высокой производительности; Я хочу кое-что, чему я (и другие) могу научиться. Оптимизация оператора может произойти позже.

(Да, я знаю, что могу начать с машины Тьюринга и идти оттуда. Это немного экстремально.)

Edit: То, к чему я стремлюсь, похоже на загрузку операционной системы или нового компилятора. Как мне нужно реализовать, как минимум, чтобы я мог построить остальную часть системы из этих примитивных строительных блоков? Я не буду реализовывать это на голом оборудовании; в качестве учебного упражнения я бы написал свою собственную минимальную виртуальную машину.

Ответы [ 7 ]

23 голосов
/ 03 января 2009

Эта тема охватывает ваш точный вопрос. Вот реализация супа к орехам с полной документацией.

Я написал подпрограмму с резьбой Forth для 68K , когда учился в колледже. Я определил среду выполнения и формат словаря, затем написал некоторый код на C, который загружал приложение Macintosh, которое загружало словарь по умолчанию, заполняло некоторые векторы ввода / вывода и запускало код. Затем я взял книгу Лео Броди Starting Forth и начал реализацию основного словаря на ассемблере 68K. Я начал с арифметических / логических слов, затем создал управляющие структуры, затем слова определения / манипуляции словами. Насколько я понимаю, вам нужно как минимум @,!, +, -, * и /. Остальные могут быть реализованы с точки зрения тех, но это все равно, что пытаться написать целую графическую библиотеку на основе SetPixel и GetPixel: это будет работать, но да, почему?

Мне понравился этот процесс, поскольку были некоторые действительно интересные загадки, например, правильное получение DOES> (и когда у меня была надежная реализация DOES>, я создавал замыкания, которые превращались в крошечные, крошечные кусочки кода).

10 голосов
/ 03 января 2009

Давным-давно у меня была книга под названием «Потоковые интерпретирующие языки», опубликованная, как мне кажется, Byte, в которой обсуждалась реализация языка, похожего на Forth (я не думаю, что они когда-либо называли его Forth) в сборке Z80. .

Возможно, у вас нет под рукой Z80 или вы хотите его приобрести, но книга может быть поучительной.

8 голосов
/ 03 января 2009

В этом сообщении на comp.lang.forth перечислены несколько «минимальных Forths».

http://groups.google.com/group/comp.lang.forth/msg/10872cb68edcb526

Почему я это знаю? Мой брат Микаэль написал № 3, а также написал статью о создании «минимального Форта» (хотя по-шведски) Если я правильно помню, он хотел получить минимальный набор операторов, который мог бы быть встроен в кремний.

4 голосов
/ 03 января 2009

Я все еще не уверен, что вопрос правильно сформулирован. Например, инструкции Плинта могут быть уменьшены; в конце концов, * и / могут быть реализованы в терминах + и -, но тогда '+' может быть реализовано в терминах функции-преемника (см. Аксиомы Пеано . ) Который ставит вас в окрестности машины Тьюринга. Откуда ты знаешь, где остановиться?

3 голосов
/ 03 января 2009

Возможно, вы также захотите взглянуть на 4tH компилятор Ганса Беземера .

2 голосов
/ 03 января 2009

Какую реализацию Forth вы используете, которая не предоставляет эту информацию в документации? Учитывая природу Forth, это может зависеть от реализации. В словаре есть стандартный набор слов, но неважно, попали ли они туда сборкой / C / чем угодно или Forth, поскольку Forth по определению является саморасширяющимся языком.

1 голос
/ 19 января 2018

Вопреки тому, что вы говорите, обычно DROP SWAP и т. Д. Считаются основными операциями Forth. Причина в том, что если вы реализуете их, используя операции с памятью, как вы предлагаете, общая система становится более, а не менее сложной. Также нет четкого различия в Forth между тем, что является основным, а что нет. В 80-х годах поиск по словарю был бы базовым и кодировался на ассемблере для скорости, в то время как современный Linux-хостинг может позволить себе кодировать это на так называемом высоком уровне. Также Forthers обычно перекодируют слова ассемблера на высоком уровне и слова высокого уровня на ассемблере. Я автор ciforth и yourforth. Можно определить <= как "> не", как я сделал в ciforth. Но в дальнейшем я решил, что все <<=>> = как одинаковые, одинаково выглядящие маленькие подпрограммы на ассемблере были значительно проще. Это призыв к суждению и вопрос вкуса, конечно, не принципиальный.

В этом контексте я интерпретирую вопрос как: «Каков разумный размер для числа примитивных операций, чтобы достичь разумного мощного Форта с разумной скоростью?» Ясно, что вы не заинтересованы в хитрых уловках, позволяющих избавиться от одного слова на ассемблере за счет огромных накладных расходов, которые можно найти в некоторых темах, обсуждающих эту тему.

Теперь вы можете взглянуть на ряд маленьких Фортов, как на Джонсфорт, далее на четыре и заключить, что в основном один достигает примерно 50-100 примитивов. Эти форты определены в ассемблере. Если вы хотите определить свои примитивы в c, python или Java, ситуация снова другая. Теперь, например, При поиске по словарю у вас есть выбор между c и Forth. Соображения, которые не имеют ничего общего с языковым дизайном, вступают в игру. Вы можете быть плодовитым c-программистом или можете настаивать на его написании на Forth, потому что это учебный проект.

...