nativeコードにおける動的リンクこのページは最後に更新されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。 last mod. 2008-12-19 (金) 17:25:55
3.11からはnativeコードにおける動的リンクがサポートされました。動的リンクを用いるとプラグインのような機能や、実行中にコードの一部を置き換えるホットスワップなどが実現できます。 ここでは、階乗計算を行うモジュールの動的リンクを例に挙げ、ネイティブコードにおける動的リンクについて説明します。 概要動的リンクはDynlinkモジュールを使って行います。 WindowsのDLLなどとは異なり、ロードするモジュールから、ロードされるモジュールの関数や値に直接アクセスすることはできません。 そのため、ロードされるモジュールが、自分の関数や値をロードするモジュールに登録する必要があります。 今回の例では、 という流れで処理を行います。 コードfactStub.mlFactが関数を登録するためのモジュールです。 あとから値を書き換えるので、option型の参照型になっています。 let fact : (int -> int) option ref = ref None fact.ml動的リンクされるモジュールです。階乗を計算する関数を定義した後、その関数をFactStub?に登録します。 let rec fact =
function
0 -> 1
| n -> n * fact (n-1)
let _ =
FactStub.fact := Some fact
main.ml動的リンクを行うモジュールです。Dynlink.loadfileを用いてFactモジュールをロードした後、FactStub?に登録された関数を呼び出しています。 let _ =
try
Dynlink.loadfile "fact.cmxs";
match !FactStub.fact with
Some f ->
Printf.printf "%d\n" (f 10)
| None ->
failwith "load failed"
with Dynlink.Error e ->
print_endline (Dynlink.error_message e)
コンパイル/実行例Factモジュールを-sharedオプションをつけてコンパイルし、動的リンク可能なプラグインを生成します。このときの拡張子は.cmxsが標準的です。 $ ocamlopt -c factStub.ml $ ocamlopt -o fact.cmxs -shared fact.ml Mainをコンパイルします。このときdynlink.cmxaをリンクする必要があります。 $ ocamlopt -o fact-test dynlink.cmxa factStub.ml main.ml 実行してみましょう。 $ fact-test 3628800 成功しました。 まとめここでは階乗計算を行うモジュールを例として、ネイティブコードにおける動的リンクについて解説しました。動的リンクを活用することで、より柔軟なプログラムが可能になるでしょう。 |