web-dev-qa-db-ja.com

1つのプロジェクトで複数の言語がどのように相互作用しますか?

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

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

myProgram.callCfunction(parameters);

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

58
n00ki3

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

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

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

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

  • .NETプラットフォームで使用可能なさまざまな言語。これには、C#、VB.Net、J#、IronRuby、F#、XSLT、その他の人気のない多くの言語が含まれます。
  • C++またはVB=で作成されたネイティブCOMコンポーネントは、VBScript、VB、すべての.NET言語、Javaで使用できます。
  • Win32 API関数は、.NETまたはVBから呼び出すことができます
  • IPC(プロセス間通信)
  • Corba 、おそらく最も包括的な(そして最も複雑な)アプローチ
  • Webサービスおよびその他のサービス指向アーキテクチャ、おそらく最も近代的なアプローチ
26
Dirk Vollmar

一般に、適切なサイズのWebプロジェクトでは、HTML、CSS、Javascript、サーバー側の「取得」言語(ASP、JSP、Perl、PHPなどのCGIスクリプト)、およびいくつかのバリアントの約5つの言語を使用します。データベース接続のためのSQLの。

(もちろん、これはHTMLとCSSがプログラミング言語としてカウントされるかどうかについての議論を手放します-私は「チューリング完全言語ではないが、チューリング完全言語ではない」キャンプですが、それはまったく別のスレッドです。 )

これらすべてがどのように連携するかのいくつかの例:

ベストプラクティスの方法を採用している場合、Webページの構造はHTMLであり、表示方法の手順はCSSにあります。CSSは同じファイル内にある場合がありますが、そうである必要はありません。 CSSには、HTMLが参照するクラスの束が含まれており、それらを一緒にクリックする方法を判断するのはブラウザ次第です。

そのすべてをさらに一歩進めると、そのページのJavaScriptスクリプトは、存在するHTML/CSSのいずれかを変更できます(HTMLエンティティのコンテンツの変更、CSSクラスの別のクラスへの交換、CSSの動作の変更など)。 )これは、ドキュメントオブジェクトモデルと呼ばれるものを介してこれを行います。これは、本質的に言語とプラットフォームに依存しないAPIであり、オブジェクトのような方法でHTMLページを操作します(この時点で、ゆっくりと戻って、 関連するwiki記事 。)

しかし、その後、すべてのHTML/CSS/Javascriptはどこから来たのでしょうか?それがサーバーサイド言語の機能です。最も単純な形式では、サーバー側言語は、出力としてHTMLページを保持する巨大な文字列を返すプログラムです。これは明らかに、はるかに複雑になる可能性があります。HTMLフォームとクエリ文字列パラメーターをサーバー側プログラムの入力として使用すると、javascriptが送信するAJAXデータをサーバー言語に直接送信することもできます。また、サーバー言語がHTML、CSS、およびJavaScriptをカスタマイズして吐き出すこともできます。基本的に、ある言語のプログラムで別の言語のプログラムを記述します。

サーバー側の言語からSQLへの接続はほぼ同じように機能します。それをより複雑で安全にする方法はたくさんありますが、最も簡単な方法は、サーバー言語がSQLコマンドを含む文字列を動的に構築し、何らかのコネクタを介してデータベースに渡し、戻ることです結果セット。 (これは、someValue = database.executeThisSQLCommand(SQLString)に要約される関数を実際に持っている場合です。)

そのため、この場合の異なる言語は、実際にプログラムを互いに記述したり、誰もが理解できる非常に簡単で解析しやすい形式でデータを処理したりして通信します。 (主に文字列。)

14
Electrons_Ahoy

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

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

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

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

例として:

C#でメソッドを定義できます

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

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

 Hello()

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

一般的に言えば、一部の言語は他の言語よりも相互運用性が高く、特に言語の作成者が相互運用性を言語の機能として明確にした場合はそうです。

8
Alan

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

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

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

5
shsmurfy

私は(最後の数で)約8言語で構成される大規模なエンタープライズプロジェクトに取り組んでいます。通信の大部分は、複数の言語のバインディングを含むエンタープライズレベルのメッセージバスを介して行われ、データを利用してデータをやり取りします。 tibco と呼ばれます。

2
bedwyr

作業の大部分がJavaで行われるアプリを作成できますが、データパーサーや何かがPythonで書かれているものなど)ほぼ2つの独立したアプリです。おそらく、パーサーはファイルに対していくつかの作業を行ってから、Javaのメインアプリがそれらを何かのために使用しています。 「JavaとPython」と言います。

1
Carter

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

  1. 異なる言語を一緒に使用して1つのアプリケーションを構築します。たとえば、Javaを使用してGUIを構築し、JNIを使​​用してC APIにアクセスします(したがって、質問に答えると、Java;)からC関数を呼び出すことができます)
  2. 1つのプロジェクトで異なる言語を一緒に使用しますが、それらは同じアプリケーションの一部ではありません。例えば。現在、大量のテキストを使用するiphoneアプリを開発しています。現在、3つの言語を使用していますPython(テキストの元のソースを操作するため))、SQL(pythonアプリの結果をフォーマットiphone sqlite3 api)およびObjectiv Cから簡単にアクセスして、実際のアプリをビルドします。最終製品はObjective Cのみですが、最終製品に到達するために他の2つの言語を使用しました
1
hhafez

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

  • たとえば、CでDLLを記述し、そのライブラリをVBプログラムから使用できます。
  • たとえば、C++でサーバープログラムを記述し、クライアントのさまざまな言語実装を使用できます。
  • Webプロジェクトでは多くの場合、多くの言語が使用されます。たとえば、Java(プログラミング言語))で記述されたサーバープログラムは、SQL(クエリ言語)を使用してデータベースからデータを取得し、結果をHTMLでブラウザに送信します(ユーザーがJavascript(スクリプト言語)を使用して対話できるマークアップ言語).
1
Kieron

例のリストに追加するだけで、CまたはC++でPythonコードを最適化するか、Cライブラリを記述して別のライブラリをPythonにバインドするのが一般的です。

0
Jason Baker

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

0

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

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

0
MrTelly

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

0