2010-10-13 3 views
13

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

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

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

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

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

+5

-1 для того, чтобы сделать PHP-одинаковым;) Подсунуть его в почку. – ocodo

+1

Я не хочу делать PHP-подобный, я просто wanat, чтобы сделать что-то разумно знакомое людям, которые программируют на PHP. – sanity

ответ

10

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

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

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

14

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

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

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

+0

Я уже исключил извинения и вперед, к сожалению, по причинам, описанным в моем вопросе. – sanity

+2

Почему бы не сделать lisp с синтаксисом infix? это не очень сложно. – nickik

3

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

+0

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

+0

Да, я полагаю, это не полностью отвечает на вопрос, когда вы считаете, что «пытаетесь разработать язык для людей» фактически использовать «часть») –

+0

@sanity, это не так. Он разработан, чтобы обеспечить максимально возможный компилятор для языка программирования Turing. – 2011-10-19 21:54:18

2

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

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

+0

Я уже исключил Lisp по причинам, объясняемым в моем вопросе. – sanity

+2

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

+0

Как вы думаете, может быть, у Пола Грэма может быть что-то общее с LISPers, собирающимся вокруг YCombinator? = P –

2

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

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

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

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

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

0

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

8

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

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

+1

Я хочу ответить +1 TCL, но написать полный переводчик TCL на самом деле не все так просто. Вы можете получить скромное ядро ​​языка довольно просто, но TCL содержит много подъязыков, например, команду expr, которую вы упоминаете. любая реальная программа должна поддерживать expr, потому что она появляется в команде if, поэтому вам действительно нужно реализовать C-подобный язык поверх оболочки, как язык, который является TCL endekalog. – SingleNegationElimination

+0

Ну, он сказал «или хотя бы рисовать» вдохновение от ", а совместимость с Tcl не была жестким требованием. Кроме того, поскольку 'expr' выглядит почти так же, как и любой другой proc, он не должен быть полностью реализован сразу, как на большинстве (более сложных) языках. Я думаю, вы могли бы даже написать его в Tcl и поделиться им между двумя переводчиками, которые ему нужно написать! – Ken

+0

@Token: Я также добавлю, что эти подъязыки специфичны для соответствующих команд. Реализация парсера/интерпретатора для языка проста. Реализация всех основных команд ... меньше. Хотя, если вы посмотрите на wiki, вы можете, вероятно, найти реализации многих команд, используя другие, более простые команды. – RHSeeger

4

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

Logo information on Wikipedia.

См. Этот PDF-файл для получения информации о реализации: Logo tree.

0

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

  • завитых-инфикс добавляет инфикс , читая {a + b} как (+ ab) и поддерживая традиционные функциональные обозначения, такие как f (x). См. Больше в SRFI-105.

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

Оба были реализованы читаемым лисповских S-выражений проекта: http://readable.sourceforge.net/

Enjoy!

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