web-dev-qa-db-ja.com

(ほぼ)すべてのプログラミング言語から呼び出すことができる関数のセットをどのように記述できますか?

言語バインディング(または他のフレームワーク)を介して他のプログラミング言語からアクセスできるAPIを作成する方法を見つけたいのですが。これは可能ですか?もしそうなら、どのプログラミング言語が「クロスランゲージ」APIを書くのに最も適していますか?私の目標は、使用しているプログラミング言語からアクセスできる単一の関数セットを作成することです。これにより、各言語でAPI全体を手動で書き直す必要がなくなります。

33
Anderson Green

いくつかのオプションがあります。

  1. HTTPインターフェースを作成します。ほとんどすべてがHTTPを使用できるため、多くの言語を使用できます。

  2. 言語ランタイムにリンクできるものを作成します。多くの異なる言語に接続する方法を見つける必要があるため、これはかなり時間がかかります。

44
Zachary K

あなたの目的にはCまたはC++が最適だと思います。 SWIG(Simplified Wrapper and Interface Generator) を使用して、CまたはC++ APIから言語バインディングを生成できます。

SWIGは、CおよびC++で記述されたプログラムをさまざまな高水準プログラミング言語と接続するソフトウェア開発ツールです。 SWIGは、Perl、PHP、Python、Tcl、Rubyなどの一般的なスクリプト言語を含むさまざまなタイプのターゲット言語で使用されます。 サポートされている言語 のリストには、C#、Common LISP(CLISP、Allegro CL、CFFI、UFFI)、D、Go言語などの非スクリプト言語も含まれますJava Android、Lua、Modula-3、OCAML、Octave、Rを含みます。また、解釈およびコンパイルされたいくつかのScheme実装(Guile、MzScheme/Racket、Chicken)がサポートされています。SWIGは、高レベルの解釈またはコンパイルされたプログラミング環境を作成するために最もよく使用されます。ユーザーインターフェイス、およびC/C++ソフトウェアのテストとプロトタイピングのためのツールとして。SWIGは通常、C/C++インターフェイスを解析し、上記のターゲット言語がC/C++コードを呼び出すために必要な「グルーコード」を生成するために使用されます。SWIGはまた、構文解析ツリーをXMLおよびLISP s式の形式でエクスポートします。SWIGはフリーソフトウェアであり、SWIGが生成するコードは、商用プロジェクトと非商用プロジェクトの両方と互換性があります...

30
LMC

ほぼ2つの方法があります。

  • c API。実際にこれまでにあった言語は、Cライブラリをロードしてその関数を呼び出します。これを行う方法は、ソース言語によって異なります。
  • ある種のRPCメカニズム。これは、REST HTTP経由で実行されているAPI、またはソケット経由で実行されているバイナリインターフェイスです。最も一般的な分母メカニズム(例:ソケット)を使用しない限り、クライアントが存在しないリスクがあります。アクセスルーチン(たとえば、一部の言語には、SOAPを使用して実装されたAPIを呼び出す権利がないSOAPクライアント、または相互運用性の問題がある)。最も単純なHTTP/RESTインターフェース、またはソケットソケットには、クライアントにインターフェースを公開するためのHTTPサーバーが不要であり、クライアントと同じサーバーでより簡単に実行でき、パフォーマンスが向上するという利点があります。

使用するシステムに応じてこの変更に必要な作業は変わります。たとえば、ソケットインターフェースは機能しますが、クライアント側のライブラリは、httpライブラリに比べて低レベルになる傾向があります。

使用したいすべての言語をサポートするネットワークライブラリを見つけて、そのライブラリの観点からAPIを実装してみてください。たとえば、ZeroMQを使用すると柔軟性が大幅に向上するため、ZeroMQインターフェースを使用してAPIを記述します。次に、APIを呼び出す言語は、ZeroMQクライアントライブラリを使用して呼び出す必要があります。幅広い言語をサポートするライブラリを選択し、最高のパフォーマンスを得るためにインプロセスおよびアウトプロセスのコミュニケーションを可能にします。

23
gbjbaanb

パフォーマンスと通話遅延が問題にならない場合は、包括的なコマンドラインインターフェイスを提供することを検討してください(おそらく、その上にスクリプト言語を使用します)。 ImageMagickは、このような「API」の良い例です。別の良い例はTkツールキットです。

12
SK-logic

APIでは、正確にはどういう意味ですか?

多くのプラットフォームでは、DLLまたは同様の構造にリンクできますが、特定のネイティブターゲット(Intel/ARM)またはエンディアンに対応するために再コンパイルする必要がありますか?特定のバイナリインターフェイスがデータ型の問題や構造(ポインタを適切にサポートしていない言語に戻そうとしているポインタ)があるため、特定の言語では依然として問題があるため、一部の言語を除外しないように、API自体の設計も考慮する必要があります。それらの言語からの使用は面倒です。

Cのような移植可能なものや、DLLのバイナリエンドポイントに基づくインターフェイスは、ほとんどのプラットフォームおよびほとんどの言語で問題なく一般的に呼び出すことができますが、別の方法でコンパイルしたり、異なるフレーバーまたは異なる静的ライブラリにリンクされています。

ライブラリやサービスなどを記述する言語の選択は、APIが公開するプラットフォーム/サービスについて詳しく説明するまでは、本質的に質問の本質ではないようです。ネットワークスタックが利用可能であり、直接リンクされた関数呼び出しレベルのパフォーマンスが要件ではないと想定できる場合、APIは簡単にHTTPベースで、クライアント言語が要求を透過的にするための何らかのシムを使用できます。

提供されているサービスの種類を考えると、どの種類のAPIが適切であるかについての指示がないため、この質問は一般に、現実の世界で役立つには広すぎると思います。

5
Cade Roux

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およびその他の言語

2
gt5050

Paramsで呼び出す関数を含むテキストファイルを任意の言語で書き出してもらいます。「私はだれとでも仲良く」アプリでディレクトリを監視し、process-call.txtが見つかればそれが機能するようにします。サーバーやネットワークプロトコルはありません。非コンピューター言語のメソッドでも関数を初期化できます。人でもテキストファイルを作成できます。

コンテンツは次のようになります。

Call-method:  fdisk()
Params:  (string) "/root", (string) "write-back-file-expected.txt"

;)しかし、答えが出るまで永遠に待つかもしれません。他のプロセスに数バイトをプッシュする必要があるだけですが、それが仕様全体ではないことは確かです。

0
Pareshkumar

OpenGLはあなたが説明するものの良い例です-これはCで書かれたAPIであり、他の言語でのバインディングを簡単に作成できるように設計されています

  1. ほとんどのプログラミング言語からCライブラリを呼び出すことができます(通常、コンパイルされた拡張機能、またはPyPyのctypesライブラリなど)。

  2. すべての関数は、引数として単純なデータ型(ブール値、整数、浮動小数点、定数、配列)を取ります。ポインタを取る関数は、一部の言語に変換するのが面倒なので、

  3. 独自の数値データ型を持ち、精度と符号付きを指定します(intfloatなどは異なる場合があります)

結果のAPIは、Cユーザーのみを対象とする場合に作成できる、最も使いやすいC APIであるとは限りません。しかし、それは関数が別の言語にほぼ直接公開される可能性があることを意味します(例 PyOpenGL docsは違いをリストしますが、そのほとんどはかなり最小限です)

この詳細なAPIに加えて、この周りに「開発者が使いやすい」ラッパー(ゲームフレームワークなど)を記述できます。

0
dbr