Название класса языков программирования, которые выполняют его собственный код

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

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

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

6
задан Dan 5 March 2010 в 23:49
поделиться

7 ответов

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

1
ответ дан 16 December 2019 в 21:38
поделиться

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

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

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

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

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

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

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

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

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

3
ответ дан 16 December 2019 в 21:38
поделиться

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

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

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

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

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

execute ARGV[0]

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

2
ответ дан 16 December 2019 в 21:38
поделиться

Гомоиконичность - родственная концепция, но я не думаю, что это именно то, что вы ищете.

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

1
ответ дан 16 December 2019 в 21:38
поделиться

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

1
ответ дан 16 December 2019 в 21:38
поделиться

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

0
ответ дан 16 December 2019 в 21:38
поделиться

Самоинтерпретирующийся и саморазмещающийся? See http://en.wikipedia.org/wiki/Self-interpreter, http://en.wikipedia.org/wiki/Self-hosting.

0
ответ дан 16 December 2019 в 21:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: