1

一部の(Web、デスクトップ)アプリケーションがいくつかのプログラミング言語でどのように作成されているかは常に私にとって疑問でした。たとえば、firefox、photoshop、amazon.com(もちろん論理コード)などの一部のアプリはC ++で記述されている、または何とか何とかアプリのコアはC ++であると聞いています(または読んでいます)。要点をつかむために、プログラマーはどのようにしていくつかのプログラミング言語またはそれらで書かれたモジュールを統合して、アプリケーションを1つのピースに構築できるのだろうか。アイデアは正確には何ですか?

前もって感謝します、

4

5 に答える 5

4

アプリケーションのさまざまな部分をさまざまなテクノロジーや言語で構築することは理にかなっているかもしれません。理由のいくつかは次のとおりです。

  • 特定のコンポーネントのパフォーマンス要件。したがって、他のコンポーネントが高水準言語からより多くの恩恵を受ける場合は、低水準言語を使用して、開発者の生産性を向上させます。
  • 「仕事に最適なツール」-フォームを表示するためのテクノロジースタックは、数値を計算するのに適していない可能性があります。
  • レガシーアプリの移行-移行する必要のある大規模なコードベースがある場合は、ビッグバン統合を1回行うのではなく、小さな部分を移行する方が理にかなっています(失敗する傾向があります)。

同じランタイム環境で実行できる2つの異なる言語を使用している場合、その組み合わせは簡単です。たとえば、C#アセンブリとF#アセンブリの両方を活用する.NETアプリケーション、またはパーツアセンブリコードがリンクされているCアプリケーション。

ただし、今日の大規模なアプリケーションの場合、最も一般的なケースは、ソフトウェアコンポーネントをサービスまたはメッセージバステクノロジで接続することです。あるコンポーネントから別のコンポーネントへのデータとイベントの移動。アウトプロセス通信は、データベースまたはファイルを共有する2つのコンポーネントのように単純な場合もあります。

于 2012-10-09T17:40:14.260 に答える
1

方法に答えるには:

最終的に、コンパイルされたすべての言語とスクリプト言語は、実行されるために特定のマシンのネイティブマシンコードに変換される必要があります。

コンパイラプログラミング言語は通常、ソースコードから実行可能バイナリへの移行の過程で変換のいくつかの段階を通過します-そしてその道の1つのステップはバイナリライブラリです。

さて、関数呼び出しの方法(パラメーターの受け渡し、スタックの動作など)を標準化するレベルの標準化されたABI(アプリケーションバイナリインターフェイス)があれば、このABIに収束するためにさまざまな言語のセットをコンパイルすることが可能になります、およびリンカーにそれらをリンクさせて、元々は多様な言語の混合であったものから形成される実行可能バイナリを生成します。

ただし、特定のプラットフォームでさまざまな言語のセットを選択することはできません。このスキームをサポートするには、この一般的なバックエンドに収束するフロントエンドコンパイラが必要です。

スクリプト言語には、コンパイルされた言語へのいわゆる「バインディング」があり、実行時に同じ方法で統合できるようにすることもできます。

于 2012-10-09T17:54:28.493 に答える
1

FirefoxとPhotoshopには言語バインディングがあり、他の言語を使用できるようにするさまざまなランタイムプラグインがあります。これらは、拡張性と開発の容易さがより優れており、サードパーティによる追加が可能である場合です。

この例は次のとおりです。

  • Luaバインディング
  • avascriptバインディング

アマゾンと言語の混合に関する他の例では、システムの分散部分をその特定の領域でより意味のある言語で書くことができます。その部分はかなりの速度が必要ですか?C++。ロジックはそれほど多くありませんが、コールバックが多く発生しますか?NodeJS。JavaやC++だけに固執するよりも、他の言語ではるかに簡単かつ迅速に解決できる問題がたくさんあります。

これがどのように行われるかの例:

  • メッセージパッシング
  • データベース
  • RPC呼び出し
  • リモートAPI
于 2012-10-09T17:55:29.460 に答える
1

C ++で作業している場合、実際には常に異なる言語で記述されたプログラムを使用している可能性があります。のような標準ライブラリの関数の多くは、operator new速度を上げるためにAssmebly言語で実装されています。

@driisは、異なる言語で記述されたコンポーネントが相互作用する可能性のある2つの主要な方法にすでに取り組んでいます。少なくとももう1つあります。

1つのアプリケーションは、異なる言語で記述された複数のコンポーネントで構成できます。たとえば、私が取り組んでいるプログラムの1つには、C ++で記述された部分と、アセンブリで記述された他の部分があります。私は、FORTRAN + Cで書かれたプログラム、さらにはVBやC ++で書かれたプログラムに取り組んできました(Ick、面白くありません)。

考え方は単純です。あなたがする必要があるのは、一方の側がもう一方の側の関数がメモリ内のどこにあるかを知っていること、そして両方の側が呼び出しに同じ呼び出し規約を使用していることを確認することです。

呼び出し規約は、どの順序パラメーターと戻りアドレスがスタックにプッシュされるか、およびそのような他のものに関する合意です。

関数のアドレスを取得することは、ケーキから悪夢までどこでも可能です。たとえば、Windows C ++ DLLでは、それは簡単です。.libにリンクするだけで、問題ありません。VBにCまたはC++関数を呼び出させるのは、VBがこれらの.libファイルの使用方法を知らないため、少し注意が必要です。少なくとも、当時はそうではありませんでした。ここに投稿されているようなトリッキーなことをしなければなりませんでした。DLLを直接ロードしてから、関数のアドレスへのポインタを割り当てる必要があります。

于 2012-10-09T18:05:42.197 に答える
-3

答えは簡単にします。

Webアプリケーションについて考えてみましょう。これは通常、HTML、Javascript、CSS、そしてたとえばPHPで書かれています。その中でSQLが使用されている場合もあります。

この非常に一般的なシナリオのコード例を示す必要はないと思います。代わりに、このシナリオを検討することで質問にどのように答えるかについて考えてみてください。:)

于 2012-10-09T18:00:19.583 に答える