(ほぼ)任意のプログラミング言語から呼び出すことができる一連の関数を作成するにはどうすればよいですか?


33

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


4
マーケティング上の理由で「すべてをサポートしています」と言いたい場合は、低レベルのDLLまたは共有ライブラリをCで書くだけです。 Javaインターフェースをより良く提供します。
mjfgates

1
「(ほとんど)any」と言いますが、この目的のためにどの言語を除外しますか?それともあなたにとって最も重要なのはどれですか?
funkybro

22
ウェブサービス?例えばphpでいくつかの関数を書くことができます。ほとんどすべての言語には、Webページとのインターフェイス、引数の提供、結果の読み取りが可能です。
ピーターB

7
+1は興味深い質問だからです-しかし、なぜあなたはこれをしたいのかを言うことであなたの質問は改善されます。あなたの目標は何ですか?
TarkaDaal

@PieterB =>答え。
コンラッドルドルフ

回答:


44

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

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

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


具体的にはどのようなHTTPインターフェースを念頭に置いていますか?
アンダーソングリーン

@AndersonGreenそれは問題ではありません(ネットワークソケットを開くことができる言語はHTTPを話すことができるため)が、RESTは便利な擬似標準です。
モニカの復活

7
REST + JSONは合理的なソリューションになります
デビッドヘイズ

また、HTTPを使用して通信することで、ほとんどすべての言語がアプリケーションの機能とやり取りできるようになります。
ボリビアのみ

30

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が生成するコードは商用および非商用プロジェクトの両方と互換性があります...


32
C ++は恐ろしい選択です。それには多くの問題があります:ランタイムライブラリへの依存、不特定のABI(特にマングリング)など。C++ヘッダーからバインディングを生成することは非常に難しいです。SWIGは非常に限られたものです。Python Qtバインディングなど、複雑すぎるインフラストラクチャをすべてご覧ください。
SKロジック

14
@ SK-logic:そうでもない。Cには、C ++と同様にランタイムライブラリが必要です。ABIはC ++で制御できるextern "C"ため、外部でC互換性があります。したがって、あなたは、C ++(上位型の安全性、ライブラリ)が、C(事実上のABI規格)の外部利点の内部利点持っているか
MSalters

3
@ SK-logic不特定のABIは、単に解決された問題です。SWIG、Boost.Python、および他の言語バインディングのホストを参照してください。
コンラッドルドルフ

3
@MSaltersは、ライブラリの境界を越えた例外とその一般的な非workinessを忘れないでください
sehe

3
C ++提案の場合は-1。Cは簡単で、C ++は物事を不必要に難しくします。
アーネストフリードマンヒル

23

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

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

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

使用したいすべての言語をサポートするネットワークライブラリを見つけて、そのライブラリに関してAPIを実装できます。たとえば、ZeroMQを使用すると柔軟性が大幅に向上するため、ZeroMQインターフェイスを使用してAPIを記述します。 APIを呼び出す言語はすべてZeroMQクライアントライブラリを使用して呼び出す必要があります。幅広い言語をサポートし、最高のパフォーマンスを得るためにインプロセスおよびアウトプロセスの通信を可能にするライブラリを選択します。


APIを複数の言語で記述したい場合、どのような手順を踏む必要がありますか?(私の場合、これらの言語はJavascript、C ++、およびJavaです。)
アンダーソングリーン

言語ごとに3つの個別のRESTful APIを記述する必要がありますか?
アンダーソングリーン

これらの各言語で、元のC dllのロードと呼び出しを処理するネイティブラッパーを記述します。または、C ++で記述し、SWIGを使用してこれを行います。REST APIを使用している場合は、同じことが適用されます。1つのAPIを作成してから3つのラッパーを作成しますが、REST APIを作成する場合、各言語はREST APIを直接呼び出すことができます。ラッパー付き。
gbjbaanb

dll(ダイナミックリンクライブラリ)は、Windows以外のプラットフォームと互換性がありますか?ここでクロスプラットフォームの互換性が必要です。
アンダーソングリーン

いいえ、他のプラットフォーム用に再コンパイルする必要があります。たとえば、Linuxは.dllではなく.soを使用します。単純な再コンパイルだけが必要で、コードの変更はありません(または非常に小さな)。
gbjbaanb

12

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


コマンドラインの外部関数インターフェイスを作成するために、どのスクリプト言語やプログラミング言語をお勧めしますか?また、そのようなインターフェースの具体的な例を見つけましたか?
アンダーソングリーン

@AndersonGreen、適切なメタプログラミングを備えた言語であれば、そのような目的には問題ありません。例えば、Scheme、MetaLua、その他のさまざまな埋め込み可能なLisp、Tcl。独自のコマンド言語も簡単に実装できます。多くのCAD / CAEシステムはこの方法で動作します。すでに述べたTkは別の典型的な例です。
SKロジック

この方法でコマンドラインインターフェイスを使用するには、特定のコマンド(whoamiUbuntuでユーザー名を取得する場合など)のコンソール出力を取得しますか?
アンダーソングリーン

ほとんどの場合、@ AndersonGreen、stdinおよびstdoutのパイピングで十分です。
SKロジック

5

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

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

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

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

提供されているサービスの種類を考えると、どのような種類のAPIが適しているのかを示していないため、一般にこの質問は現実の世界では非常に広範であると思います。


2

上記の回答に追加して、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、およびその他の言語


Apache Thriftを使用して外部関数呼び出しを実行するにはどうすればよいですか?
アンダーソングリーン

0

paramsを使用して呼び出す関数を含むテキストファイルを任意の言語に書き出させてください。ディレクトリを監視し、process-call.txtが表示されたらアプリを動作させます。サーバーやネットワークプロトコルはありません。非コンピューター言語のメソッドでも関数を初期化できます。人でもテキストファイルを作成できます。

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

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

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


コマンドラインインターフェイスとstdin / stdoutだけを使用できる場合、非常に複雑に見えます。
モニカの復活

1
ブレンダン、さらに良いコールで++ 1できます。私は実際にそれを見たことはありませんが、昔々、人々はバイトを転送するためにカードに穴を開けていました。
パレシュクマール

4
これは冗談ですよね?ここでは行いません。
アーネストフリードマンヒル

fdiskと/ rootの部分は冗談ですが、私は5年以上にわたってプラットフォームの研究開発(開発者およびアナリスト)として関与し、数千万ドルで利益を生み出したプラットフォーム製品を作成しました。このタイプのRESTメソッドを使用して、クライアント用に出荷可能な何百万もの物理アイテム(pdfおよび電子メールではない)を吐き出します(アイテムごとに数百MBのファイルを処理します)。主要なシステムtriolgy-SAP-MS Office-PLC Drivewrs-PDFワークフローはすべて相互に連携し、従来のUTF-8テキストファイルとzipを含むzipを含むzipを含む、 HTTP bsオーバーヘッドはありません。
パレシュクマール

質問していいですか?JSONが冗談だと​​誰も考えないのはなぜですか?私が推奨したことはどう違うのですか?jsonを使用したか、または使用した可能性がありますが、2003年には使用されていませんでした。
パレシュクマール

0

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

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

  2. すべての関数は単純なデータ型を引数(ブール、整数、浮動小数点、定数、配列)として使用します。ポインターを使用する関数は一部の言語に翻訳するのが面倒な場合があるためです。

  3. 精度とsigned'nessを指定する独自の数値データ型を持っている(一方int floatなどは異なる場合がある)

結果として得られるAPIは、Cユーザーのみを対象とする場合に作成できる最も使いやすいC APIとは限りません。ただし、関数は別の言語にほとんど直接公開できることを意味します(たとえば、PyOpenGLのドキュメントには違いがリストされており、そのほとんどはごくわずかです)

この冗長なAPIに加えて、これをより「開発者に優しい」ラッパー(ゲームフレームワークなど)で記述することができます。

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