【问题标题】:Generating strings and executing them as programs during runtime在运行时生成字符串并作为程序执行
【发布时间】:2011-04-11 17:46:10
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: programming-languages metaprogramming eval multistage snobol


    【解决方案1】:

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

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

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

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

    引用 Taha 的话,thesis on multi-stage programming 模特介绍了大部分理论。

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

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

    • 延迟
    • 拼接
    • 运行

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

    Lisp 和评估

    • 麦卡锡,约翰,History of LISP,SIGPLAN 不是。 1978. -- 介绍eval

    将评估推广到多阶段编程

    关于多阶段编程:

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

    为多阶段编程赋予类型

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

    为元程序赋予类型:

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

    安全问题

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

    【讨论】:

    • 我完全无语了,这个答案是惊人的,让我有很多需要调查的地方。虽然几年前我涉足 Lisp,但也许是时候重新打开这些书了。非常感谢唐,你已经超越了。
    【解决方案2】:

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

    • Perl
    • PHP
    • Lisp(以及方言,如 CL、Clojure、Scheme 等)
    • JavaScript

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-26
        • 2016-04-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-20
        • 1970-01-01
        相关资源
        最近更新 更多