問題タブ [ffi]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
ruby-on-rails - Ruby FFI - exit() への C 呼び出しのトラップ
カスタム RPC システムへの FFI バインディングを備えた Rails アプリケーションがあります。残念ながら、C コードはexit()
RPC サーバーに接続できないときに呼び出し、Rails アプリケーション全体を終了させます。
exit()
Rubyで呼び出しをトラップすることは可能ですか? Cコードを変更する必要はありません。
haskell - GHC7のFFIスタブ
いくつかのFFIコードを含むHaskellモジュールをコンパイルしようとしています。以前は、GHC6とカスタムGHC7を備えた古いHaskellプラットフォームで動作し、64ビットバージョンを取得していました。
64ビットバージョンのGHC7を搭載した最新のHaskellプラットフォームにアップグレードすると、動作が停止します。GCCは、GHCが吐き出すスタブファイルに問題があるようです。標準のCファイルを見つけるのに問題があるGHCフレームワークヘッダーを使用しています。これが私が得ている多くのエラーの1つにすぎません:
プラットフォームの32ビットバージョンでも同じ問題があるようです。同じ標準ファイルが通常のGCCコンパイルで正しく機能します。なぜこれが機能しないのですか?
ruby - RubyFFI で関数の戻り値として構造体を指定するにはどうすればよいですか?
ライブラリ自体から構造を返すいくつかの関数をロードする必要があります。
RubyFFI の Wiki ページは古くなっているようで、ここで少し迷っています。
を作成するFFI::Struct
方法と、それをネイティブ関数の戻り値の型として指定する方法を教えてください。
ruby - Ruby コードを保護する
私は Ruby アプリを書いていて、いくつかの極秘アルゴリズムを使いたいと思っています。では、不正アクセスからそれらを保護するにはどうすればよいでしょうか。
私には2つのアイデアがあります:
- Cで書いてFFIで読み込んでみよう(こんな風にできるのかな)
- ruby コードをマーシャリングし、エンコードしてからファイルに保存する
誰かがより良いアイデアを知っているか、これらのアイデアがばかげているか間違っていることを教えてくれるかもしれません。アドバイスありがとう。
language-agnostic - 外部関数インターフェイス (FFI) と言語バインディングを理解する
異なるプログラミング言語を混在させることは、長い間私にはよく理解できませんでした。このウィキペディアの記事によると、外部関数インターフェイス (または FFI) はいくつかの方法で実行できます。
- ホスト言語呼び出し可能にするゲスト言語関数を特定の方法で指定または実装することを要求する。多くの場合、ある種の互換性ライブラリを使用します。
- 必要な翻訳を実行する適切なグルー コードでゲスト言語関数を自動的に「ラップ」するツールの使用。
- ラッパー ライブラリの使用
- 言語間で使用できるホスト言語機能のセットを制限します。たとえば、C から呼び出される C++ 関数は、(一般に) 参照パラメーターを含めたり、例外をスローしたりしない場合があります。
私の質問:
1番目、2番目、3番目の方法の違いは何ですか? それらはすべて、呼び出された言語のコードをオブジェクトファイルとヘッダーファイルを含むライブラリにコンパイルし、呼び出し言語によって呼び出されるように思えます。
リンクされているあるソースによると、FFI の実装はいくつかの方法で行うことができます。
- ターゲット言語で呼び出された関数が特定のプロトコルを実装することを要求します。
- 特定の低言語関数を受け取り、それをコードで「ラップ」して、高レベル言語規則との間でデータ変換を行うラッパー ライブラリを実装します。
- 高レベル機能のサブセット (低レベル言語と互換性がある) を使用するために、ネイティブとして宣言された関数を要求する。
リンクされたソースの最初の方法がウィキペディアの最初の方法と同じかどうか疑問に思っていましたか?
このソースの 3 番目の方法はどういう意味ですか? ウィキペディアの4番目の方法に対応していますか?
同じソースで、リストされている 3 つの方法を比較すると、2 つの言語の間のギャップを埋める仕事が、呼び出された言語から呼び出した言語に徐々に移行していると言えます。私はそれをどのように理解するのだろうかと思っていました。この変化は、ウィキペディアの 4 つの方法にも当てはまりますか?
言語バインディングと FFI は同等の概念ですか? それらはどのように関連し、異なるのでしょうか?
プログラミング言語からライブラリまたは OS サービスへのバインディングは、言語でそのサービスを提供する API です。
ウィキペディアまたはソースからの引用で、次の各例がどの方法に属しているのか疑問に思っていましたか?
- 共通オブジェクト リクエスト ブローカ アーキテクチャ (CORBA)
- C++ で extern "C" 宣言を使用して C++ で C を呼び出し、名前マングリングを無効にします。
- MATLAB Interface to Shared Libraries を使用して Matlab で C を呼び出す。つまり、最初に gcc などの一般的な C コンパイラを介して C コードを共有ライブラリにコンパイルし、次に Matlab 関数 loadlibrary()、calllib を介して共有ライブラリをロード、関数の呼び出し、およびアンロードします。 () および unloadlibrary()。
- C/C++ 言語 MEX ファイルを作成して、Matlab で C を呼び出す
- mcc コンパイラーによる C での Matlab の呼び出し
- Java での C++ の呼び出し ( JNIによる) および C++ での Java の呼び出し (これもJNIによる)
- SWIGを使用して、他の言語で C/C++ を呼び出す
- Ctypes moduleを使用して、Python で C を呼び出し ます。
- シトン
- RPyによる Python での R の呼び出し
- Python、Fortran、Java などのさまざまな言語から OpenGL へのプログラミング言語バインディング
- C++、Python、Java、Common Lisp などのさまざまな言語からのCairoなどの C ライブラリのバインディング
scheme - ギャンビットスキームFFI
ffi を使用して opencv の cvReleaseCapture を呼び出そうとしていますが、
void cvReleaseCapture( CvCapture** キャプチャ );
http://www.ai.rug.nl/vakinformatie/pas/content/Highgui/opencvref_highgui.htm
私が試してみました、
(定義リリース キャプチャ (c-ラムダ ((ポインター (ポインター "CvCapture"))) void "cvReleaseCapture"))
うまくいきませんでした。
haskell - Haskell、FFI、Grand Central Dispatch?
FreeBSD、OSX、iOSでのC/Objective-Cの環境でうまく機能する関数型言語を検討しています。私の最善の策は、Haskellで記述された特定の関数用の関数型ライブラリを作成し、GHCでコンパイルし、FFIを使用してこの関数型コードを標準のC呼び出しとして呼び出すことです。
私の質問は、この状況で並行性をどのように処理するかです。 関数型言語を使用する動機の1つは、不変のデータセットを操作したいという問題に対して、多くの並列化を実行したいということです。ただし、ここで詳しく説明するアプローチを使用すると、並列化は可能ですか?コンパイルして2つのスレッドを使用するように指示できるようですが、スレッドの代わりにGCDを使用する方法はありますか(プラットフォームごとに自動的にスケーリングされる並列化の量など、GCDがスレッドよりも優れているすべての理由で)?または、私が説明しているようにFFIを使用すると、マルチスレッド機能が完全に失われますか?
この言語は私がやろうとしていることと最もよく一致しているように見えますが、本当にそれを学ぶためにかなりの時間を費やす前に、それが適切かどうかを学びたいと思います
haskell - pdflib用のHaskellFFI
64 linuxでc2hsを使用してpdflibライブラリ(pdflib.com)のffiを書き込もうとしています。あなたは彼らのウェブサイトから無料でpdflibをダウンロードすることができます(完全に機能的な評価)。
彼らのhello.cデモプログラムをコンパイルして実行しようとしましたが、正常に動作します。
私が理解している限り、それを機能させるために必要なファイルはpdflib.hとlibpdf.aの2つだけです。
だから私はそれらの両方をhelloフォルダに入れ、chsファイルを書きました、それはコンパイルしてhsファイルをうまく生成します。しかし、Hello.hsプログラムをコンパイルしようとすると、cabalが文句を言います。
Cabal:外部ライブラリへの依存関係がありません:* Cライブラリがありません:pdflib
--extra-include-dirsと--extra-lib-dirsを使用してフォルダー名を付けてみましたが、役に立ちません。
pdflib.hファイルとlibpdf.aファイルを使用してhaskellプログラムをコンパイルするにはどうすればよいですか?
macos - エラー: ffi のインストール中にエラーが発生しました: エラー: gem ネイティブ拡張機能のビルドに失敗しました
Mac 64 ビットでこのエラーが発生し、マシンに xcode がインストールされています。
performance - Haskell FFI / Cのパフォーマンスに関する考慮事項?
C プログラムから呼び出されるライブラリとして Haskell を使用している場合、それを呼び出すとパフォーマンスにどのような影響がありますか? たとえば、たとえば 20kB のデータのワールド データ セットに問題があり、次のようなものを実行したい場合:
ここで何が起こるでしょうか - その 20kB のデータを、Haskell コードによってアクセスされるグローバルな不変参照としてどこかに保持することは可能でしょうか? それとも毎回そのデータのコピーを作成する必要がありますか?
懸念されるのは、このデータがさらに大きくなる可能性があることです。また、Haskell コードの複数の呼び出しで使用される不変データの同じパターンを使用して、はるかに大きなデータ セットに作用するアルゴリズムを書きたいと考えています。
また、dispatch_apply() GCD や Parallel.ForEach(..) C# のように、これを並列化したいです。Haskell の外で並列化する私の論理的根拠は、常に多くの個別の関数呼び出し、つまり 1000 のアクターを操作することを知っているためです。そのため、Haskell 関数内で細粒度の並列化を使用することは、C レベルで管理することに勝るものはありません。FFI Haskell インスタンスを「スレッドセーフ」で実行していますか?これを実現するにはどうすればよいですか? 並列実行を開始するたびに Haskell インスタンスを初期化する必要がありますか? (私がしなければならない場合は遅いようです..) 良いパフォーマンスでこれを達成するにはどうすればよいですか?