87

1 つのプロジェクトで複数の言語でプログラムを作成する人もいると聞きました。言語同士がどのように相互作用するのか想像できません。

つまり、次のようなJavaメソッドはありません

myProgram.callCfunction(parameters);

決して起こらないか、私は間違っていますか?

4

12 に答える 12

42

1 つのプロジェクトで複数の言語を使用することは、実際には非常に一般的ですが、背後にある原則は必ずしも単純ではありません。

単純なケースでは、異なる言語が同じコードにコンパイルされます。たとえば、C および C++ コードは通常、マシン アセンブラーまたは C# にコンパイルされ、VB.Net は IL (.NET ランタイムが理解する言語) にコンパイルされます。

言語/コンパイラが異なる型システムを使用している場合は、さらに困難になります。さまざまな方法があり、integer、float、double などの基本的なデータ型が内部的に表現され、文字列を表現する方法はさらに多くあります。異なる言語間で型を渡す場合、両側が同じ型を解釈するか、そうでない場合は型が正しくマッピングされていることを確認する必要があります。この種の型マッピングは、マーシャリングとも呼ばれます。

異なるプログラム言語間の相互運用性の古典的な例は次のとおりです (主に Windows の世界から)。

  • .NET プラットフォームで使用できるさまざまな言語。これには、C#、VB.Net、J#、IronRuby、F#、XSLT、およびその他のあまり人気のない言語が含まれます。
  • C++ または VB で記述されたネイティブ COM コンポーネントは、VBScript、VB、すべての .NET 言語、Java など、さまざまな言語で使用できます。
  • Win32 API 関数は .NET または VB から呼び出すことができます
  • IPC (プロセス間通信)
  • Corba、おそらく最も包括的な (そして最も複雑な) アプローチ
  • Web サービスおよびその他のサービス指向アーキテクチャー (おそらく最も最新のアプローチ)
于 2009-03-12T00:07:44.567 に答える
16

使用されている複数の言語は、略して「相互運用性」または「相互運用性」と呼ばれます。

あなたの例は間違っています。Java は C 関数を呼び出すことができます。

この言語は、相互運用性のためのメカニズムを提供します。

.NET の場合、言語は CLI の一部として IL にコンパイルされます。したがって、任意の .NET 言語は、他の .NET 言語で定義されたモジュールと相互運用 (によって定義されたメソッドを呼び出す) ことができます。

例として:

C# でメソッドを定義できる

static void Hello(){ Console.WriteLine("Hello World");}

そして、Python (IronPython) から呼び出すことができます

 Hello()

そして、期待される出力を取得します。

一般的に言えば、特に言語の作成者が特に言語の機能に相互運用性を持たせた場合、一部の言語は他の言語よりも相互運用性が高くなります。

于 2009-03-12T00:03:57.273 に答える
11

複数の言語が以下と対話できます。

  1. パイプ入力/出力 (すべての非おもちゃ言語では必然的に入力と出力を実装する必要があるため、どの言語でもこれを行うことができます)
  2. 一方の言語のコードをネイティブ ライブラリにコンパイルし、もう一方の言語はネイティブ コードの呼び出しをサポートします。
  3. ループバック ネットワーク接続を介した通信。この方法では、ファイアウォールの干渉で問題が発生する可能性があります。
  4. データベース。これらは「普遍的な」データストレージ形式と考えることができるため、データベース拡張機能を備えたほとんどの言語でアクセスできます。これには通常、次のプログラムがデータベースにアクセスできるようになる前に、1 つのプログラムが操作を終了する必要があります。さらに、すべての「通信」は通常、ディスクに書き込まれます。
  5. 関連する言語が同じランタイム (つまり、.NET、JVM) で実行される場合、通常、オブジェクト データを一方の言語から他方の言語にほとんど支障なく直接渡すことができます。

ほとんどの場合、通信を交換する前に共通の形式に変換する必要があります (例外は、同じランタイム上の言語です)。これが、1 つのプロジェクトで複数の言語が使用されることがほとんどない理由です。

于 2009-03-12T04:51:21.750 に答える
4

1 つのプロジェクトでさまざまな言語を使用するさまざまな方法があります。2 つの主なカテゴリが思い浮かびます。

  1. 異なる言語を組み合わせて 1 つのアプリケーションを構築する。たとえば、Java を使用して GUI を構築し、JNI を使用して C API にアクセスします (質問に答えて、Java から C 関数を呼び出すことができます ;))

  2. 同じアプリケーションの一部でない場合、1 つのプロジェクトで異なる言語を一緒に使用する。例えば。私は現在、大量のテキストを使用する iPhone アプリに取り組んでいます。私は現在、Python (テキストの元のソースを操作するため)、SQL (Python アプリの結果を iPhone sqlite3 API から簡単にアクセスできる形式にするため)、Objective C を使用して実際のアプリを構築する 3 つの言語を使用しています。最終製品は Objective C のみですが、最終製品に到達するために他の 2 つの言語を使用しました。

于 2009-03-12T00:08:46.873 に答える
3

作業の大部分が Java で行われるアプリを作成することもできますが、データ パーサーや何かが Python で作成されているなど、その一部が存在する可能性もあります。実際にはほぼ 2 つの別個のアプリです。おそらく、パーサーがファイルに対していくつかの作業を行っているだけで、Java のメイン アプリがそれらを何かに使用しています。このプロジェクトで何を使用したかを誰かに聞かれたら、「Java と Python」と答えるでしょう。

于 2009-03-12T00:06:32.917 に答える
3

1 つのプロジェクトで複数の言語を使用するには、さまざまな方法があります。いくつかの例:

  • たとえば C で DLL を記述し、そのライブラリをたとえば VB プログラムから使用できます。
  • C++ などでサーバー プログラムを作成し、クライアントのさまざまな言語を実装することができます。
  • 多くの場合、Web プロジェクトでは多くの言語が使用されます。たとえば、SQL (クエリ言語) を使用してデータベースからデータを取得する、たとえば Java (プログラミング言語) で記述されたサーバー プログラムは、結果を HTML (マークアップ言語) でブラウザーに送信します。 Javascript (スクリプト言語) を使用してやり取りする...
于 2009-03-12T00:13:16.800 に答える
3

ひどく。緊急の必要がない場合は、1 つの言語に固執してください。依存関係と複雑さが増しています。しかし、興味深い機能を提供する既存のコードがある場合は、再作成するよりもそれらを結合する方が簡単な場合があります。

于 2009-03-12T00:14:28.623 に答える
2

言語のコードが直接対話できる方法がいくつかあります。コード間で渡されるデータがビットとバイトのレベルで正しい形式である限り、異なる言語が相互運用できない理由はありません。このアプローチは、従来の Windows DLL 開発で使用されます。異なるプラットフォームでも、正しい形式を取得できれば (興味がある場合はビッグ/リトルエンディアンを見てください)、リンカー (コンパイラーではない) がコードを結合する方法を知っている限り、それは機能します。

それ以外にも、言語が互いに対話できる方法は数多くあります。.Net の世界では、コードはすべての言語で同じ IL コードにコンパイルされます。このように、C# と VB.Net は内部ですべて同じであり、相互にシームレスに呼び出し/動作できます。

于 2009-03-12T00:09:09.273 に答える
2

プロジェクトの種類によって異なります。試してみたい場合は、.NET で Web プロジェクトをセットアップし、ページごとに言語を変更できます。疑似コードで示されているようには機能しませんが、複数の言語です。もちろん、実際のコード ディレクトリは単一の言語でなければなりません。

于 2009-03-12T00:02:18.137 に答える