什么编程语言可以让我操作方法中的指令序列?

时间:2011-02-10 15:27:50

标签: programming-languages low-level bytecode-manipulation vm-implementation

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

我追求的关键属性是:

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

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

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

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

  

你能写一个名为clean的方法:

     
      
  • 接受方法m作为输入

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

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

  •   

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

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


更新:我之后的原因是我想编写一个能够在运行时自行修改以响应新信息的程序。这种修改不仅仅是参数或可配置数据,而是完整的,演变的行为变化。 (不,我不是在写病毒。;))

5 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

那些具有真正强大的宏支持(特别是Lisps)的语言可能符合条件。

但你确定你真的需要这么深入吗?我不知道你要做什么,但我想你可以效仿它而不会过分深入到元编程中。比方说,不是使用方法并操纵它,而是使用函数集合(以某种方式共享状态,例如传递给每个函数的对象持有状态)。

答案 2 :(得分:1)

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

例如

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

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

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

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

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

答案 3 :(得分:0)

在java中,许多专业框架使用开源ASM framework来实现 Here是所有着名的java应用程序和库的列表,包括ASM。

几年前BCEL也被广泛使用。

答案 4 :(得分:0)

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