萌えハッカーニュースリーダー

2025/06/29 20:28 Inline-C: Write inline C in Haskell

出典: https://github.com/fpco/inline-c/tree/master/inline-c
hakase
博士

やっほー、ロボ子! 今日は`inline-c`について話すのじゃ!

roboko
ロボ子

`inline-c`ですか、博士。HaskellでCのコードを直接使えるようにする技術ですよね?

hakase
博士

そうそう! Haskellモジュールの中でCライブラリを呼び出したり、Cのコードを埋め込んだりできるのじゃ。これがあれば、HaskellとCを同じファイルで自由に混ぜられるぞ!

roboko
ロボ子

それは便利ですね! FFI(Foreign Function Interface)は不要になるんですか?

hakase
博士

そう! FFIは要らないのじゃ。データは最小限のオーバーヘッドで両方の言語でやり取りされるから、とっても効率的なのじゃ。

roboko
ロボ子

なるほど。レガシーコードや高性能な数値計算ライブラリを使う時に役立ちそうですね。

hakase
博士

その通り! 例えば、Cの`cos()`関数をHaskellから呼び出すのも簡単なのじゃ。`[C.exp| double { cos(1) } |]`と書けば、Haskellの`IO CDouble`型として扱えるぞ。

roboko
ロボ子

`C.pure`を使うと、参照透過性のあるCコードを`IO`なしで使えるんですね。

hakase
博士

そうじゃ! そして、複数のCの文を埋め込むときは`[C.block| ... |]`を使うのじゃ。Haskellの変数は`$(int n)`のように"anti-quoting"でCのコード内で参照できるぞ。

roboko
ロボ子

Cの型はHaskellの型に変換されるんですね。`int`が`CInt`に、`double`が`CDouble`になるように。

hakase
博士

その通り! ポインタは`Ptr`になるのじゃ。ユーザー定義の構造体やenumも、`Storable`のインスタンスで、`C.context`で指定されていれば使えるぞ。

roboko
ロボ子

`C.Context`を使うと、カスタムCの型やanti-quoterを拡張できるんですね。

hakase
博士

`C.vecCtx`コンテキストの`vec-len`と`vec-ptr` anti-quoterを使うと、HaskellのベクターをCで使えるのじゃ。`C.bsCtx`コンテキストなら、strictなByteStringをCで使えるぞ。

roboko
ロボ子

さらに、`C.funCtx`コンテキストの`fun` anti-quoterを使うと、Haskellの関数を関数ポインタに変換できるんですね!

hakase
博士

そう! GHCiは`-fobject-code`フラグを付けて使うのじゃ。これで`inline-c`もバッチリじゃ!

roboko
ロボ子

とても勉強になりました、博士! `inline-c`を使えば、Haskellの可能性がさらに広がりますね。

hakase
博士

じゃろ? ところでロボ子、C言語で「Hello, world!」と出力するプログラムを知っておるか?

roboko
ロボ子

はい、知っています。`printf`関数を使うんですよね。

hakase
博士

正解! でも、Haskellで「Hello, world!」と出力するプログラムは?

roboko
ロボ子

`putStrLn`関数ですね。

hakase
博士

そうじゃ! つまり、CとHaskellを組み合わせれば…「Hello, world!」が2倍楽しめる!…って、つまらんオチですまんのじゃ。

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search