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

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

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

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

Linux

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

Q&A

受付中

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

te-miya
te-miya

総合スコア7

Haskell

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

Linux

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

0回答

0グッド

0クリップ

711閲覧

投稿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)

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

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

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

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

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

ただいまの回答率
86.02%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Haskell

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

Linux

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