2017-12-30 34 views
4

有用性についてお尋ねします。これは、コンパイルされた実行可能ファイル/ライブラリのサイズへの影響に関するものです。コードのメンテナンス性や可読性に関するものではありません。特定のモジュールを 明示的なインポートは、コンパイルされたファイルサイズを減らすことができますか?

インポート

代わりに(それ自体がサブモジュールをインポート)メインモジュールのインポートパッケージからのみ使用されるモジュールをインポートすることが有用です。

import Foreign.Storable 

代わりに:(のみインポートリストが含ま)Foreignモジュールと例えば

import Foreign 

明示的にインポート機能/タイプ

はにそれが有用ですモジュール全体をインポートするのではなく、使用された関数/タイプをインポートするだけですか?例えば

import Foreign.ForeignPtr (ForeignPtr, mallocForeignPtr, withForeignPtr) 

代わりに:

import Foreign.ForeignPtr 
+5

2つの異なる方法で簡単なアプリケーションをコンパイルしてみましたか、違いがあるかどうかを確認しましたか?私の疑問は、最適化なしでコンパイルし、最適化で同じサイズをコンパイルすると、ファイルが大きくなることです。しかし、あなたがLTOを必要とするかもしれません。私は、一度にモジュールに対して明示的に関数をインポートすることで差が出るとは思わないでしょう。 –

+2

これはHaskellコードの特徴ではありません。それはリンクの特徴です。まず、あなたが動的にリンクする場合、これは違いはありませんので、私は静的リンクについて話していると仮定します。最初のケースでは、['split-objs'](https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/phases.html#ghc-flag--split -objs)が有効になっている。それ以外の場合は、ライブラリ全体がリンクされます。後者の場合、それは決して違いはありません。モジュールから名前(!)をインポートしても、モジュール全体(または 'split-objs'を有効にしないでパッケージ全体)をリンクする必要があります。 – user2407038

+0

@ user2407038あなたの答えをありがとう!本当の答えにして、私はそれを検証するでしょう。 –

答えて

1

モジュールがないにも理論的には、無次に、オブジェクトファイルとしてコンパイルされている場合。インポートできない関数は引き続き内部で使用することができ、GHCIにモジュールをロードして、非内部関数をテストすることができます。

静的に、または汎用関数の特定のインスタンスを使用している場合、コンパイラーは理論上、この特定のプログラムから到達できないライブラリの部分を分析でき、プログラム全体の最適化として、それらを実行可能ファイルから取り出します。 (たとえば、あなたのプログラムで使用されているリストだけがIntのリストであれば、コンパイラは部分的に特化した[Int]バージョンの汎用関数と使用するものだけをコンパイルするだけかもしれません)。しかし、同じ静的あなたの輸入と輸出の宣言にかかわらず、全プログラム最適化としての分析。

ダイナミックライブラリをコンパイルするとき、理論的には、エクスポートされたインターフェイスを介して直接的または間接的に静的解析に到達することのできないコードパスまたはデータを除外することができます。そうであれば、コンパイラはエクスポートリストを使用して、ライブラリ内の一部の識別子が完全に無用であることを証明し、コンパイルされたライブラリからそれを残すことができます。

GHC 8などの特定のコンパイラが何をしているのか分かりませんが、わかりません。あなたはそれを試して見なければならないでしょう。

あなたの輸出入を具体的にリストする主な利点は、2年目のモジュールがすでに使用している識別子を宣言してから数年後にも問題に遭遇することがないことです。これは前に私に起こった、そして今私はもっと慎重だ。

関連する問題