2

言語を学びながら、Haskell でプログラムを開発するのに数日を費やしました。Arpack (Fortran ライブラリ) または Arpack++ (Arpack の C++ ラッパー) を呼び出す必要があることに気付きました。Haskell バインディングを使用した Lanczos メソッドの適切な実装が見つかりません。経験豊富な Haskell プログラマーで、これがどれほど難しいかについて意見を持っている人はいますか?

「.so」(「共有オブジェクト」) バージョンの libarpack と libarpack++ を Ubuntu のリポジトリからインストールできましたが、それで十分かどうかはわかりません。最終的にはソース コードから Arpack++ をビルドする必要があると思いますが、これは可能ですが、多くのビルド エラーが発生しているため、時間がかかります。それらを生成するために使用されたヘッダーファイルのバージョンを正確に知らずに、「.so」ファイルだけを使用する方法はありますか?

最もよく維持されている Haskell/C ブリッジのように見えるので、GreenCard の使用を検討しています。ただし、ドキュメントがあまり見つからないので、C++ もサポートするかどうか疑問に思っています。

また、プログラムを Python で書き直し、scipy を使用して Arpack を呼び出す必要があるかどうかも考え始めていますが、すでに Haskell の作成に数日を費やしています。私も Haskell がとても好きなので、これがうまくいくことを願っています。私の全体的な質問はこれだと思います:Haskellでこれを機能させるには何が必要ですか?

どうもありがとう。

4

2 に答える 2

1

Haskell の C/Fortran ライブラリを使用することは、Foreign Function Interface の助けを借りて確かに可能であり、それほど複雑ではないと言えます。ここに紹介があります。私の理解では、コードを再コンパイルする必要なく、C 呼び出し規則を使用して何でも呼び出すことができ、おそらく Fortran でさえも呼び出すことができるはずです。唯一の例外は、関数呼び出しのように見えるが実際にはマクロである場合です。この場合、マクロが何をするかを理解し、Haskell で再現する必要があります。

グリーンカードの時点で、私はそれを使用したことがないので、保証することはできません.

Python を使用するという 2 番目のアイデアにより、数日以上節約できる可能性があります。悲しいことに、変化する要件に簡単に適応するように Haskell コードを管理したことは一度もありませんが、Python ではそれは些細なことだと思います。もちろん、それは言語のせいではなく、Haskell のスキルや思考プロセスの制限である可能性があります。

于 2012-08-07T04:34:24.080 に答える
1

ELF 形式は、実行可能ファイルと共有ライブラリの標準形式であるため、これらのコンパイル済みモジュール内のコードにアクセスするには、関数名を知っているだけです。私の理解が正しければ、Fortran はC と相互運用可能です。結果として、Fortran は、Haskell を含む C バインディングを使用できる任意の言語と相互運用できる必要があります。参考までに、ツールを使用して、モジュール (実行可能オブジェクト、共有オブジェクト、または単純なオブジェクト アーカイブ) によってエクスポートされたすべての名前を見つけることができます (nm通常、すべての Linux ディストリビューションでデフォルトで利用可能です)。もちろん、これはバイナリファイルが「削除」されていない場合に機能しますが、知る限り、一般的な方法ではありません。

しかし、Haskell は C++ バインディングを正しい方法で使用することはできません。なぜなら、C++ ポリモーフィング機能には名前マングリングが必要であり、この名前変換の方法はコンパイラに大きく依存するからです。Haskell に固有ではない、よく知られた問題です。もちろん、C++ 共有オブジェクトからエクスポートされたシンボルのリストを取得してから、FFI を使用してそれらをバインドすることもできますが、それは価値がありません。

デザインが言ったように、Foreign Function Interface GHC機能を使用して、外部コードへのバインディングを作成できます。必要なのは、ライブラリ ヘッダー (およびもちろんライブラリ自体) だけです。ヘッダー ファイル (*.h) になる C 言語の場合、ライブラリは Fortran で記述されているため、ライブラリ ソースで類似のヘッダー ファイルを見つけ、このページを参照して Fortran と C の型を一致させてから、使用する必要があります。 FFI バインディングを書き込むためのこの情報。最初に C バインディングを作成する、つまり C ヘッダーを作成することをお勧めします。その後、c2hs などの自動 FFI バインド プログラムを使用することもできます。

C++ バインディングに目を通すことも役立つかもしれません。上記のヘッダーファイルが含まれている可能性があります。1 つあれば、FFI バインディングを作成することは、他のライブラリ用に作成することより難しくありません。

したがって、完全に不可能というわけではありませんが、徹底的な作業が必要になる場合があります。科学的/純粋な計算ライブラリへのバインディングを記述することは、多くの IO を実行し、独自の内部状態を保持するシステム ライブラリに対してバインディングを記述するよりもはるかに簡単ですが、このライブラリは C で記述されていないため、.より簡単な代替案に時間を投資してください。scipy については何も言えませんが、使ったことはありませんが、言語としての Python は Haskell よりもはるかに単純なので、良い代替手段になるかもしれません。

于 2012-08-07T07:26:23.257 に答える