Построение простого интерпретатора - PullRequest
9 голосов
/ 02 ноября 2008

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

Переводчик должен поддерживать базовые функции языков программирования:

  • Действительные числа, переменные, многомерные массивы
  • Двоичные (+, -, *, /,%) и логические (==,! =, <,>, <=,> =) Операции
  • Loops (for, while), Условные выражения (if)
  • Функции

MathWorks MatLab является хорошим примером того, куда я направляюсь, просто намного проще. Интерпретатор будет использоваться в качестве среды для демонстрации алгоритмов; простые алгоритмы, такие как нахождение среднего значения набора данных / массива, или немного более сложные алгоритмы, такие как исключение Гаусса или RSA .

Лучший / наиболее практичный ресурс, который я нашел по этому вопросу, - это запись Рона Айюба о проекте кода ( Анализ алгебраических выражений с использованием шаблона интерпретатора ) - прекрасный пример минимизированной версии моей проблемы.

Книга Пурпурного Дракона кажется слишком большой, что-нибудь более практичное?

Интерпретатор будет реализован в виде библиотеки .NET с использованием C #. Тем не менее, ресурсы для любой платформы приветствуются, так как часть этой проблемы является частью архитектуры и дизайна.

Какие-нибудь практические ресурсы?

(пожалуйста, избегайте ответов "это не тривиально" или "зачем изобретать велосипед")

Ответы [ 9 ]

10 голосов
/ 02 ноября 2008

Я бы написал это в ANTLR . Напишите грамматику, пусть ANTLR генерирует синтаксический анализатор C #. Вы можете запросить ANTLR для дерева разбора, и, возможно, интерпретатор уже может работать с деревом разбора. Возможно, вам придется преобразовать дерево разбора в какое-то более абстрактное внутреннее представление (хотя ANTLR уже позволяет исключить ненужную пунктуацию при создании дерева).

2 голосов
/ 12 декабря 2008

Lua был разработан как расширяемый интерпретатор для использования непрограммистами. (Первыми пользователями были бразильские геологи-нефтяники, хотя с тех пор база пользователей значительно расширилась .) Вы можете взять Lua и легко добавить свои научные алгоритмы, визуализации, что у вас есть. Он великолепно спроектирован, и вы можете выполнить поставленную задачу.

Конечно, если то, что вы действительно хотите, это удовольствие от создания собственного, тогда другой совет разумен.

2 голосов
/ 04 ноября 2008

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

Создайте свой собственный язык поверх DLR

2 голосов
/ 04 ноября 2008

Один из способов сделать это - изучить исходный код существующего интерпретатора. Я написал интерпретатор javascript на языке программирования D, вы можете скачать исходный код с http://ftp.digitalmars.com/dmdscript.zip

Вальтер Брайт, Цифровой Марс

2 голосов
/ 02 ноября 2008

Может показаться странным, но Game Scripting Mastery - отличный ресурс для изучения синтаксического анализа, компиляции и интерпретации кода.

Вы должны действительно проверить это:

http://www.amazon.com/Scripting-Mastery-Premier-Press-Development/dp/1931841578

1 голос
/ 04 ноября 2008

Рассматривали ли вы использовать IronPython ? Его легко использовать из .NET, и он отвечает всем вашим требованиям. Я понимаю, что python довольно популярен для научного программирования, поэтому, возможно, ваши пользователи уже знакомы с ним.

0 голосов
/ 29 мая 2019

Библиотека Silk была только что опубликована на GitHub. Похоже, делать большую часть того, что вы просите. Он очень прост в использовании. Просто зарегистрируйте функции, которые вы хотите быть доступными, напишите свой скрипт, скомпилируйте его в байт-код и выполните его.

0 голосов
/ 18 мая 2017

Я удивлен, что никто еще не упомянул xtext . Он доступен как Eclipse плагин и IntelliJ плагин . Он предоставляет не только синтаксический анализатор, такой как ANTLR, но и весь конвейер (включая анализатор, компоновщик, средство проверки типов, компилятор), необходимый для DSL. Вы можете проверить его исходный код на Github, чтобы понять, как работает интерпретатор / компилятор.

0 голосов
/ 26 мая 2012

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

Я собираюсь вмешаться в эту часть вашего вопроса. Простой язык - это не то, что вы действительно хотите передать разработчикам, не занимающимся программным обеспечением. Ускоренные языки требуют больше усилий программиста. Что вам действительно нужно, так это хорошо спроектированный и хорошо реализованный предметно-ориентированный язык (DSL).

В этом смысле я подкреплю то, что Норман Рэмси рекомендует с Луа. Он имеет отличную репутацию в качестве основы для высококачественных DSL. Хорошо документированный и полезный DSL требует времени и усилий, но в долгосрочной перспективе сэкономит время, когда специалисты по предметной области смогут быстро освоиться и потребовать минимальной поддержки.

...