Cとのシームレスな連携

我々SML#開発チームは,Cを代表とする既存言語とのシームレスな相互運用性の実現が,MLなどの新しい言語の実用化にとって最も重要な要素と考える.

しかし残念ながら,対話型プログラム,高階関数,多相型システムなど通常の機能を含むML系関数型言語は,そのデータ表現に関して,Cなどの既存言語との相互運用性を持っていない場合が多い.例えば,OCamlやStandard ML of New Jerseyでは,整数型は計算機が操作できる整数表現ではなく,それが整数データであることを示す1ビットのタグを含む31ビット表現であり,また,浮動小数点データは,ヒープに割り当てられたポインターで表現され,構造体などに直接格納することはできない.

SML#では,整数や浮動小数点データは計算機が提供する自然な表現を持ち,レコードや配列,リストなどの他のデータ構造に格納できる実装方式を実現した.これにより,対話型プログラム,高階関数,多相型などの関数型言語の優れた機能を損なうことなく,他に類をみない高い相互運用性を実現している.SML#の対話型環境から,Cで書かれたライブラリ関数をロードしSML#の関数として使用することが可能である.スタブの作成やデータ変換などの手間は一切必用としない.以下の簡単な例を用いて,SML#のFFIの機能を紹介する.

これは,従来の言語では当たり前の機能である.SML#は,その当たり前の機能を,型主導のコンパイル理論とその実装技術を開発し,対話型プログラミングや多相関数などの機能をサポートするML系言語で初めて実現している.これによって,システムに用意されている豊富なC言語ライブラリを簡単な宣言のみで使用することが可能となっている.

これらを使えば,たとえば,こんなプログラム が,コンパイラの特別な機能なしに,ユーザレベルのコードとしてすぐに書くとができる.