これが広すぎるのかどうかはわかりませんが、私はまだ大学時代の私の若い年頃のプログラマーです。私はさまざまな言語をかなり理解していて、かなり良い基盤を持っているような気がします。しかし、たとえば、プログラムを作成しようとしていて、pythonで簡単に1つのパートを書いて、仕事をしているだけなのに、このプログラムにはCで記述した別のプログラムから出力を取得し、その速度のためにCを使用しています。2つの異なるプログラムと言語を相互に作用させて、全体として1つのプログラムを作成する方法がわかりません。確かにファイルに書き込むことができますが、pythonとCプログラムの両方がファイルにアクセスしている場合、ロックについて考える必要があります。
ほとんどの場合、これはファイルをプログラムにインポートすることで行われましたが、その場合、それらは同じ言語なので簡単にインポート機能を使用できますが、2つの言語/プログラムが相互作用して1つのまとまりのある出力を作成すると、問題が発生します。
学ぶためだけにいくつかの基本的なWebアプリケーションの作成に飛び込むことを考えていたので、この質問について考えていましたが、pythonまたは逆に。
ここには本当に簡単なものが足りなくて、理解していないような気がします。この質問の範囲が広すぎるが、オンラインで明確な回答が見つからなかった場合は申し訳ありません。オープンソースのウェブアプリを調べようとしましたが、回答を実際に把握できませんでした。質問が馬鹿げていると思われる場合は、ご容赦くださいこれは私がstackexchangeで読むのが好きなことを尋ねるのに良い場所です。
ご返信ありがとうございます。
異なる言語で書かれたコードは、さまざまな方法で相互作用することができます。
ソースレベルでは、ある言語から別の言語へのクロスコンパイルは、言語のいくつかの組み合わせで実行できます(たとえば、GoogleのGWTにはJava-to-JavaScriptスクリプトコンパイラが含まれ、Glasgow HaskellコンパイラはCにコンパイルできます;初期バージョンのC++ Cにコンパイル)。ほとんどの場合、これは実際には実現可能ではありません。
JVMや.NETランタイムなどの仮想プラットフォームを共有する言語は、通常、プラットフォームが公開するメカニズムを介して対話できます。たとえば、すべてのJVM言語はJavaライブラリにアクセスし、それらを使用して通信できます。また、メソッドを呼び出したり、他のJVM言語で作成されたクラスを使用したりできます。
Pythonを含む多くのプログラミング言語は、通常Cで記述されたネイティブライブラリとインターフェイスするメカニズムを提供します。このようなメカニズムを使用すると、より高度な別の言語からネイティブ関数を呼び出すことができます。一般的なライブラリには、バインディングがすぐに利用できることがよくあります。この手法は、通常 "Foreign Function Interface" と呼ばれます。 Python-to-Cインターフェースは [〜#〜] cffi [〜#〜] です。
別のオプションは、2つの完全に別個のプログラムを構築し、実行時にそれらを相互作用させることです。これを達成するためのさまざまなメカニズムがあります。最も簡単なのはパイプを使用する方法です(Pythonのsubprocess
モジュールを調べます)。基本的に、1つのプログラムが他のプログラムを呼び出し、入力をそのstdinに送信し、その結果をそのstdoutから読み取ります。これにより、一方のプログラムが他方のプログラムのサブプロセスになります。長寿命で独立して開始する必要がある場合は、名前付きパイプ、(ローカル)ネットワークソケット、共有ファイル、および(プラットフォームによっては)その他の方法でデータをやり取りできます。どちらが最適かは異なります。
2つのプログラムが相互に通信するには、確立されたいくつかの異なる方法があります。ファイルを共有することで、1つの明らかな問題と、1つの明らかな問題を特定しました。しかし、他の方法があります。
最近のほとんどのオペレーティングシステムには、 名前付きパイプ と呼ばれるメカニズムが含まれています。これは、基本的に、あるプログラムに入力端があり、別のプログラムに出力端があるデータストリームです。あるプログラムから同じコンピューターで実行されている別のプログラムにデータを送信する必要がある場合は、この方法が適しています。
1つのプログラムが他のプログラムを呼び出すために使用するAPIを設定する必要がある場合は、RPC(リモートプロシージャコール)を調べて、通常OSレベルでサポートすることもできます。
2つの異なるコンピューター上の2つのプログラム間で通信したい場合、状況はさらに複雑になります。次に、ネットワークとプロトコルを操作する必要があります。ソケットを開いて着信メッセージをリッスンし、それらを内部メソッド呼び出しにデコードして処理し、応答を返すには、いずれかのプログラムが必要です。 CやPythonなどのさまざまな言語でこの機能を提供するために利用できるライブラリはたくさんあります。
基本的に、どの方法を使用するかは、実行しようとしていることの詳細によって異なります。さまざまな形式の プロセス間通信 およびネットワークメッセージングについて調査を行うと、ニーズに最適なものを見つけることができるはずです。
メッセージの受け渡し は、ここで一般的な概念のように思われます。 COMコンポーネントと一部のJavaScriptでクラシックASPを使用して、同じアプリケーションで使用される3つの異なる言語の組み合わせを取得できます。
あなたが述べた例では、ロックはオペレーティングシステムがファイルシステムを処理するためのものではありませんか?各プログラムは、他のプログラムについて必ずしも覚えていない。
ほとんどのソフトウェアコンポーネントは、指示の観点から通信すべきではありませんが、データを送受信します。データベースとのやり取り、JSON/XMLリクエストの送受信などです。
問題の種類によっては、標準のシェルによるパイプの使用で十分な場合があります(シェルに入力します)。
プログラム1 |プログラム2
このようにして、program1の出力は直接program2の入力に行きます。もちろん、これはすべての問題に対して機能するわけではありませんが、多くの(非インタラクティブ)問題はこのアプローチを使用してうまく解決できます。