Подтвердить что ты не робот

Каковы примитивные форт-операторы?

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

Давным-давно, у меня была книга под названием "Threaded Interpretive Languages", опубликованная, по моему мнению, Byte, в которой обсуждалось, как реализовать фортоподобный язык (я не думаю, что они когда-либо называли его Forth) в сборке Z80.

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

Ответ 3

Этот пост в comp.lang.forth перечисляет несколько "минимальных Forths".

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

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

Ответ 4

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

Ответ 6

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

Ответ 7

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

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

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

Ответ 8

  1. Один из моих любимых - Фрэнк Сержант, четвертый инструктаж MSDOS Pygmy Forth. Я полагаю, что он использует привязанный Forth, более полно функционирующий на ПК, последовательный канал связи с целью, а также поиск, просмотр, выполнение (базовая терминология языка) цели, то есть чтение, запись и запуск.

  2. Если вы хотите получить самый современный, технически продвинутый ответ, взгляните на 5-битную (32) инструкцию, изложенную (стр. 5 в PDF, рис. 3) в 144-ядерном процессоре, разработанном Чарльзом Муром. отец Форта. По сути, мистер Мур дал нам Forth, позволил нам сделать Fork из того, что у него было тогда, но он продолжал оптимизировать его до конца своей жизни до сих пор, в конечном итоге выкристаллизовав его до уровня процессора (также делая чип VLSI CAD инструмент для разработки собственных чипов, также спроектированный снизу вверх в его собственном ColorForth. Это не язык низкого уровня или язык высокого уровня - это язык всевозможного уровня!)

  3. Язык факторного программирования, который я считаю очень похожим, имеет в своей основе виртуальную машину, написанную на языке C (или c++)

  4. Наконец, существует общедоступный домен Forth под названием pForth, ядро которого написано на C.