6

これはソフトウェア設計に関する一般的な「素人」の質問なので、あいまいに思われる場合は申し訳ありませんが、アドバイスをいただければ幸いです。以下で説明するシステムは単なる例であり、私が考えている特定の製品ではないことに注意してください。

さまざまな言語で記述された複数のライブラリまたはユーティリティの機能を組み合わせる必要があることがよくあります。たとえば、デスクトップ向けの高性能オーディオ処理アプリケーションをコーディングする場合は、C / C++ で記述します。次に、素敵な GUI を追加したいと思います。しかし、私はQtを学びたくありません。Adobe Air のルック アンド フィールが気に入っているので、それを使いたいと思っています。後で、USB デバイスにアクセスする必要があります。しかし、私が持っている USB ライブラリには Java の API しかありません。これらすべての要素を組み合わせて、それらの相対的な強みを活用するにはどうすればよいでしょうか?

明らかに、これらのさまざまな要素を 1 つの実行可能ファイルにコンパイルすることはできません。そのため、それらを個別に作成して実行し、通信手段を提供する必要があります。これを行う最も一般的な方法は、共有メモリやソケットなどの IPC (Inter Process Communication) を使用することです。プログラムはネットワーク上の別々のマシンで実行される可能性があるため、ソケットのアイデアを好みます。

そこで、これらの要素が通信できるように、カスタム API を使用してローカル クライアント/サーバー システムを作成することにしました。たとえば、Air アプリケーションは C アプリケーションからメッセージを受け取り、UI を更新するよう伝えます。Java で実行されている USB アプリケーションは、ソケットを使用して USB ハードウェアから C アプリケーションにオーディオをストリーミングします。

私の質問: このようにローカル ソケットを使用するのは、そのようなシステムを設計するための典型的な方法ですか? パフォーマンスは、真のネイティブ アプリケーション (たとえば、Java または C のすべてを単一の実行可能ファイルに含む) よりもはるかに悪くなりますか? また、そのようなアプローチはバグが発生しやすく、保守が難しいと思われますか?

既存のソフトウェア ライブラリの限界に直面することがよくあります (たとえば、美しく柔軟な UI を備えたグラフィック ライブラリ、低レベルのハードウェアにアクセスする方法がない、または多くのオーディオ ストリームをミックスできるがサポートされていないメディア ライブラリなど)。ビデオの再生)、非常にイライラします。このような任意のソフトウェア ライブラリを組み合わせる最善の方法を誰かがアドバイスできれば、本当に感謝します。

前もって感謝します!

4

2 に答える 2

6

正しく識別されているように、異なる言語またはプラットフォームのライブラリを組み合わせるのは困難です。いくつかの方法がありますが、どれも理想的ではありません。例:

  • ネイティブ コール インターフェイス (JNI / JNA など) - 非常に高速ですが、正しく機能させるのは難しく、通常使用されるデータ型が異なるプラットフォーム間できれいにマッピングされないという問題があります。ネイティブの依存関係を追加します。
  • テキスト プロトコル (XML、JSON など) を使用したソケット ベースの IPC - 問題なく動作し、一般的な形式は両端でサポートされる可能性がありますが、多くのオーバーヘッドが追加されます。カスタム スキーマ マッピングなどを維持するのが面倒な場合があります。
  • バイナリ プロトコルを使用したソケット ベースの IPC (Google プロトコル バッファなど) - 非常に効率的ですが、カスタム プロトコルを両端で正しく動作させるには多くの作業が必要です。
  • 3 番目のシステム (データベース、メッセージ キュー、ファイル システムなど) を介した通信 - 多くのオーバーヘッドが発生し、不安定になる可能性があり、3 番目のシステムに大きく依存します。

私の経験では、通常、特定のライブラリまたは機能を取得するためだけに新しい言語/プラットフォームを統合する価値はありません。ユーザー インターフェイスの例を見てみましょう。Adobe Air の見た目がどれほど優れていても、それを既存の C/C++ アプリケーションと統合しようとする価値があるとは思えません。

機能するようになったとしても、アプリケーションの将来のメンテナンスと開発が大幅に複雑になります。ビルドはより複雑になります。追加の通信/「接着」コードを維持する必要があります。より多くの依存関係を管理する必要があります。ユーザーは、さらに多くの構成の問題に見舞われることになります。テストはより困難になります。システム全体がどのように機能するかについて、新しい人に教えるのが難しくなります。より多くの言語/フレームワークなどでスキルを維持する必要があります。

次の戦略をお勧めします。

  1. プライマリ プラットフォームを選択する
  2. 新しいライブラリや機能が必要なときはいつでも、最初にプライマリ プラットフォームで何かを探してください。願わくば (通常は?) 何か良いものが利用可能であることを願っています。
  3. プライマリ プラットフォームに合理的な選択肢がない場合にのみ、新しい言語/プラットフォームの統合について考え始めることができます。

主なプラットフォームに関しては、通常、Java、Scala、Clojure などの JVM 言語をお勧めします。なぜなら、JVM は非常によく設計されており、優れたパフォーマンスを提供し、移植性が高く、最大かつ最もまとまりのあるライブラリ エコシステム (ほとんどがオープンです) を備えているからです。ソース)。したがって、JVM で可能になる可能性が低い非常に具体的な要件がない限り、JVM はおそらく最良の「汎用」の選択肢です。

  • ハードウェアへのアクセスを必要とする多くの組み込み/リアルタイム/システム プログラミングを行っている場合は、おそらく C/C++ を使用する必要があります。
  • 純粋に Web ベースのクライアント向けにコーディングしている場合は、おそらく JavaScript を使用する必要があります (サーバー側でもコードを記述している場合は、Vaadin や ClojureScript など、JVM で動作する JavaScript コード生成フレームワーク/ライブラリを検討できます)。
于 2012-08-02T06:34:08.073 に答える
2

答えは、使用しているテクノロジーに大きく依存し、これに対する特効薬の解決策はありません。

一般に、このソリューションは次のいずれかのカテゴリに分類されます。

  • いくつかのプロセス間通信技術

  • 言語/プラットフォーム自体によって提供される統合

  • データベース/いくつかの共通ストレージ(ファイルも:))

最初の例: ソケット/パイプ/オペレーティング システムで許可されているもの。CORBA - さまざまな言語で分散コードを記述できます。Google protobuf - データオブジェクトのシリアル化/逆シリアル化とその言語に依存しないことを可能にします

次に、使用している言語/エコシステムに大きく依存します。Java の例:

  • JNI - Java ネイティブ インターフェイス - JVM の外部でコード (dlls/so) を実行できるようにします。
  • JCA - エンタープライズ環境にいる場合 - これでレガシーシステムとの統合を書くことができます。

ネイティブ コードにコンパイルされる言語の場合はそれほど複雑ではありません。たとえば、Pascal でコードを記述してコンパイルし、C で DLL を使用できます。

Java について話していると、独自の構文とコンパイラを持つ多数の言語が存在することがありますが、それらのコンパイラは、jvm 内で実行できる Java バイナリ コードにコンパイルされます。したがって、ソリューションがこれらの言語に基づいている場合、統合はより簡単になります。Scala、Groovy、Closure、Jython などの言語は、このカテゴリに分類されます。

最後になりましたが、言及すべきテクノロジーは Web サービスです。これは、エンタープライズ環境でより多く使用されていますが、さまざまなシステムを統合するための非常に一般的なツールです。基本的には、プロセス/サーバー間で XML/JSON 形式でデータ オブジェクトを送信できるソケット レイヤーの抽象化です。XML と JSON はどちらも言語に依存しないため、C++ で記述されたプログラムで XML を作成し、それを Java で使用することは問題ではありません。

お役に立てれば

于 2012-08-02T06:02:32.957 に答える