Haskellをどこから使い始めれば良いのか分からずに放置していたのですが、何気なく検索したFFIが気になったので遊んでみました。
ghc
今までghciでクイックソートをやって遊んだりしただけで、ghcでコンパイルしたことがありませんでした。今回はWindows版ghcをInterixから使います。パスを通すのではなく、/usr/local/binにシンボリックリンクを作りました。
% ln -s /dev/fs/C/ghc/ghc-7.0.1/bin/ghc.exe /usr/local/bin/ghc
ハローワールド
FFI(スタティックリンク)
シンプルな例を見つけたので、試してみました。
- id:tom-lpsd:20090201:1233497971
上の例ではghciから呼び出していますが、C言語とHaskellのコードを同時にコンパイルして、1つのEXEに出来ました。ヘッダは省略しても問題ないようです。
hello.c
#include <stdio.h> void hello() { printf("hello ffi\n"); }
Haskellソースの最初の行はC言語の#pragmaディレクティブに相当するようです。foreign importの定義はP/Invokeに似ている印象です。
test2.hs
{-# LANGUAGE ForeignFunctionInterface #-} import Foreign foreign import ccall "hello" hello :: IO () main = do hello
ghcはC言語も受け付けるので、コンパイルはとても簡単です。WindowsでC言語のコンパイルは、ghcにバンドルされたgccに振られます。
% ghc hello.c test2.hs [1 of 1] Compiling Main ( test2.hs, test2.o ) Linking test2.exe ... % ./test2.exe hello ffi
こんなに簡単にC言語と組み合わせられるとは思っていなかったので驚きました。