انجمن‌های فارسی اوبونتو

لطفاً به انجمن‌ها وارد شده و یا جهت ورود ثبت‌نام نمائید

لطفاً جهت ورود نام کاربری و رمز عبورتان را وارد نمائید


توزیع گنو/لینوکس اوبونتو ۲۰ ساله شد 🎉

نویسنده موضوع: لینک داینامیک در مقابل لینک استاتیک  (دفعات بازدید: 4867 بار)

0 کاربر و 1 مهمان درحال مشاهده موضوع.

آفلاین r_m1232002

  • Full Member
  • *
  • ارسال: 143
لینک داینامیک در مقابل لینک استاتیک
« : 03 فروردین 1392، 07:38 ب‌ظ »
با سلام

در یکی از تاپیک ها بحثی در مورد مزایا و معایب لینک داینامیک در مقابل لینک استاتیک مطرح شده بود. تا جایی که بنده اطلاع دارم لینک داینامیک به صورت کلی بر لینک استاتیک ارجحیت داره اما یکی از دوستان با نظر بنده ابراز مخالفت کردند. به این ترتیب تصمیم گرفتم تا نظر سایر دوستان را نیز در این خصوص جویا بشم تا در صورتی که دیدگاه من اشتباه هست اون رو تصحیح کنم.

لینک داینامیک:

* موجب صرفه جویی در مصرف حافظه می گردد. ( برنامه هایی که از کتابخانه یکسانی استفاده می کنند آن را با یکدیگر شریک می شوند.)

* در صورتی که یک باگ در کتابخانه برطرف شود تنها همان کتابخانه به روز می شود و نیازی به کامپایل مجدد تمام برنامه هایی که از آن استفاده می کنند نیست.

* پلاگین ها تنها به این روش قابل پیاده سازی هستند.

لینک استاتیک:

* سرعت لود شدن برنامه کمی بیشتر است.

* در محیط های بسیار محدود که از لینک داینامیک پشتیبانی نمی کنند مانند روند بوت یا حالت های Rescue Mode تنها گزینه موجود است.

* هنگام توزیع برنامه نیاز به فایل های کمتری می باشد. (اگرچه حجم فایل ها بیشتر می گردد.)


تقاضا دارم شما هم نظر خود را در این خصوص بیان کنید تا من به دید صحیحی نسبت به این موضوع برسم.
با تشکر
« آخرین ویرایش: 03 فروردین 1392، 07:45 ب‌ظ توسط r_m1232002 »

آفلاین MHA152

  • High Hero Member
  • *
  • ارسال: 2745
  • جنسیت : پسر
  • من عاشق یونیکسی ها هستم
پاسخ : لینک داینامیک در مقابل لینک استاتیک
« پاسخ #1 : 03 فروردین 1392، 09:09 ب‌ظ »
خوب دینامیک بهتره ولی بعضی وقت ها نیاز به استفاده از استاتیک می شود
بهتون پیشنهاد می کنم به دنیای بزرگ شبه−یونیکس وارد بشید و از پیشرفت لذت ببرید
جیمیلم

آفلاین سید مسعود امامیان

  • Hero Member
  • *
  • ارسال: 951
پاسخ : لینک داینامیک در مقابل لینک استاتیک
« پاسخ #2 : 03 فروردین 1392، 09:26 ب‌ظ »
لینک استاتیک:
- همه فعالیت در اختیار شماست و شما درحالت داینامیک از dllهای سیستم مقابل اطلاع ندارید، در حالی که درحالت استاتیک نگرانی از بابت نسخه های مشابه dllها در سیستم مقابل ندارید.
- مدت زمان بارگذاری و مقداردهی اولیه کتابخانه با لینک استاتیک کاهش می یابد. به این خاطر که در حالت داینامیک، بسته به تعداد توابع، بارگذاری آن ها در start-up افزایش میابد .
- کاهش هرگونه خطا به خاطره کتابخانه ها .
- در حالت استاتیک برنامه به قسمتی که نیاز دارد رجوع می کند و تابع مورد نیاز را استفاده می کند در صورتی که در حالت داینامیک، تمام کتابخانه باید بارگذاری شود چرا که از تابع درخواستی هیچ اطلاعی ندارد.


به نظرم بستگی به برنامه شخص داره، و قرار ِ این برنامه در کجا استفاده بشود..
برنامه نویس باید در نظر بگیره :

- آیا دسترسی به این برنامه در آینده خواهد داشت ؟
- سیستم مقابل .
- محل استفاده از این برنامه.
- بزرگ یا کوچک بودن برنامه .
- کتابخانه های استفاده شده در برنامه.
- امنیت برنامه .
« آخرین ویرایش: 03 فروردین 1392، 10:37 ب‌ظ توسط سید مسعود امامیان »
به عمل کار برآید     به سخندانی نیست . . .

آفلاین mohsen-rashidi

  • High Sr. Member
  • *
  • ارسال: 646
  • جنسیت : پسر
  • Hacker`s Emblem
    • اینجا خانه محسن است
پاسخ : لینک داینامیک در مقابل لینک استاتیک
« پاسخ #3 : 03 فروردین 1392، 09:26 ب‌ظ »
با عرض شرمندگی میشه توضیح بدید منظور از لینک داینامیک و استاتیک چیه؟

آفلاین علی هردان

  • Full Member
  • *
  • ارسال: 243
  • جنسیت : پسر
پاسخ : لینک داینامیک در مقابل لینک استاتیک
« پاسخ #4 : 03 فروردین 1392، 09:41 ب‌ظ »
با عرض شرمندگی میشه توضیح بدید منظور از لینک داینامیک و استاتیک چیه؟
وقتی شما برنامه ای با استفاده از فریم ورکی مثل Qt مینویسید، برنامه اگه داینامیک باشه برای اجرا شدن احتیاج به چندین فایل dll داره که کنارش قرار بگیرن. ولی اگه استاتیک باشه، برنامه بصورت تک فایل خواهد بود ولی عوضش حجم فایل اصلی بالا خواهد رفت  \\:D/

بنظر من حالت استاتیک به علت پرتابل بودن بهتره، من شخصا از بالا بودن تعداد فایل ها متنفرم. برنامه ای نوشتم که حجم فایل اجراییش ۳۰ مگابایت بود. حاضر نشدم فایل ها رو کنارش بذارم، همه چیز رو بصورت resource گذاشتم.

آفلاین MHA152

  • High Hero Member
  • *
  • ارسال: 2745
  • جنسیت : پسر
  • من عاشق یونیکسی ها هستم
پاسخ : لینک داینامیک در مقابل لینک استاتیک
« پاسخ #5 : 03 فروردین 1392، 09:53 ب‌ظ »
حجم کم و تغیر سریع در کتابخانه ها که مهمتره حالا 100 تا فایل هم که باشه می ذاریم تو یک پوشه و میشه مثل اینکه یکی باشه
بهتون پیشنهاد می کنم به دنیای بزرگ شبه−یونیکس وارد بشید و از پیشرفت لذت ببرید
جیمیلم

آفلاین shervinkh

  • Full Member
  • *
  • ارسال: 197
  • جنسیت : پسر
  • An ENFP
    • سایت شخصی
پاسخ : لینک داینامیک در مقابل لینک استاتیک
« پاسخ #6 : 03 فروردین 1392، 09:57 ب‌ظ »
حالت استاندارد Dynamic هست مگه این که به دلایل خاصی مجبور به کامپایل Static شیم.
Gentoo KDE x86_64
Notebook:Asus N53SN
www.shervin.org

آفلاین r_m1232002

  • Full Member
  • *
  • ارسال: 143
پاسخ : لینک داینامیک در مقابل لینک استاتیک
« پاسخ #7 : 03 فروردین 1392، 11:00 ب‌ظ »
- در حالت استاتیک برنامه به قسمتی که نیاز دارد رجوع می کند و تابع مورد نیاز را استفاده می کند در صورتی که در حالت داینامیک، تمام کتابخانه باید بارگذاری شود چرا که از تابع درخواستی هیچ اطلاعی ندارد.

تا جایی که بنده اطلاع دارم در حالت استاتیک تمام کتابخانه به فایل اصلی برنامه شما لینک شده و اجرای فایل موجب می شود تمام کتابخانه نیز که اکنون بخشی از برنامه است در حافظه بارگذاری شود.
حال اگر دو برنامه اجرا شوند که کتابخانه یکسانی را استفاده می کنند در حالت استاتیک  دو نسخه از کتابخانه در حافظه بارگذاری می شود در حالی که در حالت داینامیک فقط یک نسخه بارگذاری خواهد شد.

آفلاین alend

  • High Hero Member
  • *
  • ارسال: 1319
پاسخ : لینک داینامیک در مقابل لینک استاتیک
« پاسخ #8 : 03 فروردین 1392، 11:34 ب‌ظ »
با gcc چه جوری لینک ها استاتیک می شوند؟

آفلاین r_m1232002

  • Full Member
  • *
  • ارسال: 143
پاسخ : لینک داینامیک در مقابل لینک استاتیک
« پاسخ #9 : 03 فروردین 1392، 11:42 ب‌ظ »
اگرچه کمی قدیمی اما بسیار خوب نوشته شده:
http://www.yolinux.com/TUTORIALS/LibraryArchives-StaticAndDynamic.html

آفلاین alend

  • High Hero Member
  • *
  • ارسال: 1319
پاسخ : لینک داینامیک در مقابل لینک استاتیک
« پاسخ #10 : 04 فروردین 1392، 12:12 ق‌ظ »
باید از گزینه -static-libgcc استفاده کنیم؟

آفلاین AmirrezaGhaderi

  • Jr. Member
  • *
  • ارسال: 90
  • جنسیت : پسر
    • حساب تویتر من
پاسخ : لینک داینامیک در مقابل لینک استاتیک
« پاسخ #11 : 04 فروردین 1392، 12:55 ق‌ظ »
خوب شد که به تاپیک جدا ساختید که بشه به صورت مجزا راجع بهش صحبت کرد. خیلی‌ها (از جمله خودم) معتقد هستن که
لینک استاتیک، به نسبت لینک دینامیک موجه تره. من اصلا با لینک دینامیک مخالف نیستم و فکر میکنم خیلی هم کاربردیه.
اما نمیشه گفت که مزایای بیشتری داره و بهتره که در اکثر اوقات از لینک دینامیک استفاده کنیم. هرچیزی رو باید به
وقتش استفاده کرد. اما در نهایت همونطور که گفتم، فکر میکنم به دلایلی که در زیر توضیح میدم، لینک استاتیک روش
موجه تری باشه.


- در لینک استاتیک، کتابخونه های جانبی، با برنامه‌ی اصلی شما پیوند داده میشن. خروجی در نهایت یک فایل
یک‌تکه خواهد بود. اکثر کامپایلرها امروزه باهوش شدن و تمام کتابخونه رو به برنامه لینک نمیکنن، فقط بخشی از کدهای
اون کتابخونه که واقعا نیاز هست به برنامه لینک میشه.

- سایز فایل خروجی بزرگتر میشه، اما با این حال سرعت لود اون بیشتر میشه. چرا همچین اتفاقی میفته؟ چون فایل خروجی شما
در نهایت روی هارد ذخیره میشه و از روی هارد هم لود میشه. وقتی یک فایل یک‌تکه داشته باشیم، این فایل به صورت بایت‌های
پشت سر هم روی هارد ذخیره میشه. وقتی هارد می‌خواد فایل رو لود کنه، هد رو در اون قسمت قرار میده و یه سره شروع میکنه به
لود کردن.

- وقتی لینک استاتیک صورت میگیره، آبجکت ها به هم پیوند داده میشن. هنگامی که کد برنامه‌ی شما به اون قسمت نیاز داشته
باشه، میتونه بدون واسطه ازش استفاده کنه. در این حالت سرعت دسترسی به اون قسمت از کد بالاتر هست.

- خروجی استاتیک، به هیچ پیش نیازی برای اجرا نیاز نداره. یعنی هرچی کدجانبی که لازم داره، همراه خودش هست. ترسی از این
نیست که کتابخونه‌‌ی x یا y روی سیستم مقصد نصب باشه یا نباشه.

- در لینک استاتیک، شما کسی هستید که عمل کامپایل رو انجام میدید. تمام کتابخونه ها از طرف شما کامپایل میشن (هنگام
کامپایل برنامه‌ی اصلی). بنابراین اگر تنظیماتی مد نظرتون هست، میتونید به کامپایلر اعلام کنید. مهمترین مزیت این
قابلیت، بهتر شدن کیفیت مرحله‌ی بهنیه‌سازی کامپایل هست که توسط کامپایلر انجام میشه چون کامپایلر به همه‌ی کدها دسترسی داره.

- مهم تر از همه، مدیریت کتابخونه‌های جانبی به طرز فوق الآده ایی آسون میشه. دیگه نگران این نیستید که با تغییر ورژن یکی
از این کتابخونه ها، مشکلی در کد شما پیش بیاد. یا به علت قدیمی بودنشون نتونید روی سیستم مقصد از چیزهایی که دوست دارید
استفاده کنید. در لینک استاتیک شما تعیین میکنید که برنامه‌ی شما از کدوم نسخه استفاده کنه.

- برای داشتن یک سیستم پلاگین، امروزه دیگه اکثر برنامه ها از زبان های اسکریپتی استفاده میکنن. مثلا از پایتون، پرل، روبی
، js، lua ... کم پیش میاد که برنامه ایی یک پلاگین رو به صورت آبجکت باینری با خودش همراه کنه. شما براحتی میتونی مفسر
این زبان هارو داخل برنامه ات قرار بدی. مثلا ادیتور sublime‌ با اینکه استاتیک کامپایل شده، اما از پایتون برای پلاگین ها
استفاده میکنه. هرچند که همراه کردن یک فایل دینامیک اضافی (فایل اصلی مفسر) چیز خوبیه و راحت تر هم هست.



در مورد لینک دینامیک:

- تو لینک دینامیک، جدای از اینکه برنامه ی شما به چه میزان از کدهای اون کتابخونه نیاز داره، باید کل اون کتابخونه در حافظه لود بشه.


- لینک دینامیک حافظه‌ی کمتری میگیره؟ در اغلب اوقات بله، اما نه همیشه. چون سایز فایل خروجی کوچک هست، دلیل بر این نیست
که در حافظه هم همین قانون برقرار باشه. وقتی برنامه‌ای اجرا میشه، تمام کدها و کتابخونه های جانبی باید به حافظه لود شده باشن.
در سیستم هایی مثل لینوکس، خیلی از کتابخونه ها از قبل توی حافظه لود شدن، و چون میشه ازشون به صورت اشتراکی استفاده کرد،
دیگه لازم نیست هر برنامه به صورت جداگانه کتابخونه ها رو لود کنه. پس در واقع سایز حافظه ایی که برنامه‌ی شما نیاز داره فرقی با وقتی
که به صورت استاتیک لینک شده باشه نداره، اما چون داره به صورت اشتراکی از کتابخونه هایی که برنامه های دیگه ممکنه به حافظه لود کرده
باشن استفاده میکنه، بنابراین خودش به صورت تنها حافظه ی کمتری رو اشغال میکنه. به هر عنوان اگه یک سری از کتابخونه ها از قبل در
حافظه نباشن، باید به حافظه لود بشن. بنابراین این قضیه بیشتر به شانس ربط داره. در سیستمی مثل لینوکس، شانس اینکه خیلی از کتابخونه
ها توی رم موجود باشن زیاده. پس استفاده از لینک دینامیک توی لینوکس فکر خوبیه. ولی این ربطی به مکانیزم لینک دینامیک نداره، اگه
لینوکس رفتارش به این شکل نبود، لینک دینامیک با استاتیک فرق خاصی توی این مطلب نداشتن.

- با وجود حجم خروجی کوچک، سرعت لود شدن از هارد غالبا کمتره. در لینک دینامیک، فایل ها کنار هم چیده نشدن. ممکنه یکی از کتابخونه
ها کلا روی درایو دیگه ایی قرار داشته باشه. حالا حساب کنین که هد برای خوندن هر کدوم از اون ها چقدر باید جا به جا بشه. دوباره، به
لطف اینکه توی لینوکس خیلی از کتابخونه ها قبلا در رم لود شدن، این پروسه میتونه با سرعت مناسب انجام بشه. که باز هم قضیه به خود
لینک شدن دینامیک مربوط نیست و در واقع کاریه که لینوکس داره انجام میده.

- توی لینک دینامیک، آبجکت ها یک جا قرار ندارن. به صورت جدا از همدیگه هستن، و حتی توی قسمتهای مختلف حافظه قرار دارن. سرعت دسترسی
به آبجکت های مورد نیاز از برنامه‌ی اصلی شما به مراتب کمتر از لینک استاتیک خواهد بود. جدای از اینکه مقداری کد برای برقرای این ارتباط توسط کامپایلر
تولید شده وگرنه خود به خود نمیشد آبجکت ها رو صدا زد.

- در لینک دینامیک، هیچ کنترلی روی کامپایل شدن کتابخونه ی جانبی ندارید. هیچ تنظیم دلخواهی رو نمی تونید برای کامپایلر ست کنید.
مجبورید با جوری که کامپایل کننده ی اون پکیج برنامه رو کامپایل کرده سر کنید.

- در لینک دینامیک، هیچ تظمینی نیست که تمام پکیج های جانبی روی سیستم مقصد هم نصب باشه. مجبورید جداگونه اون ها رو نصب کنید،
یا اینکه همراه بسته ی اصلی برنامتون قرارشون بدید (که در واقع دارید همون کار لینک استاتیک رو انجام میدید!)

- وقتی یه ایراد کوچیک توی یک کتابخونه جانبی پیدا بشه، راحت میشه نسخه ی جدید اون رو به صورت جداگانه نصب کرد بدون اینکه برنامه‌ی
اصلی نیاز به کامپایل مجدد داشته باشه. این خیلی چیز خوبیه. ولی در عمل این بیشتر از اینکه مزیت باشه تبدیل شده به یه عیب. چند بار
پیش اومده که برنامه ی شما بعد از آپدیت یه پکیج جانبی دیگه کار نکرده؟ چند بار شده خواسته باشین چیزی روی لینوکس نصب کنید اما چون
پکیج های جانبیش قدیمی بودن و اون برنامه به پکیج های جدیدتر نیاز داشت نتونستید این کار رو انجام بدید؟ مدیریت بسته ها چی؟ من سال ها با پایتون کار کردم،
پایتون به اون راحتی، که همه‌ی فایل هاش فقط به صورت متنی هستن، وقتی پکیج ها با هم قاطی پاتی میشن واقعا
روانی میکنه شما رو!!! حالا دیگه زبان های کامپایلری که جای خودشونو دارن.


به تمام دلایل بالا، خیلی از زبان ها کامپایل استاتیک رو ترجیح میدن. مثلا همین دلفی. یا فری پاسکال (تا جای که به خاطر دارم). یا Go
(دقت کنید که یکی مثل کن تامپسون که پدر یونیکس هست جزو تیم Go‌ هست). یا خیلی از نسخه‌های لیسپ. یا haskell. پس همونطور که میبین تنها
من نیستم که فکر میکنم لینک استاتیک شاید در بیشتر موارد مناسب تر از لینک دینامیک باشه.

در سیستمی مثل لینوکس چرا لینک دینامیک زیاد استفاده میشده؟ خوب یکی از دلایل اصلی رو که بین توضیحاتم گفتم. چون اکثر کتابخونه ها توی
لینوکس وجود داره (چون یه سیستم مناسب برای برنامه نویسیه) و اکثر کتابخونه ها هم در حافظه به صورت لود شده قرار دارن و میشه به شکل
اشتراکی ازشون استفاده کرد.
اما دلیل دیگه که شاید از دلیل اول مهم تر باشه «مجوز» برنامه هاست! مجوزهایی مثل gpl یا lgpl رابطه ی خوبی با لینک استاتیک ندارن و
اون آزادی عمل رو به توسعه دهنده نمیدن. برای همینه که برنامه نویس های bsd زیاد این مجوز هارو قبول ندارن و فکر میکنن که محدود
کننده هستن. اگه دقت کنید تو سال های اخیر هم اکثر کتابخونه ها با مجوزهایی مثل BSD یا MIT‌ منتشر میشن.
فرضا در جامعه‌ی Go، اگه مجوز کدهای شما BSD‌ نباشه، ممکنه هیچ وقت از طرف هیچ کسی استفاده نشه. قضیه مجوز ها تاثیر خیلی زیادی روی لینک شدن
دینامیک یا استاتیک توی همچین سیستم هایی دارن.

باز هم میگم، من مخالف لینک دینامیک نیستم، مثل کسی هستم که با پرتغال مشکلی نداره، اما ترجیح میده که اگه قراره چیزی بخوره، اون میوه سیب باشه!
« آخرین ویرایش: 04 فروردین 1392، 02:24 ق‌ظ توسط AmirrezaGhaderi »

آفلاین r_m1232002

  • Full Member
  • *
  • ارسال: 143
پاسخ : لینک داینامیک در مقابل لینک استاتیک
« پاسخ #12 : 04 فروردین 1392، 01:18 ق‌ظ »
از وقت و انرژی که صرف نوشتن این پست مفید کردید ممنونم.

آفلاین محمدرضا ح.

  • High Hero Member
  • *
  • ارسال: 3117
  • جنسیت : پسر
  • Your Future is our Past!
پاسخ : لینک داینامیک در مقابل لینک استاتیک
« پاسخ #13 : 04 فروردین 1392، 01:22 ق‌ظ »
ممنون از آقای قادری که همیشه بهترین توضیحات رو ارائه میکنند و از طرفی عادت به گفتن "نمیشه" ، "بدم میاد" و کلا عبارات منفی ندارند :) .

در ضمن من هم نظرم رو بگم. من هم لینک استاتیک رو بیشتر میپسندم اما مشکل اینه که برنامه ای که در اصل باید 15 مگ باشه میشه 70 مگ (تازه نمونه سادش :) ). به همین دلیل مجبورم عموما داینامیک کار کنم. البته در خانواده یونیکس جز در موراد معدود (مثل توزیع Slackware) دینامیک مشکل ساز نیست و میشه به سادگی ازش استفاده کرد.
قاضی : تو السالوادور چه کار میکردی؟
چه‌گوارا : آفتاب میگرفتم
قاضی : پس چرا ساختمان دادگستری رو منفجر کردی؟
چه‌گوارا : جلوی آفتاب رو گرفته بود

آفلاین AmirrezaGhaderi

  • Jr. Member
  • *
  • ارسال: 90
  • جنسیت : پسر
    • حساب تویتر من
پاسخ : لینک داینامیک در مقابل لینک استاتیک
« پاسخ #14 : 04 فروردین 1392، 02:32 ق‌ظ »
شرمنده اگه توش غلط املایی میبینید یا جمله بندی ها خیلی مناسب نیست. آخر شب هست و چشو چالم داغونه :)