这是一个难以理解的问题,我不确定它的正确用语是什么(如果有的话)。我很好奇什么语言允许你在程序执行期间“构建”一个字符串,然后作为程序的一部分执行它。我所知道的唯一一种语言就是Snobol。
阅读Tcl的维基百科条目,听起来它也可以这样做吗?
我一直认为这是一个很好的功能,即使它可能没用得多。感谢。
PS:会用Snobol,Spitbol标记这个,但是没有创建新标签的声誉。
答案 0 :(得分:5)
我很好奇什么语言允许你在程序执行期间“构建”一个字符串,然后作为程序的一部分执行它。
寻找支持eval
的语言,或者更常见的是运行时元编程。几乎每种语言都支持eval
(即使是强大的,静态类型的语言,如Haskell)。许多运行时构建用于主要通过字节码实现的语言
解释(如类似Lisp的语言,Erlang或Java)支持的能力
在运行时插入新的(字节)代码。一旦您可以动态插入新代码,您可以编写eval
或执行“猴子修补”。
即使在没有特定支持完整元编程甚至动态链接的语言实现中,通常也可以通过反射机制或代码生成支持库(如LLVM)在程序员控制下动态生成代码。
除了简单的单阶段eval
之外,更常见的是,支持多阶段计算的语言允许从一个阶段到下一阶段生成程序,适用于任意数量的阶段,可以安全地,任意地嵌套evals
。
引用Taha,thesis on multi-stage programming模型引入了大部分理论。
程序生成是一种强大而普遍的软件开发技术。它已被用于改进代码重用,产品可靠性和可维护性,性能和资源利用率以及开发人员生产力
您正在寻找的语言通常以某种形式提供三种原语:
用于延迟一个阶段的计算(例如将片段引用为字符串),将其拼接到正在运行的程序中,并执行该片段(在Lisp中,反引号,逗号和eval)。
Lisp和eval
eval
将eval推广到多阶段编程
关于多阶段编程:
为多阶段编程提供类型
多阶段计算的形式化描述非常棘手,涉及模态逻辑等非常规技术(用于编程语言)。
为元节目提供类型:
安全问题
形成多阶段编程语义的棘手问题解释了为什么它们经常使系统混乱,为什么eval
可以打开如此多的安全问题:不清楚什么代码执行时,并确切地将数据转换为代码。从一个阶段到另一个阶段获取名称是棘手的,导致代码注入攻击。这种复杂性无助于安全。
答案 1 :(得分:3)
绝对可以在很多解释的脚本语言中完成。有些语言是专门为此而设计的。据我所知,它可以在:
完成答案 2 :(得分:3)
它可以在所有Lisp方言中完成,其中此功能源自名称eval
,以及Prolog(call/1
)和任意数量的其他语言。大多数都保留名称eval
,大多数是动态语言。
话虽如此,这几乎不是漂亮的功能。我认为这是一个重大的安全问题,因为滥用此功能是多么容易。如果你想要动态代码执行,那么编写你自己的,受限制的微解释器(或使用像Lua这样的东西)几乎总是一个更好的主意。