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

jpa*_*ich 1 programming-languages eval metaprogramming multistage snobol

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

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

我一直认为这是一个很好的功能,即使它可能没有太多使用.谢谢.

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

Don*_*art 5

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

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

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

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

引用Taha,谁的多阶段编程模型论文引入了大部分理论.

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

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

  • 延迟
  • 拼接

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

Lisp和eval

  • 麦卡锡,约翰,LISP的历史,SIGPLAN没有.1978年 - 介绍eval

将eval推广到多阶段编程

关于多阶段编程:

  • Taha,多阶段规划:理论与应用
  • Nielson,Flemming和Nielson,Hanne Riis,两级函数语言, - 引入了2级语言.
  • Taha,Walid和Sheard,Tim,带有显式注释的多阶段编程 - 支持所有运行时元编程技术的简单运算符.

为多阶段编程提供类型

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

为元节目提供类型:

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

安全问题

形成多阶段编程语义的棘手问题解释了为什么它们经常混淆系统使用,以及为什么eval会出现如此多的安全问题:不清楚什么时候执行代码,以及究竟是什么数据被转换成码.从一个阶段到另一个阶段获取名称是棘手的,导致代码注入攻击.这种复杂性无助于安全性.