4

我目前正在就如何在程序运行时升级程序进行头脑风暴。(不是在调试时,一个“生产”系统。)

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

伪代码

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会更容易?我认为整个 ClassLoader 是可替换的。

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

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

4

8 回答 8

3

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

于 2010-03-27T14:52:13.123 回答
3

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

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

于 2009-05-17T14:58:13.803 回答
2

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

于 2009-05-17T14:31:59.687 回答
2

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

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

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

于 2009-05-17T15:03:50.420 回答
1

使用 JavaScript 可以做到。令人惊奇的是,Google 的 V8 引擎是开源的,并且很容易在任何 C++ 程序中实现。

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

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

于 2009-05-17T14:22:51.563 回答
1

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

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

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

您可能还想研究UpgradeJ,它是一种专门为满足此要求(代码热交换)而设计的语言。

于 2010-03-26T22:54:09.487 回答
0

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

于 2010-12-06T14:49:23.563 回答
0

Erlang 可以做你正在寻找的一切,并且它不依赖于任何附加库(除非你将 OTP 计入该类别)或编码变通办法。它可以在重新加载期间保持状态(即命令式语言中的“变量值”),并且不需要缓冲或重新传输事务。如果您以 OTP 风格编写代码,那么您可以让您的应用程序程序员编写简单的顺序代码,这些代码将具有一定程度的并行执行能力,并支持热重载,所有这一切都无需他们担心如何完成。它只是工作。

于 2010-04-06T17:18:52.783 回答