Имя класса языков программирования, которые выполняют свой собственный код - PullRequest
6 голосов
/ 06 марта 2010

Что вы называете языком программирования, который может выполнять свой собственный код (передаваемый как строковый литерал)? У меня в голове что-то вроде этого (на мгновение забыв набрать код, результаты и т. Д.):

string eight = "5+3"
int result = run(eight)

Где run - ключевое слово. Это рефлексивный язык программирования?

Ответы [ 7 ]

3 голосов
/ 06 марта 2010

Лучшее, что вы можете придумать, это именно то, о чем вы просите, - «имеет функцию оценки» (как упомянул Хавьер в своем комментарии к вашему вопросу).

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

  • В качестве примечания, половина C работает в средах, где нет API для выполнения внешних процессов. Таким образом, хотя в некоторых средах вы можете настроить свою систему так, чтобы C мог выполнять свой собственный компилятор, а затем выполнять собственный код в целом, это не совсем то, о чем вы просите.

  • Примечание. Если мы можем обмануть и использовать маршрут «выполнить внешний компилятор», чтобы сделать это, то язык не обязательно должен быть хостингом, чтобы делать то, что вы хотите. Ему просто нужна функция exec для вызова собственного компилятора (который часто пишется на C).

То же самое с Reflection / Introspection, способность делать самоанализ сама по себе не означает, что вы можете выполнять код в строке. Два примера языков, в которых есть Reflection, но нет встроенного eval, - это C # и Java.

  • Как примечание: если у вас есть функция eval, вы обычно можете выполнять Reflection / Introspection, хотя и неуклюже.

У самоинтерпретации та же проблема с определением, что и у хостинга. Tcl - это язык, в котором его функция eval не написана сама по себе - он просто представляет оценщик кода Tcl, реализованный в C.

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

Итак, я бы просто сказал, что любой язык, который "имеет функцию eval", может делать то, что вы просите.

2 голосов
/ 06 марта 2010

Класс языков, о которых вы спрашиваете, эквивалентен языкам " self-hosting ".Самостоятельный язык - это тот, для которого существует реализация компилятора или интерпретатора на одном и том же языке.

Вот доказательство.

Каждый язык собственного размещения способен запускать свой язык.собственные программы.Если вы передаете, например, код C в программу C, эта программа может включать в себя компилятор (написанный на C), который компилирует и запускает код.Таким образом, C-программа выполняет произвольный C-код.

Предположим, что теперь у вас есть язык X с таким свойством, что он способен выполнять произвольный код на этом языке, код передается в виде строки.Затем вы можете создать программу, которая просто принимает строку в качестве входных данных и выполняет код внутри нее.Это будет интерпретатор для языка X, реализованного в X. И это определение языка собственного хостинга.

Вот как будет выглядеть этот интерпретатор:

execute ARGV[0]

Итак,мы доказали, что каждый язык с желаемым свойством является хостингом, и каждый язык хостинга имеет это свойство.Это означает, что запрошенный вами класс совпадает с классом автономных языков.

1 голос
/ 06 марта 2010

Homoiconicity является связанной концепцией, но я не думаю, что это именно то, что вы ищете.

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

1 голос
/ 06 марта 2010

Я думаю, вы говорите о Метакруговых оценщиках . Ваша команда run - это eval в цикле eval-apply , описанном в разделе «Структура и реализация компьютерных программ».

1 голос
/ 06 марта 2010

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

0 голосов
/ 06 марта 2010

Да, я всегда думал, что это заключено в Отражение .

0 голосов
/ 06 марта 2010

самоинтерпретация и самодостаточность? См http://en.wikipedia.org/wiki/Self-interpreter, http://en.wikipedia.org/wiki/Self-hosting.

...