Вопрос

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

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

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

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

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

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top