4

私はここでは少数派かもしれませんが、学問的/専門的なキャリア全体を通じて、さまざまな言語を教えられてきたようです. この間、構文とプログラミングのパラダイムに焦点が当てられましたが、さまざまな言語を使用して記述されたシステムの統合と、この決定を行う適切な方法については教えられませんでした。

念のために言っておきますが、私は正規の Web スタックや、より新しく魅力的な JVM フレンドリーな言語について話しているのではありません。私が疑問に思っているのは、たとえば Java や C++ などのバインディング言語の背後にある意思決定プロセスについて学ぶことができる「既知のリソース」があるかどうかです。

確かに、XML、JSON、XMPP などのツールが思い浮かびます。繰り返しになりますが、シリアライゼーションを使用して Java と C++ をバインドするシステムを見てきました。私は、1 つですべてを解決できるタイプのソリューションを探しているわけではありません。さまざまな解決策と、そのような決定を下す方法について学ぶことにもっと興味があります。

これがこのフォーラムにとって広すぎる場合は申し訳ありませんが、少なくとも私は人々に私の失敗したコードを修正したり書き直したりするように求めているわけではありません ;)

4

5 に答える 5

7

私が考えることができる4つの異なるモデルがあります:

  • Java、C++、または C# アプリに埋め込まれた Lua、Python、Javascript など、主に「システム」言語で記述されたアプリ内に動的言語を埋め込みます。これは主に、アプリのスクリプト作成/カスタマイズ コンポーネントに使用されます。これは、ホスト アプリケーションのデータ型の一部を、動的言語が利用できる形式で公開することによって実現されます。

  • パフォーマンスに問題がある言語のネイティブ (または C# または Java) 拡張機能を記述します。Python と Ruby には、これらの拡張機能が多数あります。これは、動的言語がフレームワークであるという点で上記とは異なります。これは、クライアント言語の呼び出し規則に準拠するようにネイティブ ライブラリ (または他のネイティブ ライブラリのラッパー) を作成することによって実現されます。これは、システム コードでアセンブラーと C を混在させる場合も、同じ一般的な構造です。

  • アプリケーションを異なるアドレス空間で実行し、ソケットまたはパイプを介して通信します。この場合、アプリケーションが同じマシン上で実行されているのは単なる偶然です。ネットワーク経由で通信している可能性もあります。

  • 同じプラットフォームと呼び出し規約を共有する複数の言語を使用してアプリを開発します。たとえば、Java と Scala は自由に組み合わせることができます。

于 2009-08-11T06:01:43.917 に答える
2

安全なソリューションは、各言語が独自のアドレススペースで実行され、ソケットまたはその他のマルチプロセス抽象化(Lindaタプルなど)を介して通信するマルチプロセスソリューションです。

2つの言語が同じアドレス空間で実行される場合は、共通ランタイム上で一緒に設計する必要があります(DigitalはVAX VMSファミリーの言語で美しく機能し、Microsoftは共通言語ランタイムで懸命に努力してきました。 .NET)または1つは「担当」である必要があります。多くの言語(OCaml、Standard ML、Haskell、Lua、そしておそらくPerl、Ruby)があり、それらが担当していれば、Cとうまく相互運用できます。それらは互いに相互運用しません。

通常、最も根本的な問題は、自動メモリ管理(「マネージドヒープ」)です。ある1つのエンティティが、死んだオブジェクトを安全に回収できる時期を決定する必要があります。2つの異なる言語の両方が、その質問に答える必要があると判断した場合、別々のプロセスが迫ります。

于 2009-08-11T03:18:38.427 に答える
1

Swigが必要だと思います。Python を他の多くの言語と統合するためのさまざまなツールを見つけることができるこのページも参照してください。

于 2009-08-11T05:38:39.300 に答える
1

Luaは、同じプロセス内で C と非常にうまく統合できるスクリプト言語です。スタック モデルを使用して、2 つの言語/ランタイム間のインピーダンスの不一致を埋めます。Lua の実装はオープンソースであり、比較的コンパクトです。そのため、勉強に適しているかもしれません。

D-Busは IPC の使用例です。異なる言語で実装された個別のプロセスを統合するために使用できます。非同期メッセージングと同期メソッド呼び出しをサポートしています。Gtk、Qt、python などの D-Bus 実装があります。

Parrot Virtual Machineは、言語の相互運用を目的とした VM です。

さらに別のアプローチは、GLib (Gtk によって使用される) によって採用されたものです。GObjectマニュアルから:

GLib で使用される解決策は、プログラマが操作するすべてのオブジェクトの記述を実行時に保持する GType ライブラリを使用することです。このいわゆる動的タイプ 1 ライブラリーは、特殊な汎用グルー・コードによって使用され、異なるランタイム・ドメイン間で関数パラメーターと関数呼び出し規則を自動的に変換します。

于 2009-08-11T02:40:04.590 に答える
0

意思決定プロセスについて少し逸脱しています...

システムを構築するときは、機能的に独立したサブシステムに分割します。サブシステムごとに、理論的には、それを構築するフレームワークを見つける必要があります。重要な側面: * どのフレームワークがサブシステムの機能に最もよく適合するか * 開発者が快適に使用できるフレームワークは何か * 将来のサポート: フレームワーク ベンダーがサポートを停止した場合 (MS がアンマネージ C++ でほとんど行ったように) *

システムが異種混合になったら、サブシステム内の接着剤について考えるときです。これも、それ自体でサブシステムと見なすことができ、MPI、パイプなどのいくつかのプロセス間通信プロトコル、または自家製のもので構築できます。

于 2009-08-11T08:29:04.337 に答える