質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Haskell

Haskellは高い機能性をもった関数型プログラミング言語で、他の手続き型プログラミング言語では難しいとされている関数でも容易に行うことができます。強い静的型付け、遅延評価などに対応しています。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Q&A

0回答

1367閲覧

Haskell(ghc)の巨大な実行ファイルをコンパクトにしたい

te-miya

総合スコア7

Haskell

Haskellは高い機能性をもった関数型プログラミング言語で、他の手続き型プログラミング言語では難しいとされている関数でも容易に行うことができます。強い静的型付け、遅延評価などに対応しています。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

0グッド

0クリップ

投稿2021/07/25 13:00

編集2021/07/25 13:05

確認したいこと

現在、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)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問