生成字符串并在运行时将其作为程序执行

时间:2011-04-11 17:46:10

标签: programming-languages metaprogramming eval multistage snobol

这是一个难以理解的问题,我不确定它的正确用语是什么(如果有的话)。我很好奇什么语言允许你在程序执行期间“构建”一个字符串,然后作为程序的一部分执行它。我所知道的唯一一种语言就是Snobol。

阅读Tcl的维基百科条目,听起来它也可以这样做吗?

我一直认为这是一个很好的功能,即使它可能没用得多。感谢。

PS:会用Snobol,Spitbol标记这个,但是没有创建新标签的声誉。

3 个答案:

答案 0 :(得分:5)

  

我很好奇什么语言允许你在程序执行期间“构建”一个字符串,然后作为程序的一部分执行它。

寻找支持eval的语言,或者更常见的是运行时元编程。几乎每种语言都支持eval(即使是强大的,静态类型的语言,如Haskell)。许多运行时构建用于主要通过字节码实现的语言 解释(如类似Lisp的语言,Erlang或Java)支持的能力 在运行时插入新的(字节)代码。一旦您可以动态插入新代码,您可以编写eval或执行“猴子修补”。

即使在没有特定支持完整元编程甚至动态链接的语言实现中,通常也可以通过反射机制或代码生成支持库(如LLVM)在程序员控制下动态生成代码。

除了简单的单阶段eval之外,更常见的是,支持多阶段计算的语言允许从一个阶段到下一阶段生成程序,适用于任意数量的阶段,可以安全地,任意地嵌套evals

引用Taha,thesis on multi-stage programming模型引入了大部分理论。

  

程序生成是一种强大而普遍的软件开发技术。它已被用于改进代码重用,产品可靠性和可维护性,性能和资源利用率以及开发人员生产力

您正在寻找的语言通常以某种形式提供三种原语:

  • 延迟
  • 剪接
  • 运行

用于延迟一个阶段的计算(例如将片段引用为字符串),将其拼接到正在运行的程序中,并执行该片段(在Lisp中,反引号,逗号和eval)。

Lisp和eval

将eval推广到多阶段编程

关于多阶段编程:

  • Taha,Multi-Stage Programming: Its Theory and Applications
  • Nielson,Flemming和Nielson,Hanne Riis,两级函数语言, - 介绍了2级语言。
  • Taha,Walid和Sheard,Tim,带有显式注释的多阶段编程 - 支持所有运行时元编程技术的简单运算符。

为多阶段编程提供类型

多阶段计算的形式化描述非常棘手,涉及模态逻辑等非常规技术(用于编程语言)。

为元节目提供类型:

  • Wickline,Philip和Lee,Peter和Pfenning,Frank和Davies,Rowan,Modal类型作为运行时代码生成的暂存规范。

安全问题

形成多阶段编程语义的棘手问题解释了为什么它们经常使系统混乱,为什么eval可以打开如此多的安全问题:不清楚什么代码执行时,并确切地将数据转换为代码。从一个阶段到另一个阶段获取名称是棘手的,导致代码注入攻击。这种复杂性无助于安全。

答案 1 :(得分:3)

绝对可以在很多解释的脚本语言中完成。有些语言是专门为此而设计的。据我所知,它可以在:

完成
  • 的Perl
  • PHP
  • Lisp(和方言,如CL,Clojure,Scheme等)
  • 的JavaScript

答案 2 :(得分:3)

它可以在所有Lisp方言中完成,其中此功能源自名称eval,以及Prolog(call/1)和任意数量的其他语言。大多数都保留名称eval,大多数是动态语言

话虽如此,这几乎不是漂亮的功能。我认为这是一个重大的安全问题,因为滥用此功能是多么容易。如果你想要动态代码执行,那么编写你自己的,受限制的微解释器(或使用像Lua这样的东西)几乎总是一个更好的主意。