Versioning 搜索具有热代码交换的编程平台

Versioning 搜索具有热代码交换的编程平台,versioning,virtual-machine,hotswap,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 versio

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

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

伪码

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);
首先,我想实现系统在没有复杂的面向对象的情况下工作。这导致了以下要求:

  • 更改函数的源代码或字节码
  • 下降函数
  • 添加新功能
  • 更改函数的签名
有了.NET(和其他),我可以通过IoC注入一个类,从而可以更改源代码。但是加载会很麻烦,因为所有内容都必须在程序集中或通过Emit创建。 也许使用Java会更容易些?我认为,整个类加载器是可重放的

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


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

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


当然,您必须编写一个库,以公开功能并从JavaScript内部加载脚本。这将取决于您想要做什么。

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

在Java中,您拥有该项目,它可以在不接触其他模块的情况下方便地升级和更改应用程序的模块


如果您不介意学习一些不同的东西,那么编程语言是从一开始就考虑到这种类型的应用程序而设计的。

我的印象是,现在Erlang作为一种具有这种功能的语言非常明显。这就是说,我的岳父(我认为他是一名程序员大师)告诉我,他在一个稍旧的平台上实现了热插拔代码——他们现在称之为z/OS(在此之前称为OS/390)的汇编程序

就我个人而言,我一直在寻找在Java领域实现这一点的方法,我的大部分专业工作目前都在Java领域完成。在Javaland中,提供热卸载的最佳宣传工作(据我所知)是。也就是说,这个解决方案必然涉及一些类加载器魔法,因为一些常见Java库是如何架构的(例如:JDBC
DriverManager
)。如果您选择使用OSGI,那么您的代码可能需要进行大量的审核和测试,以确保它在OSGI架构中可用

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

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

Erlang已经提到过,它使用显式的“同步点”,其中运行的例程可以通过使用“”模块:例程()执行“自”调用来显式地更新自身

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


您可能还想了解哪种语言是专门为满足这一需求(代码热交换)而设计的。

我认为任何基于图像的语言都会支持这一点。我知道Common Lisp是这样做的,因为它可能是部署Lisp web应用程序最常用的方法之一,但我怀疑它在Smalltalk中的工作原理几乎相同。

Erlang可以完成您想要的一切,并且它不依赖任何附加库(除非您将OTP计算在该类别中)或编码工作。它可以在整个重新加载过程中维护状态(即命令式语言中的“变量值”),并且不需要缓冲或重新传输事务。如果您以OTP风格编写代码,那么您可以让您的应用程序程序员编写简单的顺序代码,这些代码将具有一定程度的并行执行能力,并支持热重新加载,而不必担心如何执行的细节。它可以正常工作。

对于.NET,这是通过托管可扩展性框架完美实现的。这个框架是在.NET4中介绍的。您可以构建可扩展的应用程序。它做了IoC容器可以做的事情,尽管它可以做更多的事情。它可以发现未知的功能。此外,您可以更新功能,但您不知道该功能将被预先更新。换句话说,它是模块化应用程序的框架,无论您是想热交换代码块并提供不同的功能,还是更新现有的功能。

Tcl是另一种非常简单的语言。Ruby确实是一种动态语言——如果打开控制台,您可以重新定义方法。然而,我不清楚你会如何在实践中做到这一点。。。例如,如果您正在运行monger