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ỏ?
Trả lời
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
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ố.
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 :)
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 ... –
@ 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
@ 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
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
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.
Mọi thứ đang thay đổi - hãy theo dõi this tác phẩm đang diễn ra.
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.
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. –
- 1. Tạo các tệp thi hành trong Linux
- 2. Tại sao các tệp thi hành Haskell/GHC quá lớn trong việc kích hoạt?
- 3. Bỏ qua các tệp thi hành Linux với hgignore
- 4. codeblocks, dự án đơn lẻ, nhiều tệp thi hành
- 5. Phát hiện tệp thi hành trong java
- 6. Đơn giản hóa tệp Android.mk để tạo nhiều tệp thi hành
- 7. Tạo hình thu nhỏ từ các tệp video bằng Python
- 8. Tôi nên tạo mô-đun nhỏ như thế nào trong Haskell?
- 9. (C/C++) Cách tạo tệp thi hành có thể chạy trên cả Windows và Linux?
- 10. Xử lý các tệp lớn trong Haskell
- 11. Thi hành các móc Git trên Windows
- 12. Trình biên dịch C không thể tạo tệp thi hành - Cygwin/MiniGW
- 13. Chia nhỏ danh sách trong haskell
- 14. py2exe không tạo được tệp thực thi
- 15. Tìm tệp thi hành bằng ls và grep
- 16. Trích xuất tệp dự án Xcode từ tệp .ipa hoặc tệp thi hành
- 17. Cách xóa/xóa tệp thi hành (còn gọi là tệp không có phần mở rộng) chỉ
- 18. Đặt tệp thi hành hoạt động trong Xcode
- 19. Gỡ lỗi tệp thi hành trong studio trực quan
- 20. Tạo hình thu nhỏ
- 21. Gradle doFirst() Lệnh thi hành
- 22. Chính xác các tệp thi hành hoạt động như thế nào?
- 23. GNU tìm tất cả các tệp thi hành: Tương đương trên OS X?
- 24. Thứ tự tương đối mà Windows tìm kiếm các tệp thi hành trong PATH là gì?
- 25. Làm cách nào để bạn biên dịch các tệp thi hành ELF cho Android?
- 26. Chạy Hadoop MapReduce, có thể gọi các tệp thi hành bên ngoài HDFS
- 27. Xuất bản các tệp thi hành và trang web với NuGet
- 28. Tạo các tab nhỏ hơn trong Android
- 29. tạo tệp thực thi cho ứng dụng bằng opencv?
- 30. Cách tạo hình thu nhỏ của tệp .BMP?
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 –