Tại sao GHC quá lớn / lớn?


147

Có một câu trả lời đơn giản: Tại sao GHC lại lớn như vậy?

  • Tháng 10: 2MB
  • Con trăn: 15MB
  • SBCL: 9 MB
  • OpenJRE - 26MB
  • GHC: 113 MB

Không quan tâm đến việc truyền giáo "Tại sao tôi không nên quan tâm đến kích thước nếu Haskell là công cụ phù hợp"; đây là một câu hỏi kỹ thuật


1
Bạn lấy 500MB này từ đâu? GHC của tôi không ở đâu gần với điều đó.
Jacob

Trừ khi bạn đếm tất cả các thư viện, tôi đoán ...
Jacob

Xin lỗi, tôi đã tải xuống một trình quản lý gói tải xuống bao gồm một số deps. Tôi đã cập nhật nó để phản ánh kích thước tải xuống từ trang web. Tôi đã thêm một bản tóm tắt Chỉnh sửa nhưng nó không xuất hiện ở đây (chưa?). Tôi nghĩ rằng câu hỏi vẫn còn. Nó to quá.
Christopher Xong

20
Có lẽ chúng ta nên so sánh táo với táo và cam với cam. JRE là một bộ thực thi, không phải là một bộ phát triển. Gói nguồn OpenJDK 7, 82 MB ( download.java.net/openjdk/jdk7 ) so với gói nguồn GHC 7, 23 MB ( haskell.org/ghc/doad_ghc_7_0_1 ). Bây giờ thời gian chạy: openjdk-6-jre-headless trên Ubuntu, 77 MB không nén so với Haskell hellowworld, được liên kết tĩnh với thời gian chạy của nó, <1 MB.
sastanin

Hôm nay tôi đã tò mò về các kích thước bây giờ 2014. Có vẻ như các đối số vẫn còn. Tôi đã tìm thấy URLS: 1.GHC haskell.org/ghc/doad_ghc_7_8_3 ; 2.OpenJCK packages.ubuntu.com/precise/openjdk-7-jdk
AnneTheAgile

Câu trả lời:


187

Thật sự hơi ngớ ngẩn. Mỗi thư viện đi kèm với GHC được cung cấp không dưới 4 hương vị :

  • tĩnh
  • năng động
  • định hình
  • GHCi

Phiên bản GHCi chỉ là phiên bản tĩnh được liên kết với nhau trong một .otệp duy nhất . Cả ba phiên bản còn lại đều có bộ tệp giao diện ( .hitệp) riêng. Các phiên bản được định hình dường như có kích thước gấp đôi so với các phiên bản chưa được chỉnh sửa (điều này hơi đáng ngờ, tôi nên xem xét lý do tại sao).

Hãy nhớ rằng chính GHC là một thư viện , vì vậy bạn nhận được 4 bản sao GHC. Không chỉ vậy, bản thân nhị phân GHC được liên kết tĩnh, do đó, đó là 5 bản sao của GHC.

Gần đây chúng tôi đã làm cho nó để GHCi có thể sử dụng các .atệp tĩnh . Điều đó sẽ cho phép chúng ta thoát khỏi một trong những hương vị này. Về lâu dài, chúng ta nên liên kết động với GHC, nhưng đó là một thay đổi lớn hơn vì điều đó sẽ đòi hỏi phải tạo liên kết động theo mặc định - không giống như trong C, với GHC, bạn phải quyết định trước liệu bạn có liên kết động hay không. Và chúng tôi cần nhiều thay đổi hơn (ví dụ như Cabal và hệ thống gói, trong số những thứ khác) trước khi điều này thực sự thiết thực.


16
Và ở đây tôi nghĩ rằng đó là tất cả logic mà Haskell đưa ra: đánh giá lười biếng, suy luận kiểu, v.v.
mcandre

4
Vì vậy, 113MB / 4 ~ = 28MB, vẫn lớn hơn OpenJRE ... Nhưng hãy xem GHC có thể so sánh với OpenJDK, không chỉ JRE, nó làm tôi cảm thấy tốt hơn.
Động cơ Trái đất

1
Bây giờ tôi nghĩ GHC sử dụng liên kết động, có lẽ ý tưởng của Tiến sĩ @Simon Marlow để nén bốn hương vị là thực tế hơn? Trích dẫn: 1. # 3658 (Liên kết động GHCi (và sử dụng trình liên kết hệ thống) trên các nền tảng hỗ trợ nó) - GHC ghc.haskell.org/trac/ghc/ticket/3658 ; 2. # 8266 (Liên kết động trên máy Mac) - GHC ghc.haskell.org/trac/ghc/ticket/8266 ; 3. # 8376 (API thực thi tĩnh + API GHC (+ Liên kết động?) Cung cấp cho Segfault) - GHC
AnneTheAgile

56

Có lẽ chúng ta nên so sánh táo với táo và cam với cam. JRE là một bộ thực thi, không phải là một bộ phát triển. Chúng tôi có thể so sánh: kích thước nguồn của bộ phát triển, kích thước của bộ phát triển được biên dịch và kích thước được biên dịch của thời gian chạy tối thiểu.

Gói nguồn OpenJDK 7 là 82 MB (download.java.net/openjdk/jdk7) so với gói nguồn GHC 7, là 23 MB (haskell.org/ghc/doad_ghc_7_0_1). GHC không lớn ở đây. Kích thước thời gian chạy: openjdk-6-jre-headless trên Ubuntu là 77 MB không nén so với Haskell hellowworld, được liên kết tĩnh với thời gian chạy của nó, <1 MB. GHC không lớn ở đây.

Trong đó GHC lớn, là kích thước của bộ công cụ phát triển được biên dịch:

Sử dụng đĩa GHC

Bản thân GHC mất 270 MB và với tất cả các thư viện và tiện ích đi kèm, phải mất hơn 500 MB. Và vâng, nó rất nhiều, ngay cả với các thư viện cơ sở và công cụ xây dựng / trình quản lý phụ thuộc. Nền tảng phát triển Java nhỏ hơn.

GHC:

$ aptitude show ghc6 | grep Size
Uncompressed Size: 388M

chống lại sự phụ thuộc của OpenJDK:

$ aptitude show openjdk-6-jdk openjdk-6-jre openjdk-6-jre-headless ant maven2 ivy | grep Size
Uncompressed Size: 34.9M
Uncompressed Size: 905k
Uncompressed Size: 77.3M
Uncompressed Size: 1,585k
Uncompressed Size: 3,736k
Uncompressed Size: 991k

Nhưng nó vẫn còn hơn 100 MB chứ không phải 26 MB như bạn viết.

Những thứ nặng trong ghc6 và ghc6-prof là:

$ dpkg -L ghc6 | grep '\.a$' | xargs ls -1ks | sort -k 1 -n -r | head -3
57048 /usr/lib/ghc-6.12.1/ghc-6.12.1/libHSghc-6.12.1.a
22668 /usr/lib/ghc-6.12.1/Cabal-1.8.0.2/libHSCabal-1.8.0.2.a
21468 /usr/lib/ghc-6.12.1/base-4.2.0.0/libHSbase-4.2.0.0.a
$ dpkg -L ghc6-prof | grep '\.a$' | xargs ls -1ks | sort -k 1 -n -r | head -3
112596 /usr/lib/ghc-6.12.1/ghc-6.12.1/libHSghc-6.12.1_p.a
 33536 /usr/lib/ghc-6.12.1/Cabal-1.8.0.2/libHSCabal-1.8.0.2_p.a
 31724 /usr/lib/ghc-6.12.1/base-4.2.0.0/libHSbase-4.2.0.0_p.a

Xin lưu ý rằng lớn như thế nào libHSghc-6.12.1_p.a. Vì vậy, câu trả lời dường như là các phiên bản liên kết và định hình tĩnh cho mọi thư viện ngoài kia.


9

Tôi đoán - rất nhiều và rất nhiều liên kết tĩnh. Mỗi thư viện cần liên kết tĩnh các phụ thuộc của nó, do đó cần liên kết tĩnh và liên kết tĩnh. Và đây là tất cả được biên dịch thường xuyên cả có và không có hồ sơ, và thậm chí không có hồ sơ nhị phân không bị tước và do đó có rất nhiều thông tin về trình gỡ lỗi.


2
Tôi có lẽ sẽ không phiền nếu GHC chuyển sang toàn bộ chương trình, biên dịch lại hầu hết mọi thứ, tương tự như jhc. Nó thậm chí có thể biên dịch nhanh hơn nếu nó giữ cho 'ld' không bị tráo đổi.
John L

8

Bởi vì nó gói gcc và một loạt các thư viện, tất cả đều được liên kết tĩnh.

Ít nhất là trên Windows.


12
không, không phải trên linux. nó chỉ phụ thuộc vào gcc. bởi vì các cửa sổ không có gcc trong "phân phối" của nó, nó phải đi kèm với ghc.
comonad

5

Đây là sự cố kích thước thư mục trên hộp của tôi:

https: //s lâysheet.google.com/ccc?key=0AveoXImmNnZ6dDlQeHY2MmxPcEYzYkpweEtDSS1fUlE&hl=vi

Dường như thư mục lớn nhất (123 MB) là nhị phân để tự biên dịch trình biên dịch. Các tài liệu có trọng lượng đáng kinh ngạc là 65 MB. Vị trí thứ ba là Cabal với 41 MB.

Thư mục bin là 33 MB và tôi nghĩ rằng chỉ có một tập hợp con đó là những gì cần thiết về mặt kỹ thuật để xây dựng các ứng dụng Haskell.


6
Hãy để tôi thêm một cái gì đó vào đây: Nếu bạn chỉ lấy trình biên dịch barebone và loại bỏ bất cứ thứ gì không thực sự cần thiết, (như xây dựng trình biên dịch không được biên dịch, tước, v.v.), bạn có thể giảm xuống còn khoảng 5 MB. Nhưng hãy thử so sánh kích thước trình biên dịch với GCC. (Đã chỉnh sửa nhận xét, vì vậy tôi phải xóa nó ... xin lỗi)
fuz

5

Câu trả lời ngắn gọn là vì tất cả các tệp thực thi được liên kết tĩnh, có thể có thông tin gỡ lỗi trong đó và các thư viện được bao gồm trong nhiều bản sao. Điều này đã được nói bởi những người bình luận khác.

Liên kết động là có thể và sẽ giảm kích thước đáng kể. Đây là một ví dụ Hello.hs:

main = putStrLn "Hello world"

Tôi xây dựng với GHC 7.4.2 trên Windows.

ghc --make -O2tặng Hello.exe1105Ks

Chạy striptrên nó để lại 630K

ghc --make -O2 -dynamic tặng 40K

Tước nó chỉ còn 13K.

Sự phụ thuộc của nó là 5 dll với tổng kích thước 9,2 MB chưa được xử lý và 5,7 MB bị tước.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.