سؤال

هل هناك أي طرق جيدة لجعل صغيرة هاسكل التنفيذية?مع ghc6 بسيط مرحبا العالم برنامج يبدو أن تأتي إلى حوالي 370kB (523kB قبل غزة).مرحبا العالم في C هو 4kB (9kB قبل غزة).

هل كانت مفيدة؟

المحلول

ومع فرع تطوير GHC (أحد يعرف بالضبط أي إصدار هذا تم إضافتها في؟):

$ 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

وإضافة العلم -dynamic لRTS مرتبطة بشكل حيوي:

$ 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

وانظر أيضا: http://hackage.haskell.org/trac/ghc / ويكي / SharedLibraries / PlatformSupport

وعلى سبيل المقارنة مع 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

نصائح أخرى

وGHC هو ثابت ربط كل شيء (باستثناء المكتبات التي يستخدمها وقت التشغيل نفسها، والتي ترتبط بشكل حيوي).

في العصور القديمة، وترتبط GHC كله (حزقيل) مكتبة في أقرب وقت كنت قد استخدمت شيء من ذلك. منذ بعض الوقت، التي GHC لربط "في ملف الكائنات"، مما ادى الى تراجع كبير في حجم ثنائي. انطلاقا من الحجم، وكنت يجب أن كنت تم استخدام أحدث GHC بالفعل.

وعلى الجانب الإيجابي، لديك بالفعل الكثير من الاشياء في تلك 500K، مثل الأساسية مؤشرات، جمع القمامة وغيرها.

إضافة ما لا يقل عن جمع القمامة إلى رمز C، ثم مقارنتها مرة أخرى:)

وحجم ترونه هو وقت هاسكل (libHSrts.a)، الذي يرتبط بشكل ثابت في كل تنفيذ هاسكل. إذا كان كائن المشتركة، مثل librt.o لC، فإن ثنائي الخاص بك سيكون سوى عدد قليل من ك (حجم ملف الانقسام. س في مصدر المكتبة).

وقصيرة من تنفيذ ربط حيوي من libHSrts.a على النظام الأساسي الخاص بك، يمكنك أن تجعل التنفيذية الخاصة بك أصغر عن طريق القطاع.

إذا كان حجم الخاص بك ثنائي يهم حقا, يمكنك استخدام أداة gzexe أن حزم (يفضل أن يكون بالفعل جردت) قابل للتنفيذ مع ضغط gzip.على 64 بت لينكس مربع ، الأصلي مرحبا العالم البرنامج يأخذ 552 KB, بعد تجريد 393 KB, و بعد تجريد gzipping والمساعد 125 كيلو بايت.الجانب المظلم من gzipping والمساعد في الأداء -- القابل للتنفيذ يجب أن يكون مفتوح الأول.

ويجب أن نعول بركاتك (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$ 

وعلى محمل الجد على الرغم حين يمكنك ربما نفض هاسكل ثنائيات قليلا، انها حقا ليست مقارنة عادلة مع C. هناك أكثر يحدث هناك.

وآخر مرة لعبت مع شركة الخليج القابضة (وهذا قد يكون قديما) كان يربط بشكل ثابت كل شيء، والذي سيكون عاملا.

والأمور تتغير - إبقاء العين على <لأ href = "http://blog.well-typed.com/2009/04/hello-world-now-only-11k-using-ghc-with-shared- يبس / "يختلط =" نوفولو noreferrer "> هذا قطعة المستمر للعمل.

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

وحاول أيضا النظر في LDD، د your_executable

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top