Cでは、コードを「ヘッダーファイル」と実装に分割し、実装をコンパイルしてから、コンパイルされたバージョンとヘッダーのみ(完全なソースではない)を配布できます。
これはHaskellで可能ですか?
Cでは、コードを「ヘッダーファイル」と実装に分割し、実装をコンパイルしてから、コンパイルされたバージョンとヘッダーのみ(完全なソースではない)を配布できます。
これはHaskellで可能ですか?
GHC ではそれが可能ですが、もちろんコードは特定のバイナリ プラットフォームに結び付けられます。
ここをチェックしてください:
http://www.haskell.org/ghc/docs/2.10/users_guide/user_174.html
またはより更新された説明については:
http://www.haskell.org/ghc/docs/7.0.3/html/users_guide/separate-compilation.html
特に、.hi ファイルを探します。
これを行うことは十分に可能です。GHC が Haskell モジュール (つまり、ファイル) をコンパイルすると、オブジェクト ファイルと「インターフェース ファイル」*.hs
に実行可能コードが生成されます。コンパイルされたコードを使用するには、オブジェクト ファイルとインターフェイス ファイルのみが必要です。*.o
*.hi
ただし、C とは異なり、Haskell の実行時の詳細は公式には標準化されていません。したがって、異なる Haskell コンパイラでコンパイルされたコードを一緒にリンクすることはできません。結果はうまくいきません。実際、異なるバージョンの GHC でコンパイルされたコードをリンクすることさえできないことがよくあります。これを行うことが「不可能」であるというわけではありません。これは、誰もまだ標準化していないため、現在は機能していません。
最近では、Haskell コードを「動的ライブラリ」(Windows では DLL、*.so
Unix ではファイル) にコンパイルすることも可能になりました。繰り返しますが、*.hi
これらに対してコンパイルするためのファイルが必要ですが、実行時に必要なのはライブラリ ファイル自体だけです。
GHC は多くのクロスモジュール最適化を行う傾向があることに注意してください。これにより、動的リンクの有用性がいくらか低下します。(C++ テンプレート ライブラリを「コンパイル」しようとするのと少し似ています...)
もちろん、あなたのソースコードを見られない人や、エンドユーザーに Haskell コンパイラを提供する必要がないことに関心があるだけなら、これは問題ではありません。