2009-12-18 2 views
14

Я решил написать небольшой интерпретатор в качестве своего следующего проекта в Ruby. Какие знания и навыки мне понадобится, чтобы быть успешными?
Я еще не определился с языком, который нужно интерпретировать, но я ищу что-то, что не является игрушечным языком, но было бы относительно легко написать переводчика. Спасибо заранее.Как написать переводчика?

+0

huh? Если вы не определились с языком, как вы узнаете? Некоторые могут быть очень просто интерпретировать, даже используя библиотеки ... –

+0

Я думаю, что гораздо проще написать интерпретатор Ruby в Lisp, чем наоборот. – Svante

+0

Сванте, я не уверен в этом. –

ответ

29

Вы должны научиться, как минимум:

  • лексический анализ (группировка символов в лексемы)
  • разборе (группировка лексем вместе в структуру)
  • абстрактные синтаксические деревья (представляющие структуру программы в данных структура)
  • представление данных (при условии, что ваш язык будет иметь переменные)
  • контрольный цикл, который «запускает» вашу программу

Отличное введение в некоторые из этих тем можно найти в вводном тексте Structure and Interpretation of Computer Programs. Язык, используемый в этой книге, - это схема, которая является надежным, хорошо определенным языком, который идеально подходит для вашей первой реализации интерпретатора. Настоятельно рекомендуется.

+0

Спасибо за отличный ответ. Просто любопытно, как долго, по вашему мнению, потребуется сделать простой рабочий интерпретатор? – bennybdbc

+2

Ответ на этот вопрос зависит от многих факторов, наиболее важными из которых являются: (а) уровень опыта человека, выполняющего реализацию, и (б) выбор языка для интерпретации. Также возможно (c) выбор языка реализации. Как общая приблизительная предпосылка, для среднего программиста, изучающего методы, я могу сказать пару недель посвященной работе. –

1

Это не так сложно. вот LISP interpreter in ruby, и источник настолько мал, что вы должны его скопировать/вставить. но вы собираетесь изучить LISP сейчас? хе-хе.

5

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

Попробуйте какой-нибудь диалект Лиспа, например, Схему или Clojure. (Теперь есть идея: Clojure-in-Ruby, которая интегрируется с Ruby, а Clojure - с Java.)

С Lisp нет необходимости беспокоиться о синтаксисе, поскольку синтаксис Lisp намного ближе к абстрактное синтаксическое дерево.

+1

Clorure звучит как язык Scooby Doo копается. – FMc

+0

Это было сделано http://www.springerlink.com/content/q3n77q7172831288/ и http://onestepback.org/index.cgi/Tech/Ruby/LispInRuby.red –

2

This SICP chapter показывает, как написать интерпретатор Lisp в Lisp (метациркулярный оценщик). По-моему, это лучшее место для начала. Затем вы можете перейти к Lisp in Small Pieces, чтобы узнать, как писать сложные интерпретаторы и компиляторы для Lisp. Преимущество реализации языка, такого как Lisp (в самом Lisp!), Заключается в том, что вы бесплатно получаете лексический анализатор, парсер, AST, представление данных/программ и REPL. Вы можете сосредоточиться на задаче заставить ваш отличный язык работать!

2

У меня была подобная идея пару дней назад. LISP на сегодняшний день проще всего реализовать, поскольку синтаксис настолько прост, и структуры данных, которыми манипулирует язык, являются теми же структурами, в которых написан код. Следовательно, вам нужна только минимальная реализация и может определять остальное в терминах сам.

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

Если вы хотите проверить мой (буквально два дня) реализацию Java lisp, проверьте mylisp.googlecode.com. Я все еще работаю над этим, но невероятно, как быстро прошло время, чтобы заставить работать существующие вещи.

1

Если вы просто делаете это для удовольствия, сделать свой собственный, простой язык и просто попробовать. Моя рекомендация будет похожа на действительно простой классический BASIC (без визуального базового или объектно-ориентированного). С номерами строк, GOTO, INPUT и PRINT, и все. Вы можете делать основы, и вы лучше понимаете, как все работает.

Знания, в которых вы нуждаетесь?

  • Tokenizing (точение, что огромный кусок символов в нечто более эффективно читаемых, эффективно расщепляя его на «слова»)
  • Синтаксических (переходящие на лексемы и построение структуры данных из него)
  • переводческих (зацикливание структуры данных и выполнение каждой команды)

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

1

Это не реализовано в Лиспе, но я нашел Write Yourself A Scheme in 48 Hours быть очень полезный документ, в то время как я начинал с Haskell (хотя я не получил какой-либо отделки его после 48 часов; YMMV). Это также дает вам много понимания устных переводчиков в целом.

Смежные вопросы