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

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

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

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

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

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

12 ответов


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

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

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


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

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

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


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

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


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


Logo-это простой Lisp-подобный язык без скобок и нескольких сотен реализаций.

информация о логотипе в Википедии.

см. этот PDF для получения информации о реализациях:логотип дерево.


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


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

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


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

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

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

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

также обратитесь к списку здесь: http://en.wikipedia.org/wiki/Continuation#Programming_language_support




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


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

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

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

оба были реализованы читаемым проектом Lisp s-expressions: http://readable.sourceforge.net/

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