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

Programming languages 什么编程语言可以让我操作方法中的指令序列?,programming-languages,low-level,bytecode-manipulation,vm-implementation,Programming Languages,Low Level,Bytecode Manipulation,Vm Implementation,我有一个即将到来的项目,其中一个核心需求是改变方法在运行时的工作方式。请注意,我不是在谈论更高级别的OO概念,比如“用一个方法阴影另一个方法”,尽管实际效果类似 我关注的关键属性是: 我必须能够修改该方法,以便添加新表达式、删除现有表达式或修改其中发生的任何表达式 修改方法后,对该方法的后续调用将调用新的操作序列。(或者,如果语言绑定方法而不是每次都进行计算,请为我提供一种解除绑定/重新绑定新方法的方法。) 理想情况下,我希望操作语言的原子单元(例如,“调用对象上的方法foo”),而不是直接操

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

我关注的关键属性是:

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

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

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

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

您能否编写另一个名为
clean
的方法:

  • 接受方法
    m
    作为输入

  • 返回另一个方法
    m2
    ,该方法执行与
    m

  • 使
    m2
    m
    相同,但不包含对您的语言中的“打印到标准输出”方法的任何调用(put、System.Console.WriteLn、println等)

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

我有哪些选择?如果可能的话,你能用你推荐的一种或多种语言提供一个玩具例子,或者给我举一个最近的例子吗



更新:我之所以要写这篇文章,是因为我想写一个程序,它能够在运行时根据新信息修改自身。这种修改不仅仅是参数或可配置的数据,而是行为上全面的、进化的变化。(不,我不是在写病毒。;)

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

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


几年前也被大量使用。

好吧,那些具有强大宏支持的语言(尤其是Lisps)可以被认可


但你确定你真的需要深入研究吗?我不知道您想做什么,但我想您可以模仿它,而不必深入元编程。比方说,不要使用方法并对其进行操作,而是使用一组函数(以某种方式共享状态,例如,向每个函数传递一个持有状态的对象)。

我认为Groovy可以做到这一点

比如说

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

Foo.metaClass.bar = {->
    prinltn "barfoo"
}
或foo的特定实例,而不影响其他实例

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

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

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

说得清楚,您想动态更改现有方法的指令吗?(也就是说,没有在运行中集成新方法的实现?@Kirk-Woll:你提出了一个很好的观点,我并不特别关心语言如何满足我的目标的实现细节。我已经澄清了我的问题,以突出我所追求的关键属性。这将让我建立表达式,是的。但是,我是否可以在运行时解除现有方法的绑定,然后使用具有我刚构建的表达式的新方法重新绑定它?@johnfeminella:放弃“方法”的想法,改为使用委托。这将允许在运行时更改“方法”(委托),以便“方法”的调用使用新的/更新的实现,而不是现有的实现。与.NET 4.0 System.Dynamic.DynamicObject结合使用,您可以获得一些看起来像方法但可以根据请求进行更新的内容。@jonp:这听起来是一种非常有吸引力的方法。我将把它添加到我的研究目标列表中。对不起,不是DynamicObject,而是System.Dynamic.ExpandoObject。这和我想要的不完全一样。这表明一个方法可以替换为另一个同名的方法。但我想要的是能够操纵
。作为一个简单的试金石测试,应该可以编写另一个方法
capture\u printlns
,该方法接受现有方法并生成一个新方法,该方法只包含原始方法中的
println
语句。我知道解释器模式。然而,在这里使用它不是太过分了吗?我不想为了操纵一系列操作而再次以缩影的形式实现一大块好的语言内部构件