1

質問1

haskell のコンパイル時間を改善する理由 (基本的な機能が使用されているかどうかに関係なく、含まれているモジュールはコンパイルされます) で、不要なモジュールが含まれていることを haskell プログラマーに警告するツールはありますか? たとえば、次の設定があるとします。

必要なModule1.hs

module NecessaryModule1 where

addNumber1 :: Int -> Int -> Int
addNumber1 a b = a + b

必要なModule2.hs

module NecessaryModule2 where

addNumber2 :: Int -> Int -> Int
addNumber2 a b = a + b

Test.hs

module Test where

import NecessaryModule1
import NecessaryModule2

Main.hs

module Main where
import Test

myadd :: Int->Int->Int
myadd a b = a + b

main::IO()
main = print(myadd 5 6)

次に、そのようなツールは、に不要なモジュールがあることを警告します。

  • Main.hs : Test の機能を使用しないため
  • Test.hs : NecessaryModule1 と NecessaryModule2 の機能が使用されていないため


質問2

上記のコードを次のようにコンパイルすると:

ghc -o testProg Main.hs

次に、833504 バイトの実行可能サイズを取得します。ただし、Main.hsを次のように変更すると:

Main.hs

module Main where
--import Test

myadd :: Int->Int->Int
myadd a b = a + b

main::IO()
main = print(myadd 5 6)

Test モジュールの機能がMain.hsで使用されていない場合、実行可能ファイルのサイズに違いがあるのはなぜですか?

4

1 に答える 1

3

Q1 Haskell は、将来別のパッケージによってインポートされる可能性があるため、未使用のモジュールについて警告することはできません。ただし、モジュールをインポートすると、インポートしたモジュールのみがリンクされます。そのため、インポートされていないモジュールを使用して実行可能ファイルを作成すると、明示的cabalにリンクするように指示しない限り、そのモジュールは実行可能ファイルに含まれません。

-fwarn-unused-imports実際にモジュールをインポートすると、GHC は、コンパイル中にフラグを渡すと、そのモジュールを使用しないことを警告できます。を使用することも検討する必要があり-Wallます。これにより、この警告と他の多くの有用な警告が有効になります。を使用-Werrorすると、未使用のインポートやデッド コードなどの警告が表示され、GHC がモジュールのコンパイルを拒否します。

フラグ-split-objsを GHC に渡すこともできます。これにより、GHC は、モジュールごとに 1 つのオブジェクト ファイルではなく、関数ごとに (多かれ少なかれ) 1 つのオブジェクト ファイルを作成し、実行可能ファイルのサイズを大幅に削減できます。

Q2テンプレート Haskell 言語拡張機能は、モジュールの一部の機能の一部として、モジュールのローカル スコープを参照できます。したがって、GHC は、モジュールをコンパイルするときに、明示的にインポートされたコードを含める必要があります。これは、モジュールに依存する TH 機能が存在する可能性があるためです。いくつかのレベルの最適化 ( など-O2) を有効にすると、未使用のコードが再び削除されるはずですが、保証されていません。

コンパイル フラグを使用してコンパイル-sharedすると、共有ライブラリを使用してコンパイルされ、全体のバイナリ サイズが大幅に削減されますが、コンパイル済みのバイナリを別のコンピューターで使用する場合は、ライブラリ ファイルを一緒にコピーする必要があるという欠点があります。

于 2012-08-18T14:19:12.337 に答える