4

私は現在、実行中のプログラムをアップグレードする方法についてブレインストーミングを行っています。(デバッグ中ではなく、「本番」システム。)

ただし、そのために必要なことの 1 つは、変更されたソース コードまたはコンパイルされたバイト コードを実行中のプロセスに実際に送信することです。

疑似コード

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 アプリケーションを展開する最も一般的な方法の 1 つであるため、Common Lisp がそうであることは知っていますが、たとえば Smalltalk でもほぼ同じように機能すると思います。

于 2010-03-27T14:52:13.123 に答える
3

Java には、OSGiプロジェクトがあります。これにより、他のモジュールに触れることなく、アプリケーションのモジュールのアップグレードと変更が容易になります。

何か違うことを学ぶことを気にしないのであれば、Erlangプログラミング言語は、このタイプのアプリケーションを念頭に置いてゼロから設計されました。

于 2009-05-17T14:58:13.803 に答える
2

私の印象では、現在、Erlang はこの機能を備えた言語として非常に注目されています。そうは言っても、私の義父 (私の意見ではマスター プログラマー) は、ホットスワップ可能なコードをやや古いプラットフォーム、つまり現在 z/OS と呼ばれているもののアセンブラー (それ以前は OS/390) に実装していると私に話しました。 )。

個人的には、Java の分野でこれを行う方法を探していました。Java の分野では、私の専門的な仕事の大部分が現在行われています。Javaland でホット アンロードを提供するために最もよく知られている取り組みは (私の知る限り)、OSGi Allianceによる取り組みです。とはいえ、一部の一般的な Java ライブラリがどのように設計されているか (例: JDBC ) があるため、このソリューションには必然的にいくつかのクラスローダー マジックが含まれますDriverManager。OSGI ルートをたどることを選択した場合、OSGi アーキテクチャーで使用できることを確認するために、コードに広範な監査とテストが必要になる可能性があります。

ホットスワップ可能なコードを実装する代わりに、リクエスト キューイングの潜在的に単純なメカニズムを使用して、この機能を備えているように見えるシステムを実装することができます。たとえば、大規模なバックエンド リクエストを処理するシステムの一部をホット スワップする必要がある場合、バックエンド コンポーネントが実行されている場合はそれらをディスパッチし、実行中の場合はそれらをキューに蓄積できる仲介者を介してこれらのリクエストを送信しない理由はありません。コンポーネントがダウンしていますか?これにより、業界で「すべてのシバン」と呼ばれているように、再デプロイすることなく、システムの残りの部分から独立してバックエンド コンポーネントをアップグレードできる場合があります。

于 2009-05-17T15:03:50.420 に答える
2

ほとんどの動的言語にはこの機能があります。Ruby を見てみましょう。実行時に既存のメソッドなどを変更できます。IronRuby がリリースされると、.Net プラットフォームでもこれを実行できるようになります。

于 2009-05-17T14:31:59.687 に答える
1

しかし、それに必要なことの1つは、変更されたソースコードまたはコンパイルされたバイトコードを実行中のプロセスに実際に送信することです。どの汎用プラットフォームがそのようなことを処理できますか?

Erlangについてはすでに説明しましたが、明示的な「同期ポイント」を使用しており、実行中のルーチンが「?MODULE:routine()」を使用して「self」呼び出しを実行することで明示的に更新できます。

これは覚えておくべきもう1つの重要なことです。実行中のコードを置き換えるためにVMの機能が必要なだけでなく、実行中のコードもそのような更新に応答してそれに応じて調整する方法が必要です。

この要件(コードホットスワップ)を念頭に置いて特別に設計された言語であるUpgradeJを調べることもできます。

于 2010-03-26T22:54:09.487 に答える
1

JavaScript を使えばできます。驚くべきことに、Google の V8 エンジンはオープン ソースであり、どの C++ プログラムにも簡単に実装できます。

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

もちろん、機能を公開し、JavaScript 内からスクリプトをロードするには、少しライブラリを作成する必要があります。それはあなたが何をしたいかによって異なります。

于 2009-05-17T14:22:51.563 に答える
0

.NETでは、これはManagedExtensibilityFrameworkを介して完全に実装されます。このフレームワークは.NET4で導入されました。拡張可能なアプリケーションを構築できます。IoCコンテナが実行できることを実行しますが、それ以上のことは実行できます。演繹的に知らない機能を発見することができます。さらに、機能を更新することができますが、それが事前に更新されるかどうかはわかりません。つまり、コードチャンクをホットスワップしてさまざまな機能を提供する場合でも、既存のアプリケーションを更新する場合でも、モジュラーアプリケーションのフレームワークです。

于 2010-12-06T14:49:23.563 に答える
0

Erlang はあなたが探しているすべてのことを行うことができ、追加のライブラリ (そのカテゴリに OTP を含めない限り) やコーディングの回避策に依存しません。リロード後も状態 (つまり、命令型言語で言えば「変数の値」) を維持でき、トランザクションをバッファリングまたは再送信する必要はありません。OTP スタイルでコードを記述した場合、アプリケーション プログラマーは、並列実行とホット リロードをサポートするある程度の機能を備えた簡単なシーケンシャル コードを記述できます。終わった。それだけで機能します。

于 2010-04-06T17:18:52.783 に答える