1

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

然而,阅读 Tcl 的维基百科条目,听起来它也可以做到这一点?

我一直认为这是一个很好的功能,即使它可能不会被太多使用。谢谢。

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

4

3 回答 3

6

我很好奇哪些语言允许您在程序执行期间“构建”一个字符串,然后将其作为程序的一部分执行。

寻找支持eval,或者更一般地说,运行时元编程的语言。几乎每种语言都支持eval(甚至像 Haskell 这样的强静态类型语言)。许多为主要通过字节码解释实现的语言(例如类 Lisp 语言、Erlang 或 Java)构建的运行时支持在运行时插入新(字节)代码的能力。一旦你可以动态插入新代码,你就可以编写eval,或者做“猴子补丁”。

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

除了简单的单阶段eval,更一般地说,支持多阶段计算的语言允许生成从一个阶段到下一个阶段的程序,用于任意数量的阶段,从而可以安全、任意地嵌套evals.

引用 Taha 的话,他关于多阶段编程模型的论文介绍了大部分理论。

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

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

  • 延迟
  • 拼接

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

Lisp 和评估

  • McCarthy,John,LISP 的历史,SIGPLAN 不是。1978. -- 介绍eval

将 eval 推广到多阶段编程

关于多阶段编程:

  • Taha,多阶段编程:它的理论和应用
  • Nielson, Flemming and Nielson, Hanne Riis, 两级函数式语言——介绍了两级语言。
  • Taha、Walid 和 Sheard、Tim,带有显式注释的多阶段编程——支持所有运行时元编程技术的简单运算符。

为多阶段编程赋予类型

多阶段计算的正式描述非常棘手,并且涉及不寻常的技术(对于编程语言),如模态逻辑。

为元程序赋予类型:

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

安全问题

将多阶段编程的语义形式化的技巧解释了为什么它们经常使系统难以使用,以及为什么eval会引发如此多的安全问题:不清楚什么时候执行的代码,以及具体转换成什么数据代码。从一个阶段到下一个阶段的名称捕获是棘手的,这会导致代码注入攻击。这种复杂性无助于安全性。

于 2011-04-11T17:54:20.807 回答
3

绝对可以用许多解释性脚本语言来完成。有些语言是专门为此设计的。据我所知,它可以在以下方面完成:

  • Perl
  • PHP
  • Lisp(以及方言,如 CL、Clojure、Scheme 等)
  • JavaScript
于 2011-04-11T17:48:14.730 回答
3

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

话虽如此,这几乎不是一个漂亮的功能。考虑到滥用此功能是多么容易,我将其称为主要安全问题。如果你想要动态代码执行,那么编写你自己的、受限的、微解释器(或使用类似 Lua 的东西)几乎总是一个更好的主意。

于 2011-04-11T17:51:03.363 回答