ছোট হাস্কেল প্রোগ্রামটি জিএইচসি দিয়ে বিশাল বাইনারিতে সংকলিত


127

এমনকি তুচ্ছভাবে ছোট ছোট হাস্কেল প্রোগ্রামগুলি বিশালাকার এক্সিকিউটেবলে পরিণত হয়।

আমি একটি ছোট প্রোগ্রাম লিখেছি, যেটি 7 গিগাবাইট আকারের বাইনারিতে (জিএইচসি সহ) সংকলিত হয়েছিল!

একটি ছোট হাস্কেল প্রোগ্রাম এমনকি বিশাল বাইনারি সংকলিত হতে পারে কি?

এটিকে হ্রাস করতে আমি কী করতে পারি?


2
আপনি কি এটিকে সরিয়ে দেওয়ার চেষ্টা করেছেন?
ফ্রেড ফু

21
stripপ্রতীক টেবিলটি সরাতে বাইনারিটিতে প্রোগ্রামটি চালান ।
ফ্রেড ফু

1
@ tm1rbt: চালান strip test। এই কমান্ডটি প্রোগ্রাম থেকে কিছু ডিবাগ তথ্য সরিয়ে এটিকে আরও ছোট করে তোলে।
ফুজ

8
পার্শ্ব প্রতিক্রিয়া হিসাবে 3D গণিত লাইব্রেরিতে আপনার ডেটা প্রকারের কর্মক্ষমতা কারণে আরও কঠোর হওয়া উচিত: data M3 = M3 !V3 !V3 !V3এবং data V3 = V3 !Float !Float !Float। সংকলন ghc -O2 -funbox-strict-fields
ডন স্টুয়ার্ট

8
এই পোস্টটি মেটা নিয়ে আলোচনা করা হয়েছে ।
প্যাট্রিক হফম্যান

উত্তর:


215

আসুন দেখুন কি চলছে, চেষ্টা করুন

  $ du -hs A
  13M   A

  $ file A
  A: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), 
     dynamically linked (uses shared libs), for GNU/Linux 2.6.27, not stripped

  $ ldd A
    linux-vdso.so.1 =>  (0x00007fff1b9ff000)
    libXrandr.so.2 => /usr/lib/libXrandr.so.2 (0x00007fb21f418000)
    libX11.so.6 => /usr/lib/libX11.so.6 (0x00007fb21f0d9000)
    libGLU.so.1 => /usr/lib/libGLU.so.1 (0x00007fb21ee6d000)
    libGL.so.1 => /usr/lib/libGL.so.1 (0x00007fb21ebf4000)
    libgmp.so.10 => /usr/lib/libgmp.so.10 (0x00007fb21e988000)
    libm.so.6 => /lib/libm.so.6 (0x00007fb21e706000)
    ...      

আপনি lddআউটপুট থেকে দেখতে পান যে জিএইচসি একটি গতিশীলভাবে সংযুক্ত এক্সিকিউটেবল উত্পাদন করেছে, তবে কেবল সি লাইব্রেরিগুলি গতিশীলভাবে লিঙ্কযুক্ত ! সমস্ত হাস্কেল গ্রন্থাগার ভার্বাটিমে অনুলিপি করা হয়েছে।

একদিকে: যেহেতু এটি একটি গ্রাফিক্স-নিবিড় অ্যাপ্লিকেশন, তাই আমি অবশ্যই সংকলন করব ghc -O2

আপনি করতে পারেন দুটি জিনিস আছে।

প্রত্যাহার প্রতীক

একটি সহজ সমাধান: বাইনারি ফালা:

$ strip A
$ du -hs A
5.8M    A

স্ট্রিপ অবজেক্ট ফাইল থেকে প্রতীকগুলি বাতিল করে দেয়। এগুলি সাধারণত ডিবাগিংয়ের জন্য প্রয়োজন।

গতিশীলভাবে হাস্কেল লাইব্রেরি সংযুক্ত

সম্প্রতি, জিএইচসি সি এবং হাস্কেল উভয় লাইব্রেরির গতিশীল সংযোগের জন্য সমর্থন পেয়েছে । বেশিরভাগ ডিস্ট্রোস এখন হাসেল লাইব্রেরির ডায়নামিক লিঙ্কিং সমর্থন করার জন্য নির্মিত জিএইচসি-র একটি সংস্করণ বিতরণ করে। ভাগ করা হাস্কেল লাইব্রেরিগুলি প্রতিটি হাস্যেল প্রোগ্রামের মধ্যে প্রতিটি সময় সম্পাদনযোগ্যতে অনুলিপি না করে ভাগ করা যেতে পারে।

লেখার সময় লিনাক্স এবং উইন্ডোজ সমর্থিত।

হাস্কেল গ্রন্থাগারগুলিকে গতিশীলভাবে সংযুক্ত করার অনুমতি দেওয়ার জন্য আপনাকে সেগুলি এর -dynamicমতো সংকলন করতে হবে :

 $ ghc -O2 --make -dynamic A.hs

এছাড়াও, আপনি যে কোনও লাইব্রেরি ভাগ করতে চান তা দিয়ে এগুলি তৈরি করা উচিত --enabled-shared:

 $ cabal install opengl --enable-shared --reinstall     
 $ cabal install glfw   --enable-shared --reinstall

এবং আপনি একটি অনেক ছোট নির্বাহযোগ্য, এবং সি এবং হাস্কেল নির্ভরতা উভয়ই গতিশীলভাবে সমাধান করা শেষ হবে।

$ ghc -O2 -dynamic A.hs                         
[1 of 4] Compiling S3DM.V3          ( S3DM/V3.hs, S3DM/V3.o )
[2 of 4] Compiling S3DM.M3          ( S3DM/M3.hs, S3DM/M3.o )
[3 of 4] Compiling S3DM.X4          ( S3DM/X4.hs, S3DM/X4.o )
[4 of 4] Compiling Main             ( A.hs, A.o )
Linking A...

এবং, voilà!

$ du -hs A
124K    A

যা আপনি আরও ছোট করতে স্ট্রিপ করতে পারেন:

$ strip A
$ du -hs A
84K A

বহু গতিশীল সংযুক্ত সি এবং হাস্কেল টুকরো থেকে তৈরি একটি অনাদায়ী ওজনসি কার্যকর:

$ ldd A
    libHSOpenGL-2.4.0.1-ghc7.0.3.so => ...
    libHSTensor-1.0.0.1-ghc7.0.3.so => ...
    libHSStateVar-1.0.0.0-ghc7.0.3.so =>...
    libHSObjectName-1.0.0.0-ghc7.0.3.so => ...
    libHSGLURaw-1.1.0.0-ghc7.0.3.so => ...
    libHSOpenGLRaw-1.1.0.1-ghc7.0.3.so => ...
    libHSbase-4.3.1.0-ghc7.0.3.so => ...
    libHSinteger-gmp-0.2.0.3-ghc7.0.3.so => ...
    libHSghc-prim-0.2.0.0-ghc7.0.3.so => ...
    libHSrts-ghc7.0.3.so => ...
    libm.so.6 => /lib/libm.so.6 (0x00007ffa4ffd6000)
    librt.so.1 => /lib/librt.so.1 (0x00007ffa4fdce000)
    libdl.so.2 => /lib/libdl.so.2 (0x00007ffa4fbca000)
    libHSffi-ghc7.0.3.so => ...

একটি চূড়ান্ত বিষয়: এমনকি কেবল স্থিতিশীল লিঙ্কযুক্ত সিস্টেমেও আপনি শীর্ষ স্তরের ক্রিয়াকলাপের জন্য একটি .o ফাইল পাওয়ার জন্য -স্প্লিট-অবজেক্টগুলি ব্যবহার করতে পারেন যা স্থিরভাবে সংযুক্ত লাইব্রেরির আকারকে আরও হ্রাস করতে পারে। এটি -স্প্লিট-আপত্তি দিয়ে তৈরি করতে জিএইচসি প্রয়োজন, যা কিছু সিস্টেম করা ভুলে যায়।


7
ডাব্লিক সংযোগ কখন ম্যাকের জন্য জিএইচসি-এর কারণে আসবে?
কার্টার তাজিও শোনওয়াল্ড

1
... cabal installডিফল্টরূপে ইনস্টল করা বাইনারিটি ফেলা না ?
এইচভিআর

1
উইন্ডোজে এটি করা ফলস্বরূপ ফাইলটি চালানো যায় না বলে মনে হয়, এটি অনুপস্থিত libHSrts-ghc7.0.3.dll সম্পর্কে অভিযোগ করেছে

3
এই পদ্ধতিগুলি পরে এই বাইনারি অন্যান্য লিনাক্স মেশিনে কাজ করবে?
レ ッ ク ス

1
হাই ওপি ২০১১ থেকে! আমি ভবিষ্যতে থেকে এসেছি এবং বলতে পারেন যে উবুন্টু 16,04 উপর pandoc এক্সিকিউটেবল 50MB চর্বি এবং এটি ভিত্তিতে পরিবর্তন করা যাচ্ছে packages.ubuntu.com/zesty/pandoc । নিকট ভবিষ্যতে স্ব এবং অন্যদের জন্য বার্তা: প্যাকেজ রক্ষণাবেক্ষণকারীকে যোগাযোগ করুন এবং enable-sharedবিবেচনা করা হয়েছে কিনা তা জিজ্ঞাসা করুন । লঞ্চপ্যাড.এন.উবুন্টু
++সোর্স / প্যান্ডোক /+ বাগস

11

হাস্কেল ডিফল্টরূপে স্থির লিঙ্ক ব্যবহার করে। এটি হ'ল ওপেনজিএল-এর সম্পূর্ণ বাইন্ডিংগুলি আপনার প্রোগ্রামে অনুলিপি করা হয়েছে। এগুলি বেশ বড় হওয়ায় আপনার প্রোগ্রামটি অযৌক্তিকভাবে ফুলে উঠেছে। আপনি এটি প্রায়শই গতিশীল লিঙ্ক ব্যবহার করে কাজ করতে পারেন, যদিও এটি ডিফল্টরূপে সক্ষম হয় না।


5
আপনি এটিকে কাজ করার জন্য লাইব্রেরিগুলিকে গতিশীলভাবে লিঙ্ক করতে পারেন। এটি ডিফল্ট কী তা বিবেচনা করে তা নিশ্চিত নয়, পতাকাটি যথেষ্ট সহজ।
থমাস এম ডুবুইসন

4
সমস্যাটি হ'ল "আপনি যে লাইব্রেরিগুলি ভাগ করে নিতে চান তা দিয়ে তৈরি করা উচিত --enabled-shared" সুতরাং যদি আপনার হাস্কেল প্ল্যাটফর্মটি যদি --enabled sharedআপনি তৈরি না করে নির্মিত লাইব্রেরি নিয়ে আসে তবে আপনাকে বেস লাইব্রেরিগুলি পুনরায় সংকলন করতে হবে যা বেশ বেদনাদায়ক হতে পারে।
এনপোনকোপ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.