Необходимые ссылки для реализации интерпретатора в C/C++

36
задан Community 23 May 2017 в 12:17
поделиться

5 ответов

Короткий ответ:

фундаментальный список чтения для интерпретатора шепелявости является SICP. Я нисколько не назвал бы его излишеством, если Вы чувствуете, что Вы сверхпригодны для первых частей книжного перехода к главе 4 и начинаете интерпретировать далеко (хотя я чувствую, что это было бы потерей, так как главы 1-3 действительно настолько хороши!).

Добавляют LISP в Маленьких Частях (LISP с этого времени), главы 1-3. Особенно глава 3, если необходимо реализовать какие-либо нетривиальные формы управления.

См. это сообщение Jens Axel SГёgaard на минимальной Схеме самохостинга: http://www.scheme.dk/blog/2006/12/self-evaluating-evaluator.html .

А немного дольше отвечают:

трудно дать совет, не зная то, чего Вы требуете от своего интерпретатора.

  • это должен действительно действительно быть интерпретатор, или необходимо ли на самом деле быть в состоянии выполнить код шепелявости?
  • это должно быть быстро?
  • этому нужно соответствие стандартов? Общие Выступы? R5RS? R6RS? Какой-либо SFRIs Вам нужно?

, Если бы Вам нужно что-либо более необычное, чем простое синтаксическое дерево Уокер, я настоятельно рекомендовал бы встроить быструю подсистему схемы. Схема Gambit приходит на ум: http://dynamo.iro.umontreal.ca/~gambit/wiki/index.php/Main_Page .

, Если это не глава 5 опции в SICP и главы 5 - в целевой компиляции LISP для более быстрого выполнения.

Для более быстрой интерпретации я смотрел бы на новые интерпретаторы/компиляторы JavaScript. Кажется, существует длительное размышление, входящее в быстрое выполнение JavaScript, и можно, вероятно, учиться от них. V8 цитирует две важных бумаги: http://code.google.com/apis/v8/design.html и squirrelfish цитирует пару: http://webkit.org/blog/189/announcing-squirrelfish/ .

существуют также канонические газеты схемы: http://library.readscheme.org/page1.html для компилятора КРОЛИКА.

, Если я участвую в небольшом количестве преждевременного предположения, управление памятью могло бы быть жесткой гайкой для взламывания. Ноли M Речной островок опубликовали книгу "Схема 9 от вакуума" http://www.t3x.org/s9fes/ , который включает простую метку stop-world и сборщик "мусора" развертки. Источник включен.

John Rose (более новой известности JVM) написал работу на интегрирующейся Схеме к C: http://library.readscheme.org/servlets/cite.ss?pattern=AcmDL-Ros-92 .

12
ответ дан Joel Borggrén-Franck 27 November 2019 в 06:16
поделиться

Да на SICP.

я делал эту задачу несколько раз, и вот то, что я сделал бы на вашем месте:

Дизайн Ваша модель памяти сначала. Вы захотите систему GC некоторого вида. Это WAAAAY легче сделать это сначала, чем соединить болтом его на позже.

Дизайн Ваши структуры данных. В моих реализациях у меня было основное поле недостатков со многими базовыми типами: атом, строка, число, список, bool, примитивная функция.

Дизайн Ваш VM и убеждаться содержать API в чистоте. Моя последняя реализация имела это как API верхнего уровня (простите форматирование - ТАК pooching мой предварительный просмотр)

ConsBoxFactory &GetConsBoxFactory() { return mConsFactory; }
AtomFactory &GetAtomFactory() { return mAtomFactory; }
Environment &GetEnvironment() { return mEnvironment; }
t_ConsBox *Read(iostream &stm);
t_ConsBox *Eval(t_ConsBox *box);
void Print(basic_ostream<char> &stm, t_ConsBox *box);
void RunProgram(char *program);
void RunProgram(iostream &stm);

, RunProgram не необходим - это реализовано с точки зрения Чтения, Оценки и Печати. REPL является общим шаблоном для интерпретаторов, особенно LISP.

А ConsBoxFactory доступен, чтобы сделать новые поля недостатков и воздействовать на них. AtomFactory используется так, чтобы эквивалентные символьные атомы отобразились точно на один объект. Среда используется для поддержания привязки символов к полям недостатков.

большая часть Вашей работы должна войти в эти три шага. Тогда Вы найдете, что Ваш клиентский код и поддерживает код, начинает очень походить на LISP также:

t_ConsBox *ConsBoxFactory::Cadr(t_ConsBox *list)
{
    return Car(Cdr(list));
}

можно ли записать синтаксический анализатор в yacc/lex, но почему беспокойство? Lisp является невероятно простой грамматикой, и пара синтаксического анализатора сканера/рекурсивного спуска для него составляет приблизительно два часа работы. Худшая часть пишет предикаты для идентификации маркеров (т.е., IsString, IsNumber, IsQuotedExpr, и т.д.) и затем пишет стандартные программы для преобразования маркеров в поля недостатков.

Облегчают вписывать в связующее звено, и из C кодируют и облегчают отлаживать проблемы, когда вещи идут не так, как надо.

7
ответ дан plinth 27 November 2019 в 06:16
поделиться

Интерпретаторы Kamin из книги Samuel Kamin Языки программирования, Основанный на интерпретаторе Подход , переведенный в C++ Timothy Budd. Я не уверен, насколько полезный пустой исходный код будет, поскольку он был предназначен для движения с книгой, но это - прекрасная книга, которая касается основ реализации Lisp на языке низшего уровня, включая сборку "мусора", и т.д. (Это не фокус книги, которая является языками программирования в целом, но он покрыт.)

Lisp в Маленьких Частях входит в большую глубину, но это и хорошо и плохо для Вашего случая. Существует много материала по компиляции и таким образом, который не будет относиться к Вам, и его более простые интерпретаторы находятся в Схеме, не C++.

SICP хорош, определенно. Не излишество, но конечно запись интерпретаторов является только небольшой частью книги.

предложение JScheme является хорошим, также (и оно включает некоторый код мной), но не поможет Вам с вещами как GC.

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

Редактирование: Несколько человек сказали, что извлекли уроки из моего awklisp. Это - по общему признанию своего рода странное предложение, но это является очень маленьким, читаемым, на самом деле применимым, и в отличие от другой tiny-yet-readable игрушки Шепелявит, это реализует свой собственный сборщик "мусора" и представление данных вместо того, чтобы полагаться на базовый высокоуровневый язык реализации для обеспечения их.

5
ответ дан Darius Bacon 27 November 2019 в 06:16
поделиться

Выезд JScheme от Peter Norvig . Я нашел это удивительно простым понять и портировать на C++. Мм, не знайте об использовании схемы как язык сценариев, хотя - обучение это к jnrs является громоздким и чувствует себя датированным (helloooo 1980-е).

3
ответ дан CVertex 27 November 2019 в 06:16
поделиться

Я хотел бы расширить свою рекомендацию для Языки программирования: Приложение и Интерпретация . Если Вы хотите записать интерпретатор, та книга берет Вас там в очень коротком тракте. При прочтении записи кода, Вы читаете и выполнение осуществления, Вы заканчиваете с набором подобных интерпретаторов, но отличающийся (каждый нетерпелив, другой лениво, каждый является динамичным, другой имеет некоторый ввод, у каждого есть динамический контекст, другой имеет лексический контекст, и т.д.).

2
ответ дан pupeno 27 November 2019 в 06:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: