言語バインディング(または他のフレームワーク)を介して他のプログラミング言語からアクセスできるAPIを作成する方法を見つけたいです。これを行うことは可能ですか?もしそうなら、どのプログラミング言語が「クロスランゲージ」APIを書くのに最も適しているでしょうか?私の目標は、使用しているプログラミング言語からアクセスできる単一の関数セットを作成し、各言語でAPI全体を手動で書き直す必要がないようにすることです。
言語バインディング(または他のフレームワーク)を介して他のプログラミング言語からアクセスできるAPIを作成する方法を見つけたいです。これを行うことは可能ですか?もしそうなら、どのプログラミング言語が「クロスランゲージ」APIを書くのに最も適しているでしょうか?私の目標は、使用しているプログラミング言語からアクセスできる単一の関数セットを作成し、各言語でAPI全体を手動で書き直す必要がないようにすることです。
回答:
いくつかのオプションがあります:
HTTPインターフェースを作成すると、ほとんどすべてがHTTPで通信できるため、多くの言語を使用できます。
言語ランタイムにリンクできるものを作成します。多くの異なる言語に接続する方法を見つける必要があるため、これにはかなり時間がかかります。
CまたはC ++が目的に最も適していると思います。あなたは使用することができますSWIG(簡体ラッパーとインターフェイスジェネレータ)をお使いのCまたはC ++ APIから言語バインディングを生成します。
SWIGは、CおよびC ++で記述されたプログラムをさまざまな高レベルプログラミング言語と接続するソフトウェア開発ツールです。SWIGは、Perl、PHP、Python、Tcl、Rubyなどの一般的なスクリプト言語を含むさまざまな種類のターゲット言語で使用されます。サポートされている言語のリストC#、Common Lisp(CLISP、Allegro CL、CFFI、UFFI)、D、Go言語、Androidを含むJava、Lua、Modula-3、OCAML、Octave、Rなどの非スクリプト言語も含まれます。実装(Guile、MzScheme / Racket、Chicken)がサポートされています。SWIGは、高レベルのインタープリターまたはコンパイルされたプログラミング環境、ユーザーインターフェイスの作成、およびC / C ++ソフトウェアのテストとプロトタイピングのツールとして最も一般的に使用されます。SWIGは通常、C / C ++インターフェイスを解析し、上記のターゲット言語がC / C ++コードを呼び出すために必要な「グルーコード」を生成するために使用されます。SWIGは、XMLおよびLispのS式の形式で解析ツリーをエクスポートすることもできます。SWIGはフリーソフトウェアであり、SWIGが生成するコードは商用および非商用プロジェクトの両方と互換性があります...
extern "C"
ため、外部でC互換性があります。したがって、あなたは、C ++(上位型の安全性、ライブラリ)が、C(事実上のABI規格)の外部利点の内部利点持っているか
ほぼ2つの方法があります。
この変更に必要な作業は、使用するシステムによって異なります。たとえば、ソケットインターフェイスは機能しますが、クライアント側のライブラリは、httpライブラリに比べてより低レベルになる傾向があります。
使用したいすべての言語をサポートするネットワークライブラリを見つけて、そのライブラリに関してAPIを実装できます。たとえば、ZeroMQを使用すると柔軟性が大幅に向上するため、ZeroMQインターフェイスを使用してAPIを記述します。 APIを呼び出す言語はすべてZeroMQクライアントライブラリを使用して呼び出す必要があります。幅広い言語をサポートし、最高のパフォーマンスを得るためにインプロセスおよびアウトプロセスの通信を可能にするライブラリを選択します。
パフォーマンスと呼び出しの遅延が問題にならない場合は、包括的なコマンドラインインターフェイスを提供することを検討してください(おそらく、その上でスクリプト言語を使用する)。ImageMagickは、このような「API」の好例です。もう1つの良い例は、Tkツールキットです。
whoami
Ubuntuでユーザー名を取得する場合など)のコンソール出力を取得しますか?
APIとは、正確にはどういう意味ですか?
多くのプラットフォームでは、DLLまたは同様の構成にリンクできますが、特定のネイティブターゲット(Intel / ARM)またはエンディアンに合わせて再コンパイルする必要がありますか?特定のバイナリインターフェイスは、データ型の問題や構成(それらを十分にサポートしない言語に返そうとするポインター)により、特定の言語では依然として困難な場合があります。そのため、API自体の設計を考慮して、一部の言語を除外したり、それらの言語からの使用を面倒にしたりします。
CやDLLのバイナリエンドポイントに基づいたインターフェイスのような移植性のあるものは、ほとんどのプラットフォームおよびほとんどの言語で問題なく、一般的に呼び出すことができますが、異なる方法でコンパイルしたり、異なるフレーバーで提供したり、異なる静的ライブラリにリンクする必要があります。
ライブラリまたはサービスを記述する言語の選択、または定義によって、APIが公開するプラットフォーム/サービスについて詳しく説明するまでは、質問に固有のものではないように思えます。ネットワークスタックが利用可能であり、直接リンクされた関数呼び出しレベルのパフォーマンスが要件でないと想定できる場合、APIは、クライアント言語の要求を透過的にするための何らかのシムを使用してHTTPベースにすることができます。
提供されているサービスの種類を考えると、どのような種類のAPIが適しているのかを示していないため、一般にこの質問は現実の世界では非常に広範であると思います。
上記の回答に追加して、RPCメカニズムの使用を提案します。Apache Thriftを使用できます(http://thrift.apache.org/)。基本的にはRPCフレームワークです。
Thrift wikiによると:
Apache Thriftソフトウェアフレームワークは、スケーラブルな言語間サービス開発のために、ソフトウェアスタックとコード生成エンジンを組み合わせて、C ++、Java、Python、PHP、Ruby、Erlang、Perl、Haskell、C#の間で効率的かつシームレスに動作するサービスを構築します。 Cocoa、JavaScript、Node.js、Smalltalk、OCaml、Delphi、およびその他の言語
paramsを使用して呼び出す関数を含むテキストファイルを任意の言語に書き出させてください。ディレクトリを監視し、process-call.txtが表示されたらアプリを動作させます。サーバーやネットワークプロトコルはありません。非コンピューター言語のメソッドでも関数を初期化できます。人でもテキストファイルを作成できます。
コンテンツは次のようになります。
Call-method: fdisk()
Params: (string) "/root", (string) "write-back-file-expected.txt"
;)答えを得るまで永遠に待つかもしれません。数バイトを他のプロセスにプッシュするだけで済みますが、それが仕様全体ではないと確信しています。
OpenGLは、あなたが説明するものの良い例です-それは、Cで書かれたAPIであり、他の言語のバインディングを簡単に記述できるように設計されています
Cライブラリはほとんどのプログラミング言語から呼び出すことができます(通常、コンパイルされた拡張機能、またはPyPyのctypes
ライブラリなど)。
すべての関数は単純なデータ型を引数(ブール、整数、浮動小数点、定数、配列)として使用します。ポインターを使用する関数は一部の言語に翻訳するのが面倒な場合があるためです。
int
float
などは異なる場合がある)結果として得られるAPIは、Cユーザーのみを対象とする場合に作成できる最も使いやすいC APIとは限りません。ただし、関数は別の言語にほとんど直接公開できることを意味します(たとえば、PyOpenGLのドキュメントには違いがリストされており、そのほとんどはごくわずかです)
この冗長なAPIに加えて、これをより「開発者に優しい」ラッパー(ゲームフレームワークなど)で記述することができます。