使用热代码交换搜索编程平台

时间:2009-05-17 14:18:58

标签: versioning virtual-machine hotswap

我目前正在集思广益,了解如何在程序运行时升级程序。 (而不是在调试时,“生产”系统。)

但是,它需要的一件事是将更改后的源代码或编译后的字节代码实际提交到正在运行的进程中。

伪代码

var method = typeof(MyClass).GetMethod("Method1");
var content = //get it from a database (bytecode or source code)
  SELECT content FROM methods WHERE id=? AND version=?
method.SetContent(content);

首先,我希望系统能够在没有面向对象复杂性的情况下工作。这导致以下要求:

  • 更改功能的源代码或字节代码
  • drop functions
  • 添加新功能
  • 更改功能的签名

使用.NET(和其他人),我可以通过IoC注入一个类,从而可以更改源代码。但是加载会很麻烦,因为一切都必须在装配中或通过Emit创建。 也许用Java这会更容易?我认为整个ClassLoader是可替换的。

使用JavaScript,我可以实现许多目标。 只需评估一个新函数(MyMethod_V25)并将其分配给MyClass.prototype.MyMethod。 我想也可以用“del”

以某种方式删除函数

哪个通用平台可以处理这些事情?

8 个答案:

答案 0 :(得分:3)

在Java中,您拥有OSGi项目,这有助于升级和更改应用程序的模块,而无需触及其他模块。

如果你不介意学习不同的东西,那么Erlang编程语言就是在设计时考虑到这种类型的应用程序。

答案 1 :(得分:3)

我认为任何基于图像的语言都会支持这一点。我知道Common Lisp确实如此,因为它可能是部署Lisp网络应用程序的最常见方式之一,但我怀疑它在Smalltalk中的工作方式基本相同。

答案 2 :(得分:2)

大多数动态语言都具有此功能。看看Ruby:您可以在运行时修改现有方法等。当IronRuby出局时,您也可以在.Net平台上执行此操作。

答案 3 :(得分:2)

我的印象是,现在Erlang作为具有此功能的语言非常明显。也就是说,我的岳父(在我看来是一个主程序员)告诉我他在一个较旧的平台上实现了热插拔代码 - 汇编程序用于他们现在称之为z / OS(之前的OS / 390) )。

就个人而言,我一直在寻找在Java空间中实现这一目标的方法,目前我的绝大多数专业工作都已完成。在Javaland,提供热卸载的最佳公开努力(据我所知)是OSGi Alliance完成的工作。也就是说,这个解决方案必然涉及一些类加载器的魔力,因为一些常见的Java库是如何构建的(例如:JDBC DriverManager)。如果您选择沿着OSGI路线走下去,您的代码可能需要进行大量的审核和测试,以确保它可以与OSGi架构一起使用。

作为实现热插拔代码的替代方法,也许您可​​以使用可能更简单的请求排队机制来实现似乎具有此功能的系统。例如,如果您需要热交换处理大型后端请求的系统部分,为什么不通过中介发送这些请求,如果它正在运行则可以将它们分派到后端组件并在队列中累积它们组件下降?这可能允许您独立于系统的其余部分升级后端组件,而无需重新部署,正如我们在行业中所说的“整个shebang”。

答案 4 :(得分:1)

使用JavaScript可以完成。令人惊讶的是,谷歌的V8引擎是开源的,很容易在任何C ++程序中实现。

http://code.google.com/p/v8/

当然,您必须编写一些库以显示功能并从JavaScript内部加载脚本。这取决于你想做什么。

答案 5 :(得分:1)

  

但是,它需要的一件事是将更改后的源代码或编译后的字节代码实际提交到正在运行的进程中。   哪个通用平台可以处理这些事情?

已经提到过Erlang,并且它使用显式的“同步点”,其中运行例程可以通过使用“?MODULE:routine()”进行“自我”调用来显式更新自身。

这是另一个要记住的重要事项:您不仅需要VM中的功能来替换正在运行的代码,而且运行代码还需要一种方法来响应此类更新并相应地进行调整。

您可能还想查看UpgradeJ这是一种专门根据此要求(代码热插拔)设计的语言。

答案 6 :(得分:0)

Erlang可以完成您正在寻找的所有事情,并且它不依赖于任何螺栓连接库(除非您计算该类别中的OTP)或编码解决方案。它可以跨重载维持状态(即,命令语言中的“变量值”),并且不需要缓冲或重传事务。如果您以OTP样式编写代码,那么您可以让应用程序编写者编写简单的顺序代码,这些代码具有一定程度的并行执行能力,并支持热重新加载,所有这一切都没有他们担心如何详细说明完成。它只是有效。

答案 7 :(得分:0)

使用.NET,这可以通过Managed Extensibility Framework完美实现。此框架在.NET 4中引入。您可以构建可扩展的应用程序。它可以做IoC容器可以做的事情,尽管它可以做更多事情。它可以发现不知道先验的功能。此外,您可以更新功能,您不知道将更新先验。换句话说,它是模块化应用程序的框架,无论您是要热交换代码块还是想要提供不同的功能,或者已经存在更新。