2つの異なる言語で2つの異なるプログラミングをやり取りするにはどうすればよいですか?


26

これが広すぎるかどうかはわかりませんが、私はまだ大学の若いプログラマーです。私は、さまざまな言語について十分に理解しており、かなり良い基盤を持っていると感じています。しかし、たとえば、プログラムを作成しようとしていて、Pythonで簡単に作業できるという理由だけでPythonの一部を書いたとしますが、このプログラムは、私が書いた別のプログラムから出力を取得する必要があるとしたらどうでしょうかCで私はその速度のためにCを使用しています。2つの異なるプログラムと言語を相互作用させて、全体で1つのプログラムを作成する方法がわかりません。私はあなたがファイルに書き込むことができると確信しているが、それからpythonとCプログラムの両方がファイルにアクセスする場合、ロックを考える必要があると思う。

ほとんどの場合、これはファイルをプログラムにインポートすることでしたが、その場合、ファイルは同じ言語なので簡単にインポート機能を使用しますが、2つの言語/プログラムが相互作用して1つのまとまりのある出力を作成すると問題が発生します。

学ぶためだけにいくつかの基本的なWebアプリケーションを作成することを考えていたので、この質問について考えていましたが、pythonまたはその逆で書いたものとjavascriptファイルをインタラクティブに言う方法がわかりません。

ここで本当に簡単なことを見逃しているだけで、理解していないように感じます。この質問が広すぎる場合は申し訳ありませんが、オンラインで明確な答えを見つけることができなかった場合、オープンソースのwebappを調べようとしていましたが、それから答えを実際に把握できませんでした。これは、stackexchangeで読むのが好きな人に尋ねるのに適した場所です。

返信ありがとうございます。


Swigがあることは知っていますが、あなたがしたいことをしているようですが、私はそれを使っていません。だからあなたはそれを試してみてください:)。
user712092

1
質問には2つのまったく関係のない主題が含まれていることに注意してください。1つは同じホストの2つのプロセス/アプリケーション間の一般的な通信、もう1つはクライアントのJSとサーバーのpythonを使用した通常のWebサーバー/クライアントアーキテクチャです。
ジョアンピント

LAMPのコンセプトを確認しましたか?データベースを介して多くの通信を行うことができます。
–SDsolar

回答:


28

異なる言語で記述されたコードは、さまざまな方法で対話できます。

ソースレベルでは、ある言語から別の言語へのクロスコンパイルをいくつかの言語の組み合わせで実行できます(たとえば、GoogleのGWTにはjava-to-javascriptコンパイラが含まれています; Glasgow HaskellコンパイラはCにコンパイルできます; C ++の初期バージョンCにコンパイルされます。ほとんどの場合、しかしこれは実際には実行できません。

JVMや.NETランタイムなどの仮想プラットフォームを共有する言語は、通常、プラットフォームによって公開されるメカニズムを介して対話できます。たとえば、すべてのJVM言語はJavaライブラリにアクセスし、それらを使用して相互に通信し、メソッドを呼び出すことができます他のJVM言語で作成されたクラスを使用します。

Pythonを含む多くのプログラミング言語は、通常Cで記述されたネイティブライブラリとインターフェイスするメカニズムを提供します。このようなメカニズムを使用すると、別のより高度な言語からネイティブ関数を呼び出すことができます。人気のあるライブラリには、多くの場合、すぐに利用できるバインディングがあります。この手法は通常、「外部関数インターフェース」と呼ばれます。Python-into-CインターフェースはCFFIです。

別のオプションは、2つの完全に独立したプログラムをビルドし、実行時にそれらを対話させることです。これを達成するためのさまざまなメカニズムがあります。最も簡単な方法は、パイプを使用することsubprocessです(Python のモジュールを調べます)。基本的に、1つのプログラムが他のプログラムを呼び出して、入力をstdinに送信し、その結果をstdoutから読み取ります。これにより、1つのプログラムが他のプログラムのサブプロセスになります。長寿命で独立して起動する必要がある場合、データは名前付きパイプ、(ローカル)ネットワークソケット、共有ファイル、および(プラットフォームに応じて)他の方法でやり取りできます。どちらが最適かは異なります。


素晴らしい答え。別の可能性は、ゲーム開発のためにC ++とLuaの間で一般的に行われる、インタープリターをプライマリプログラムに埋め込むことです。:または、グリーンスパンの第十則参照en.wikipedia.org/wiki/Greenspun%27s_tenth_rule
アンドリュー・

11

2つのプログラムが互いに通信するためのいくつかの異なる確立された方法があります。ファイルを共有することで明らかな問題を1つ特定し、明らかに困難な問題を1つ特定しました。しかし、他の方法があります。

最新のオペレーティングシステムには、名前付きパイプと呼ばれるメカニズムが含まれています。これは、基本的には1つのプログラムに入力端があり、別のプログラムに出力端があるデータストリームです。あるプログラムから同じコンピューターで実行されている別のプログラムにデータを送信する必要がある場合は、これを使用するのが適切な方法です。

1つのプログラムが他のプログラムを呼び出すために使用するAPIを設定する必要がある場合、通常はOSレベルでサポートされているRPC(リモートプロシージャコール)を調べることができます。

2台の異なるコンピューター上の2つのプログラム間で通信する場合、事態はさらに複雑になります。次に、ネットワークとプロトコルを操作する必要があります。ソケットを開いて着信メッセージをリッスンし、それらを内部メソッド呼び出しにデコードし、処理して応答を返すことができるプログラムの1つが必要です。CやPythonなど、さまざまな言語でこの機能を提供するためのライブラリがたくさんあります。

基本的に、どの方法を使用すべきかは、あなたがしようとしていることの詳細に依存します。さまざまな形式のプロセス間通信およびネットワークメッセージングに関する調査を行うと、ニーズに最適なものを見つけることができるはずです。


2

ここでは、異なる言語と対話できるさまざまな例があるため、メッセージの受け渡しが一般的な概念のように思われます。たとえば、COMコンポーネントと一部のJavaScriptを使用する従来のASPを使用して、同じアプリケーションで3つの異なる言語を使用できます。

あなたが述べている例では、ロックはオペレーティングシステムがファイルシステムで処理するものではないでしょうか?各プログラムは、他のプログラムについては必ずしも覚えていません。


0

ほとんどのソフトウェアコンポーネントは、指示に関して通信するのではなく、データを送受信します。データベースとの対話、JSON / XMLリクエストの送受信などです。


0

問題のタイプに応じて、パイプの標準シェル使用で十分な場合があります(シェルに入力します)。

プログラム1 | program2

このようにして、program1の出力はprogram2の入力に直接送られます。もちろん、これはすべての問題で機能するわけではありませんが、このアプローチを使用すると、多くの(非対話型)問題をうまく解決できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.