Apakah ada jawaban sederhana: Mengapa GHC begitu besar?
- OCaml: 2MB
- Python: 15MB
- SBCL: 9MB
- OpenJRE - 26MB
- GHC: 113MB
Tidak tertarik pada penginjilan "Mengapa saya tidak harus peduli tentang ukuran jika Haskell adalah alat yang tepat"; ini pertanyaan teknis.
Jawaban:
Agak konyol sebenarnya. Setiap perpustakaan yang dilengkapi dengan GHC disediakan dalam tidak kurang dari 4 rasa :
Versi GHCi hanyalah versi statis yang dihubungkan bersama dalam satu
.o
file. Tiga versi lainnya semuanya memiliki set sendiri file antarmuka (.hi
file) juga. Versi yang diprofilkan tampaknya berukuran sekitar dua kali lipat dari versi yang tidak diarsipkan (yang agak mencurigakan, saya harus mencari tahu mengapa demikian).Ingatlah bahwa GHC itu sendiri adalah sebuah perpustakaan , jadi Anda mendapatkan 4 salinan GHC. Tidak hanya itu, tetapi biner GHC itu sendiri terhubung secara statis, jadi itu adalah 5 salinan GHC.
Kami baru-baru ini membuatnya sehingga GHCi dapat menggunakan
.a
file statis . Itu akan memungkinkan kita untuk menyingkirkan salah satu dari rasa ini. Jangka panjang, kita harus secara dinamis menghubungkan GHC, tetapi itu adalah perubahan yang lebih besar karena itu akan memerlukan pembuatan tautan dinamis yang default - tidak seperti dalam C, dengan GHC Anda harus memutuskan di muka apakah Anda akan menghubungkan secara dinamis atau tidak. Dan kami membutuhkan lebih banyak perubahan (misalnya untuk Cabal dan sistem paket, di antara hal-hal lain) sebelum ini benar-benar praktis.sumber
Mungkin kita harus membandingkan apel dengan apel dan jeruk dengan jeruk. JRE adalah runtime, bukan kit pengembang. Kita dapat membandingkan: ukuran sumber kit pengembangan, ukuran kit pengembangan yang dikompilasi dan ukuran yang dikompilasi dari runtime minimal.
Bundel sumber OpenJDK 7 adalah 82 MB (unduh.java.net/openjdk/jdk7) vs bundel sumber GHC 7, yaitu 23 MB (haskell.org/ghc/download_ghc_7_0_1). GHC tidak besar di sini. Ukuran runtime: openjdk-6-jre-headless di Ubuntu adalah 77 MB terkompresi vs Haskell helloworld, secara statis dikaitkan dengan runtime-nya, yaitu <1 MB. GHC tidak besar di sini.
Di mana GHC besar, adalah ukuran kit pengembangan yang dikompilasi:
GHC sendiri membutuhkan 270 MB, dan dengan semua perpustakaan dan utilitas yang menyatukannya dibutuhkan lebih dari 500 MB. Dan ya, banyak, bahkan dengan pustaka dasar dan pengelola alat / dependensi. Platform pengembangan Java lebih kecil.
GHC:
terhadap OpenJDK penarikan kembali:
Tapi itu masih lebih dari 100 MB, bukan 26 MB saat Anda menulis.
Hal-hal berat dalam ghc6 dan ghc6-prof adalah:
Harap perhatikan seberapa besar
libHSghc-6.12.1_p.a
. Jadi jawabannya tampaknya menghubungkan statis dan membuat profil versi untuk setiap perpustakaan di luar sana.sumber
Tebakan saya - banyak dan banyak tautan statis. Setiap perpustakaan perlu menghubungkan secara dependensi ketergantungannya secara statis, yang pada gilirannya perlu menghubungkannya secara statis dan lebih lunak. Dan ini semua sering dikompilasi baik dengan dan tanpa profil, dan bahkan tanpa profil biner tidak dilucuti dan begitu banyak informasi debugger.
sumber
Karena bundel itu gcc dan banyak perpustakaan, semuanya terhubung secara statis.
Setidaknya di Windows.
sumber
Berikut ini rincian ukuran direktori pada kotak saya:
https://spreadsheets.google.com/ccc?key=0AveoXImmNnZ6dDlQeHY2MmxPcEYzYkpweEtDSS1fUlE&hl=en
Sepertinya direktori terbesar (123 MB) adalah binari untuk kompilasi kompilator itu sendiri. Dokumen berbobot 65 MB. Tempat ketiga adalah Cabal pada 41 MB.
Direktori bin adalah 33 MB, dan saya pikir hanya sebagian yang diperlukan secara teknis untuk membangun aplikasi Haskell.
sumber
Jawaban singkatnya adalah karena semua executable terhubung secara statis, mungkin memiliki info debug di dalamnya dan pustaka disertakan dalam banyak salinan. Ini sudah dikatakan oleh komentator lain.
Tautan dinamis dimungkinkan dan akan mengurangi ukuran secara dramatis. Berikut ini sebuah contoh
Hello.hs
:Saya membangun dengan GHC 7.4.2 di Windows.
ghc --make -O2
memberikanHello.exe
1105KsBerjalan
strip
di atasnya meninggalkan 630Kghc --make -O2 -dynamic
memberi 40KPengupasan itu menyisakan hanya 13 ribu.
Ketergantungannya adalah 5 dll dengan ukuran total 9,2 MB unstripped dan 5,7 MB stripped.
sumber