確認したいこと
現在、Linux上 で haskell の学習を始めたところです。普段常用している自作の shell や python のスクリプトを haskell で再実装をしているのですが、ghc でコンパイルされる実行ファイルが、他言語で生成される実行ファイルに比べ、かなり巨大と感じました。(今回の議論の例として、haskell-language-server のバイナリでは136Mバイト)
巨大となる理由は、様々な実行環境での安定稼働を目的として、当該 haskell プログラムが依存するモジュールを、全てスタティックリンクするためであると理解しております。
しかしながら、趣味の自作環境では些かオーバースペックであると思われるため、ビルド環境に依存する形でも構わないため、実行バイナリをコンパクトにする手法を確認したいと考えております。
配布されているバイナリの大きさ
% ls -s haskell-language-server-8.10.2 136M
試したこと
-
配布バイナリをストリップすることで、約2割サイズが縮減されました。
-
さらに、upx で圧縮することで、約8割のサイズの削減になりました。
-
スタティックリンクベースでは、ここまでが限界と考え、依存モジュールを全てダイナミックリンクにすることで、約200Kバイトまで圧縮されました。ただし、約200個の依存モジュールは実行時にメモリ上に展開されることになるため、ディスク容量の削減に留まっています。
-
理想としては、jhc コンパイラのような、全ての要素を C言語に変換した上で最適化をかけることで、実行バイナリから不要な要素を削除される形が望ましいところです。jhcのコンパイルパイプライン
-
ghc の言語拡張にかなり依存したコーディングとなっているため、ghc のコンパイルオプション等で同種の対応ができる等、ご助言をいただければ幸いです。
strip & upx & dynamic link
zsh
1 2% strip haskell-language-server-8.10.2 && ls -s haskell-language-server-8.10.2 3110M nguage-server-8.10.2 4 5% upx --best --lzma haskell-language-server-8.10.2 && ls -s haskell-language-server-8.10.2 615M nguage-server-8.10.2 7 8% ls -s =haskell-language-server 9216K /usr/bin/haskell-language-server 10 11% ldd =haskell-language-server | wc -l 12209 13 14% haskell-language-server --version 15haskell-language-server version: 1.2.0.0 (GHC: 9.0.1) (PATH: /usr/bin/haskell-language-server)
あなたの回答
tips
プレビュー