“在程序运行时”编辑程序?如何?

2022-09-03 05:08:10

这个问题是一个推论:在程序“运行时”编辑程序?为什么?

我最近才接触到Clojure的世界,并且对我看到的实时编码”的几个例子着迷。上面链接的问题讨论了“为什么”。

我的问题是:这种实时编码技术是如何实现的?这是clojure语言的特征,使它成为可能吗?或者这只是他们应用的一种模式,可以应用于任何语言?我有python和java的背景。有没有可能用这两种语言中的任何一种来“实时编码”,就像在clojure中一样?


答案 1

一些语言实现在很长一段时间内都有,特别是许多Lisp变体和Smalltalk。

Lisp 具有作为数据结构的标识符,称为符号。可以重新分配这些符号,并在运行时查找它们。此原则称为后期绑定。符号命名函数和变量。

此外,Lisp实现要么在运行时有一个解释器,要么有一个编译器。接口是函数和 。另外还有一个函数,它允许加载源代码和编译代码。EVALCOMPILELOAD

接下来,像Common Lisp这样的语言有一个对象系统,它允许对类层次结构,类本身进行更改,可以添加/更新/删除方法并将这些更改传播到已经存在的对象。因此,面向对象的软件和代码可以自行更新。使用元对象协议,甚至可以在运行时重新编程对象系统。

同样重要的是,Lisp实现可以对已删除的代码进行垃圾回收。这样,正在运行的 Lisp 就不会仅仅因为代码被替换而增加运行时大小。

Lisp通常还有一个错误系统,可以从错误中恢复,并允许从调试器中替换有缺陷的代码。


答案 2

JRebel是Java的一个解决方案。以下是他们常见问题解答中的简短段落:

JRebel 主要在类装入器级别与 JVM 和应用程序服务器集成。它不会创建任何新的类装入器,而是扩展现有类装入器,使其能够管理重新装入的类。