2012-02-08 8 views
8

と不要バイナリ成長iは、次のいずれかの方法でメインモジュールに(大きな)モジュールをインポートする:ハスケル:モジュール輸入

import Mymodule 
import qualified Mymodule as M 
import Mymodule (MyDatatype) 

コンパイルされたバイナリの場合、Iドンと比較して、同じ膨大な量の成長そのモジュールをインポートしないでください。これは、メインモジュール内でそのモジュール内に何かを使用するかどうかにかかわらず発生します。コンパイラ(私はDebian TestingでGHCを使用しています)は、実行するために必要なものだけをバイナリに追加するべきではありませんか?

私の特定のケースでは、メインモジュールで使用していない巨大なMap in Mymoduleがあります。私が本当に必要なものを選択的にインポートしても、コンパイルされたバイナリの成長は変わりませんでした。

答えて

17

GHCに関する限り、インポートリストは可読性と名前の衝突を避けるためにのみ存在します。彼らはリンクされているものに全く影響しません。

また、ライブラリからいくつかの関数をインポートするだけであっても、内部的にはライブラリの大部分に依存する可能性があるため、使用可能な関数一般的なインターフェースです。

デフォルトでは、GHCは使用する部分だけでなく、ライブラリ全体をリンクします。あなたはGHCに-split-objsオプションでライブラリを構築することにより、この問題を回避(またはUnix)の上(あなたの徒党インストール設定ファイルに~/.cabal/configsplit-objs: Trueを入れて)、それは、コンパイルを遅くし、一見GHC開発者によって推奨されていませんでした:

-split-objs

通常、複数のオブジェクトファイルに生成される単一のオブジェクトファイル、モジュールのトップレベルのHaskell関数やタイプごとに1つずつ分割するリンカを教えてください。これは、ライブラリーにとって意味があります。ライブラリーにリンクされている実行可能ファイルは、必要なオブジェクト・ファイルとのみリンクするため、実行可能ファイルが小さくなることを意味します。しかし、すべてのセクションを別々にアセンブルするのは高価なので、これは通常のコンパイルよりも時間がかかります。さらに、ライブラリ自体(.aファイル)のサイズは、2〜2.5倍大きくなります。この機能をGHCのライブラリを構築するために使用します。

- The GHC manual

これは関係なく、インポートものの、あなたが使用したライブラリの未使用部分を省略します。

shared Haskell librariesをご利用いただきありがとうございます。

+0

「GHCに関する限り、インポートリストは読みやすさと名前の衝突を避けるためだけにあり、リンクされているものには何の影響も与えません。」これは真実ではありません。なぜなら、メインモジュール内に「import Mymodule」を置いても、そのモジュール内で何も使わずにサイズが大きくなってしまうからです。 – Josephine

+1

"インポートリスト"は、モジュール名の後にかっこでインポートする識別子のリストを指し、モジュールの先頭にあるインポートステートメントのリストは参照しません。 – ehird

+0

そうです、それは理にかなっています。解明と非常に有益な答えをありがとう! – Josephine