3

我有一个即将到来的项目,其中一个核心要求是改变方法在运行时的工作方式。请注意,我不是在谈论更高级别的 OO 概念,例如“一种方法与另一种方法的影子”,尽管实际效果是相似的。

我追求的关键属性是:

  • 我必须能够修改方法,以便添加新表达式、删除现有表达式或修改其中发生的任何表达式。

  • 修改方法后,对该方法的后续调用将调用新的操作序列。(或者,如果语言绑定方法而不是每次都评估,请为我提供一种取消绑定/重新绑定新方法的方法。)

  • 理想情况下,我想操作语言的原子单元(例如,“foo在对象上调用方法bar”)而不是直接操作程序集(例如“将这三个参数弹出到堆栈上”)。换句话说,我希望能够高度确信我构造的操作在语言中具有语义意义。但我会拿走我能得到的。

如果您不确定候选语言是否符合这些标准,这里有一个简单的试金石:

你能写另一种方法吗clean

  • 接受一个方法m作为输入

  • 返回另一个m2执行相同操作的方法m

  • 是否m2与 相同m,但不包含对您的语言中的 print-to-standard-out 方法的任何调用(puts、System.Console.WriteLn、println 等)?

我现在想做一些初步研究,找出最强的候选人是什么。拥有一个庞大而活跃的社区对我来说与实现我想做的事情的实用性一样重要。我知道这里可能有一些未伪造的领域,因为直接操作字节码通常不是需要公开的操作。

我有哪些选择?如果可能,您能否提供一个使用您推荐的一种或多种语言的玩具示例,或者指向我最近的一个示例?


更新:我这样做的原因是我想编写一个能够在运行时修改自身以响应新信息的程序。这种修改超越了单纯的参数或可配置数据,而是全面的、进化的行为变化。(不,我不是在写病毒。;))

4

5 回答 5

1

好吧,您总是可以使用 .NET 和表达式库来构建表达式。我认为这确实是您最好的选择,因为您可以在内存中建立命令的表示形式,并且对操作、遍历等有很好的库支持。

于 2011-02-10T15:33:05.923 回答
1

我会说 Groovy 可以做到这一点。

例如

class Foo {
   void bar() {
      println "foobar"
   }
}

Foo.metaClass.bar = {->
    prinltn "barfoo"
}

或 foo 的特定实例而不影响其他实例

fooInstance.metaClass.bar = {->
    println "instance barfoo"
}

使用这种方法,我可以从方法中修改、删除或添加表达式,后续调用将使用新方法。Groovy 元类可以做很多事情。

于 2011-02-10T15:50:00.603 回答
1

好吧,那些具有非常强大的宏支持的语言(尤其是 Lisps)可能有资格。

但是你确定你真的需要这么深入吗?我不知道你想做什么,但我想你可以在不深入元编程的情况下模仿它。比如说,不是使用方法和操作它,而是使用一组函数(使用某种共享状态的方式,例如传递给每个函数的对象持有状态)。

于 2011-02-10T15:38:54.303 回答
0

在 java 中,许多专业框架都使用开源ASM 框架
是所有著名的 Java 应用程序和库的列表,包括 ASM。

几年前BCEL也被大量使用。

于 2011-02-10T15:35:34.380 回答
0

有些语言/环境允许真正的运行时修改 - 例如,Common Lisp、Smalltalk、Forth。如果您真的知道自己在做什么,请使用其中之一。否则,您可以简单地为代码的演变部分使用解释器模式,任何 OO 或函数式语言都是可能的(并且很简单)。

于 2011-02-10T15:55:33.257 回答