您认为可以执行自己的代码的编程语言(作为字符串文字传递)是什么?我心中的设置类似于此(忘记片刻输入代码,结果等):
string eight = "5+3"
int result = run(eight)
run
是关键字。这是一种反思性的编程语言吗?
答案 0 :(得分:3)
你能想到的最好的就是你要求的是“有一个评估函数”(正如Javier在你对你的问题的评论中提到的那样)。
自托管不是必需的,也不一定能做你想要的。两个例子是:C是一种自托管语言,不能在字符串中执行自己的代码,但Tcl不是可以执行字符串中给出的自己代码的自托管语言。
作为旁注,C的一半时间在没有API执行外部进程的环境中运行。因此,在某些环境中,您可以配置系统以使C能够执行自己的编译器,然后执行自己的代码,这通常不是您要求的。
侧面说明。如果我们可以欺骗并使用“执行外部编译器”路由来执行此操作,那么语言不需要自托管来执行您想要的操作。它只需要一个exec函数来调用它自己的编译器(通常用C语言编写)。
与Reflection / Introspection相同,能够自我反省并不意味着你可以在字符串中执行代码。有两个反射但没有内置eval的语言示例是C#和Java。
自我解释与自托管的定义存在同样的问题。 Tcl是一种其eval函数本身不编写的语言 - 它只是暴露了用C实现的Tcl代码赋值器。
乍一看,元循环评估员看起来就像你想要的那样。它被定义为自解释,其中eval函数是内置的,而不是在语言本身中实现。但是进一步观察你会发现它是由用于实现该功能的机制而不是功能本身定义的。 Tcl再次成为一个例外,它不符合元循环评估器的所有定义,但仍具有eval函数(不适用,不必要)。因此,在我看来,元循环评估器是“具有评估函数”功能的特定实现。
所以,我只想说任何“具有评估功能”的语言都可以满足您的要求。
答案 1 :(得分:2)
您询问的语言类别相当于“self-hosting”语言。自托管语言是一种语言,其中存在相同语言的编译器或解释器的实现。
这是一个证明。
每种自托管语言都能够运行自己的程序。例如,如果将C代码传递给C程序,该程序可以包含编译和运行代码的编译器(用C编写)。这样C程序就可以执行任意C代码。
现在假设你有一个具有这样一个属性的语言X,它能够以该语言运行任意代码,代码作为字符串传递。然后,您可以创建一个程序,只需将字符串作为输入并执行其中的代码。这将是X中实现的X语言的解释器。这是自托管语言的定义。
这是这个解释器的样子:
execute ARGV[0]
因此,我们已经证明每种具有所需属性的语言都是自托管的,并且每种自托管语言都具有此属性。这意味着您请求的课程等于自托管语言的类别。
答案 2 :(得分:1)
Self-hosting。我知道Lisp就是这样一种语言,维基百科称它为自托管编译器。
答案 3 :(得分:1)
我认为你在谈论Meta-circular evaluators。您的run
命令是eval中的eval-apply cycle,在计算机程序的结构和实现中有所描述。
答案 4 :(得分:1)
Homoiconicity是一个相关概念,但我认为这也不是你想要的。
在计算机编程中, homoiconicity 是某些编程语言的属性,其中程序的主要表示形式也是语言本身的原始类型的数据结构,来自 homo < / em>意为相同的和图标意味着表示。这使得元编程比没有这种属性的语言更容易。
答案 5 :(得分:0)
自我解释和自我托管?请参阅http://en.wikipedia.org/wiki/Self-interpreter,http://en.wikipedia.org/wiki/Self-hosting。
答案 6 :(得分:0)
是的,我一直认为这是Reflection所包含的。