6

可以执行自己的代码(作为字符串文字传递)的编程语言叫什么?我脑海中的设置与此类似(暂时忘记输入代码、结果等):

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

run关键字在哪里。那是一种反射式编程语言吗?

4

7 回答 7

3

你能想到的最好的就是你所要求的就是“有一个评估功能”(正如哈维尔在他对你的问题的评论中提到的那样)。

自托管不是必需的,也不一定能满足您的需求。两个例子是:C 是一种自托管语言,它不能在字符串中执行它自己的代码,但 Tcl 不是一种自托管语言,它可以执行它自己在字符串中给出的代码。

  • 附带说明一下,C 有一半时间在没有 API 来执行外部进程的环境中运行。因此,虽然在某些环境中您可以配置您的系统以使 C 能够执行其自己的编译器,然后执行其自己的代码,但通常这并不是您真正想要的。

  • 旁注。如果我们可以作弊并使用“执行外部编译器”路线来做到这一点,那么语言不需要自托管来做你想做的事。它只需要一个 exec 函数来调用它自己的编译器(通常用 C 编写)。

与反射/自省相同,能够自己进行自省并不意味着您可以在字符串中执行代码。具有反射但没有内置 eval 的语言的两个示例是 C# 和 Java。

  • 附带说明一下,一旦你有一个 eval 函数,你通常可以进行反射/内省,尽管方式很笨拙。

自我解释与自我托管的定义相同。Tcl 是一种语言,它的 eval 函数不是自己编写的——它只是公开了用 C 实现的 Tcl 代码评估器。

乍一看,元循环评估器看起来像你想要的。它被定义为自我解释,其中 eval 函数是内置的,而不是在语言本身中实现的。但进一步看,您会注意到它是由用于实现该功能的机制定义的,而不是由功能本身定义的。Tcl 又是一个例外,它不满足元循环评估器的所有定义,但仍然具有 eval 函数(不适用,没有必要)。因此,在我看来,元循环评估器是“具有评估功能”功能的特定实现。

因此,我只想说任何“具有 eval 功能”的语言都可以满足您的要求。

于 2010-03-06T01:36:20.860 回答
2

您询问的语言类别相当于“自托管”语言。自托管语言是一种语言,其中存在以相同语言实现的编译器或解释器。

这是一个证明。

每种自托管语言都能够运行自己的程序。例如,如果您将 C 代码传递给 C 程序,则该程序可以包含一个编译器(用 C 编写)来编译和运行代码。这样一个 C 程序就可以执行任意的 C 代码。

现在假设您有一种语言 X,它具有这样的属性,它能够以该语言运行任意代码,该代码作为字符串传递。然后,您可以创建一个程序,该程序仅将字符串作为输入并执行其中的代码。这将是在 X 中实现的 X 语言的解释器。这是自托管语言的定义。

这是这个解释器的样子:

execute ARGV[0]

因此,我们证明了每种具有所需属性的语言都是自托管的,并且每种自托管语言都具有此属性。这意味着您请求的类等于自托管语言的类。

于 2010-03-06T00:43:11.297 回答
1

自托管可能。我知道 Lisp 就是这样一种语言,维基百科称它为自托管编译器。

于 2010-03-05T23:42:42.330 回答
1

我认为您在谈论Meta-circular evaluators。您的run命令是eval -apply 循环中的eval ,如计算机程序的结构和实现中所述。

于 2010-03-05T23:45:13.323 回答
1

Homoiconicity是一个相关的概念,但我认为这也不是您正在寻找的。

在计算机编程中,同音性是某些编程语言的一种属性,其中程序的主要表示也是语言本身原始类型的数据结构,从同义同义图标表示表示。这使得元编程比没有这个属性的语言更容易。

于 2010-03-05T23:50:11.017 回答
0

自我解释和自我托管?请参阅http://en.wikipedia.org/wiki/Self-interpreterhttp://en.wikipedia.org/wiki/Self-hosting

于 2010-03-05T23:37:22.390 回答
0

是的,我一直认为这是反射所包含的。

于 2010-03-05T23:49:26.537 回答