2009-03-31 29 views
39

Có cách nào tốt để tạo các tệp thi hành haskell nhỏ không? Với ghc6 một chương trình hello world đơn giản dường như đến khoảng 370kB (523kB trước khi strip). Xin chào thế giới trong C là khoảng 4kB (9kB trước khi dải).Tạo các tệp thi hành haskell nhỏ?

+0

Sử dụng liên kết động, như được mô tả ở đây, http: // stackoverflow.com/questions/6115459/small-haskell-program-compiled-with-ghc-into-huge-binary –

Trả lời

44

Với chi nhánh phát triển của GHC (bất cứ ai biết chính xác phiên bản này đã được bổ sung trong?):

$ ghc -o hello hello.hs 
$ strip -p --strip-unneeded --remove-section=.comment -o hello-small hello 
$ du hello hello-small 
700 hello 
476 hello-small 

Thêm cờ -dynamic cho một RTS động liên kết:

$ ghc -dynamic -o hello hello.hs 
$ strip -p --strip-unneeded --remove-section=.comment -o hello-small hello 
$ du hello hello-small 
24 hello 
16 hello-small 

Xem thêm : http://hackage.haskell.org/trac/ghc/wiki/SharedLibraries/PlatformSupport

Để so sánh với C:

$ gcc hello.c -o hello 
$ strip -p --strip-unneeded --remove-section=.comment -o hello-small hello 
$ du hello hello-small 
12 hello 
8 hello-small 
+0

Làm việc với tôi trong ghc 6.12.1. – Joe

+0

Nếu bạn nhận được "Có lẽ bạn chưa cài đặt các thư viện lược tả cho lỗi" cơ sở "gói, sau đó apt-get install ghc-dynamic. – matcheek

+0

lệnh 'strip' tương đương trên OS X là gì? –

8

Bạn nên đếm phước lành của bạn (370Kb Luuuxury?):

 
bash$ sbcl 
This is SBCL 1.0.24, an implementation of ANSI Common Lisp. 

* (sb-ext:save-lisp-and-die "my.core") 
[undoing binding stack and other enclosing state... done] 
[saving current Lisp image into ./my.core: 
... 
done] 
bash$ du -sh my.core 
25M my.core 
bash$ 

Mặc dù nghiêm túc trong khi bạn có thể có thể lắc ra Haskell binary một chút, nó thực sự không phải là một so sánh công bằng với C. Có đi một thêm về có .

Lần cuối cùng tôi chơi với ghc (và điều này có thể đã lỗi thời) nó liên kết tĩnh mọi thứ, đó sẽ là một yếu tố.

21

GHC liên kết tĩnh mọi thứ (trừ các thư viện được sử dụng bởi thời gian chạy, được liên kết động).

Ở tuổi già, GHC đã liên kết toàn bộ thư viện (haskell) ngay khi bạn đã sử dụng một cái gì đó từ nó. Cách đây một thời gian, GHC bắt đầu liên kết "mỗi tệp obj", làm giảm đáng kể kích thước nhị phân. Đánh giá từ kích thước, bạn phải đã sử dụng GHC mới hơn rồi.

Về phía cộng, bạn đã có rất nhiều thứ trong những 500K, như lõi đa luồng, thu gom rác, vv

Thêm ít nhất thu gom rác để mã C của bạn, sau đó so sánh chúng một lần nữa :)

+1

Trong khi đúng là nhị phân Haskell chứa rất nhiều thứ mà nhị phân C không có, nó là vô nghĩa nếu có nó nếu nó không được sử dụng ... –

+5

@ liw.fi Nếu bạn/lo lắng về kích thước của tệp thi hành, C là ngôn ngữ duy nhất đủ tốt cho bạn. – Rayne

+2

@ liw.fi Haskell gần như là định nghĩa về thu gom rác, thực thi đa lõi vv Vì vậy, trên thực tế, nó là vô nghĩa _not_ để có tất cả những thứ đó trong lõi. Hoặc bỏ nó ra (đổ thêm nỗ lực vào lõi được mô đun hóa có thể làm như vậy). Và vì cái gì? Để tiết kiệm 100K kích thước nhị phân? – ADEpt

6
strip -p --strip-unneeded --remove-section=.comment -o your_executable_small your_executable 

cũng cố gắng nhìn vào ldd -dr your_executable

16

Kích thước bạn đang thấy là thời gian chạy Haskell (libHSrts.a), được liên kết tĩnh vào mỗi Haskell thực thi. Nếu nó là một đối tượng được chia sẻ, như librt.o cho C, nhị phân của bạn sẽ chỉ là một vài k (kích thước của một tệp .o chia trong nguồn thư viện).

Thiếu triển khai liên kết động libHSrts.a trên nền tảng của bạn, bạn có thể làm cho tệp thi hành của mình nhỏ hơn qua dải.

6

Mọi thứ đang thay đổi - hãy theo dõi this tác phẩm đang diễn ra.

9

Nếu kích thước nhị phân của bạn thực sự quan trọng, bạn có thể sử dụng công cụ gzexe có thể thực thi (nén tốt nhất) bằng nén gzip. Trên hộp Linux 64-bit của tôi, chương trình hello world thế giới sẽ mất 552 KB, sau khi tước 393 KB và sau khi gỡ bỏ và gzip 125 KB. Mặt tối của gzipping là trong hiệu suất - thực thi phải được giải nén đầu tiên.

+2

Không biết về điều này! Đó là một mẹo thực sự hữu ích, tôi đã có một thực thi 15 MB đó là xuống đến 7,3 MB sau ** dải **, nhưng sau đó xuống đến 1,5 MB sau ** gzexe **! Tôi tìm thấy một công cụ khác ** [upx] (http://upx.sourceforge.net/) ** được sử dụng thay cho ** gzexe ** có thể thực thi xuống còn 1,2 MB. –

Các vấn đề liên quan