Какие языки программирования имеют наиболее легко реализуемые интерпретаторы?

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

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

Моя первая мысль была Forth или рудиментарным Lisp -подобным языком, однако я бы предпочел, чтобы язык имел синтаксис ближе к более популярным языкам программирования, таким как Java, Python или Ruby. В частности, это означает поддержку инфиксных операторов (a + b), а также a = b присваивание переменных.

Другими словами, мне хотелось бы, чтобы этот язык был достаточно хорошо знаком людям, которые сегодня программируют на PHP, и я не считаю, что Forth или Lisp соответствуют этим критериям.

Кто-нибудь может предложить какие-либо предложения для такого языка?

Ответы

Ответ 1

Это звучит как работа для Lua.

  • Это небольшой язык, разработанный для простого внедрения
  • В Java уже есть несколько implementations и, по крайней мере, выполняется Javascript.
  • Его синтаксис соответствует вашим требованиям (назначения, операторы infix).

Работа, которую вы должны были оставить, - реализовать разграниченные продолжения, но вы знали, что уже когда вы исключили Lisp/Scheme.

Ответ 2

Я думаю, что Lisp и Forth имеют одни из самых простых наивных переводчиков.

Вы можете выбрать простой динамический язык, и самая сложная часть будет заключаться в создании парсера. Например, подмножество JavaScript может работать. Интерпретатор в основном пересекает AST и выполняет операции каждого node.

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

Ответ 3

Tcl. Синтаксис примерно так же прост, как Lisp, и он имеет expr proc для арифметики infix. Он даже использует {} для блоков, поэтому, если вы правильно прищурились, вы можете сказать людям, что это C-подобный язык.

У него нет привязки infix a=b, но как только вы начинаете идти по пути общей нотации infix, языки становятся действительно сложными очень быстро, поэтому я не уверен, насколько это совместимо с вашими другими требованиями.

Ответ 4

Smalltalk и Io обе имеют удивительно простые, но выразительные синтаксисы.

Ответ 6

Brainfuck? Я имею в виду, что у него всего 8 команд, каждая из которых соответствует одному символу.

Ответ 7

Сначала создайте интерпретатор LISP, это будет относительно просто.

Вы получите большой опыт в анализе языка, не мешая дополнительным требованиям к функциям.

Ответ 8

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

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

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

Вы также можете рассмотреть, соответствует ли сам javascript (или подмножество) вашим требованиям.

Также см. список здесь: http://en.wikipedia.org/wiki/Continuation#Programming_language_support

Ответ 9

PCF

Ответ 11

Я рекомендую вам начать с подмножества lisp - в основном автомобиль, cdr, cons и quote. Убедитесь, что у вас есть базовый сканер, который обрабатывает недопустимые символы, а затем недопустимые типы (например, cons требует 2 аргумента, второй должен быть списком). Вы можете сделать это с учетом основных структур данных (только связанные списки могут сделать это, но двунаправленные или круговые намного лучше).

Ответ 12

Вы можете использовать подмножество Lisp и все еще иметь более естественную нотацию, если вы используете сладко-выраженные выражения или, по крайней мере, в виде вставки курсора:

  • Curly-infix добавляет infix, читая {a + b} как (+ a b) и поддерживает традиционную функциональную нотацию, такую ​​как f (x). Подробнее см. В SRFI-105.

  • Сладкие выражения основываются на curly-infix и добавляют синтаксически-важный отступ. Подробнее см. Здесь в SRFI-110. Его URL-адрес http://srfi.schemers.org/srfi-110/ (для SRFI-105 просто замените "110" на "105" ).

Оба были реализованы с помощью Readable Lisp S-expressions Project: http://readable.sourceforge.net/

Наслаждайтесь!