برنامه شما باید مراحل را به صورت متوالی اجرا کند تا به سیستم عامل ها دستور دهد تا کار خاصی را اجرا کنند. در طی این فرآیند، سیستم عامل باید کد منبع ذخیره شده در کتابخانه های برنامه شما را برای اجرا به کد ماشین تبدیل کند. پیوند به روش ترکیب برنامه های خارجی با سیستم عامل برای اجرای موفقیت آمیز اشاره دارد. دو روش اصلی برای دستیابی به این امر وجود دارد: پیوند استاتیک و پیوند پویا.
روشی که انتخاب می کنید به عوامل مختلفی مانند اندازه فایل و زمان بارگذاری بستگی دارد. در این پست، تفاوت بین پیوند استاتیک و پویا و همچنین زمان استفاده از هر یک را یاد خواهید گرفت.
پیوند استاتیک چیست؟
پیوند استاتیک عمل کپی کردن تمام کتابخانه های مورد نیاز برنامه شما به طور مستقیم در فایل اجرایی نهایی است. این درست در پایان کامپایل رخ می دهد و توسط یک پیوند دهنده انجام می شود.
ابتدا، پیوند دهنده کد برنامه را با تمام کتابخانه های مورد نیاز ترکیب می کند. پس از تکمیل، همه چیز در یک فایل اجرایی کامپایل می شود. هنگامی که برنامه نصب می شود، تمام کتابخانه های مورد نیاز در حافظه بارگذاری می شوند.
اینجاست که اصطلاح “ایستا” وارد بازی می شود. اکنون که همه چیز با هم ارسال شده است، در صورت ایجاد هرگونه تغییر در کتابخانه های خارجی، باید کل این فرآیند را دوباره انجام دهید.
این فرآیند طولانی به نظر می رسد، اما مزایای متعددی برای استفاده از پیوند استاتیک وجود دارد.
- پیوند استاتیک می تواند فرآیند توزیع باینری ها را در چندین محیط یا سیستم عامل ساده کند، زیرا برنامه از قبل همه چیزهایی را که برای اجرا نیاز دارد دارد.
- پیوند استاتیک بسته به پیچیدگی برنامه می تواند منجر به راه اندازی کمی سریعتر شود. این همچنین منجر به احتمال کمتر مشکلات سازگاری می شود.
اما پیوند استاتیک دارای معایبی نیز هست.
- از آنجایی که شما تمام کتابخانه ها را در یک فایل اجرایی کامپایل و ارسال می کنید، برنامه می تواند بسیار بزرگتر باشد و از منابع زیادی استفاده کند. این شامل حافظه نهان، رم و فضای دیسک است.
- اگر تغییراتی در برنامه های خارجی رخ دهد، به طور خودکار در فایل اجرایی شما منعکس نمی شوند. شما باید کل فرآیند کامپایل و پیوند را دوباره انجام دهید.
اکنون بیایید گزینه دیگر شما را مورد بحث قرار دهیم: پیوند پویا.
لینک سازی پویا چیست؟
پیوند پویا زمانی است که کتابخانه های خارجی یا اشتراکی در فایل اجرایی با نام درست در زمان اجرا کپی می شوند. تنها در این صورت است که تمامی کتابخانه های مورد نیاز توسط سیستم عامل در حافظه بارگذاری می شوند.
در طول پیوند پویا، سیستم عامل کتابخانه های خارجی را در هنگام اجرای برنامه مکان یابی می کند. اگر تغییری در کتابخانههایی که اکنون در حافظه بارگذاری شدهاند رخ دهد، فایل اجرایی نیازی به کامپایل مجدد و ارسال به عنوان یک فایل اجرایی جدید ندارد.
لینک سازی پویا مزایای زیادی دارد.
- پیوندهای پویا منجر به حجم کمتر فایل می شود. کد کتابخانه های پیوند داده شده نیازی به ارسال با فایل اجرایی ندارد. این به معنای استفاده کمتر از منابع مانند فضای دیسک یا رم است.
- اگر یک کتابخانه مشترک از قبل در سیستم عامل موجود باشد، زمان راه اندازی را می توان کاهش داد.
- میتوانید روالهای کتابخانهها را بدون نیاز به پیوند مجدد بهروزرسانی کنید، به این معنی که رفع اشکال و سایر تغییرات بدون نیاز به ارسال فایل اجرایی جدید قابل اجرا هستند.
- هزینه های نگهداری کمتر و نیاز به پشتیبانی کاهش می یابد.
در حالی که به طور کلی کارآمدتر به نظر می رسد، پیوند پویا مجموعه ای از خطرات خود را دارد.
- حذف یک کتابخانه می تواند باعث خرابی برنامه شود. یا اگر تغییراتی در کتابخانه ایجاد شود، ممکن است با مشکلات سازگاری مواجه شوید و در نتیجه برنامه را دوباره کار کنید.
- اگر یک پیوند دهنده پویا غیر قابل انعطاف دارید، می توانید متوجه شوید که این برنامه دیگر اصلاً راه اندازی نمی شود یا به درستی کار نمی کند
اکنون که مزایا و معایب هر کدام را می دانید، بیایید این دو روش پیوند را با هم مقایسه کنیم.
پیوند استاتیک در مقابل پویا
اساساً، پیوند استاتیک شامل کامپایل کتابخانه ها در برنامه یا برنامه شما به عنوان بخشی از فرآیند ساخت است. پیوند پویا به سیستم عامل اجازه می دهد تنها زمانی که برنامه راه اندازی می شود، کتابخانه های مشترک را متوقف کرده و در حافظه بارگذاری کند.
هر دوی این فرآیندهای پیوند در نحوه ساخت، ارسال و مدیریت متفاوت هستند. اما تفاوت بین پیوند استاتیک و پویا فقط به ترجیحات یا تجربه کاربری شما مربوط نمی شود. شما باید بر اساس موارد استفاده فردی، از جمله آنچه میسازید و جایی که آن را ارسال میکنید، انتخاب کنید.
گاهی اوقات، تصمیم به استفاده از یکی بر دیگری ممکن است از دست شما گرفته شود.
به عنوان مثال، شما همیشه باید از پیوندهای پویا برای ساخت پلاگین ها استفاده کنید. به طور مشابه، می تواند تنها راه عملی برای برآوردن الزامات باشد مجوزهای نرم افزار رایگان مانند LGPL.
ممکن است کامپایلر شما یک محدودیت باشد. برخی از کامپایلرها (مانند کامپایلر Google Go که معمولاً برای کار با منابع داده Google Cloud استفاده می شود) فقط به شما امکان می دهند باینری ها را به صورت ایستا کامپایل کنید.
اما وقتی تصمیم گیری به عهده شماست، چگونه انتخاب می کنید؟
- اگر به عملکرد مربوط می شود، ممکن است بخواهید پیوند پویا را در نظر بگیرید. اگر چندین برنامه از کتابخانههای مشترک استفاده میکنند، پیوند پویا میتواند از یک برنامه پیوند استاتیک بهتر عمل کند.
- در نظر بگیرید که آیا برنامه شما حجم بالایی از تماس های کتابخانه را انجام می دهد یا تعداد زیادی تماس کوچک با روال های کتابخانه. در آن مثال، برنامههایی که به صورت ایستا پیوند دارند ممکن است عملکرد بهتری داشته باشند.
ملاحظات دیگر، سطح و فراوانی بهروزرسانیهایی است که پیشبینی میکنید. رفع اشکالات و به روز رسانی های حمل و نقل با برنامه هایی که به صورت ایستا مرتبط هستند کارایی بسیار کمتری دارند. شما باید هر بار کل فایل اجرایی را کامپایل و ارسال کنید.
با پیوند پویا، کاربران هر بار که یک برنامه اجرا می شود، آخرین نسخه آن را بارگیری می کنند زیرا با آخرین نسخه کتابخانه ها تماس می گیرد. بنابراین می توانید تغییرات مورد نیاز را بدون نیاز به کامپایل مجدد همه چیز انجام دهید.
کار با چندین فایل اجرایی: پیوند استاتیک یا پویا؟
همه موارد بالا فرض می کنند که ما با یک فایل اجرایی که به طور منظم کامپایل شده است کار می کنیم. اما پسوندها چطور؟
سناریوهایی وجود دارد که در آن پیوند استاتیک کاملاً غیرعملی خواهد بود و این یکی از آنهاست.
فرض کنید یک برنامه تلفن همراه دارید که حاوی برنامه اصلی است اما از برنامه های افزودنی برای عملکردهای خاص استفاده می کند. به عنوان مثال، این می تواند شامل برنامه های افزودنی برای مواردی مانند اعلان های فشار باشد.
در این مثال، برنامههای افزودنی احتمالاً فقط از تعداد کمی از کتابخانههای مورد استفاده برنامه اصلی استفاده میکنند. با این حال، برنامههای افزودنی احتمالاً کدهای زیادی را با برنامه اصلی به اشتراک میگذارند.
اگر بخواهید هر فایل اجرایی را به صورت ایستا پیوند دهید، کدی را کپی میکنید که برای همه پسوندها و برنامه اصلی مشترک است. این منجر به مقدار زیادی فضای تلف شده در دستگاه می شود و در مورد برنامه های افزودنی، سیستم عامل ممکن است محدودیت های سختی برای ایجاد این نوع عملکرد با استفاده از پیوند پویا داشته باشد.
ترکیب کتابخانه های استاتیک و دینامیک
پیوندهای ایستا و پویا می توانند از جهاتی پشت سر هم کار کنند. برای مثال، ممکن است در سناریویی قرار بگیرید که در آن به یک کتابخانه استاتیک برای تشکیل بخشی از یک کتابخانه پویا نیاز دارید.
در این صورت، باید مطمئن شوید که هنگام اجرای فایل اجرایی با نمادهای حل نشده مواجه نخواهید شد. این امر مستلزم ایجاد یک کتابخانه پویا است که شامل تمام نمادها از یک کتابخانه استاتیک جداگانه است.
هنگام ایجاد کتابخانه ایستا، گزینه ای برای کامپایلر ایجاد کنید تا کد مستقل از موقعیت (PID) را برای هر شی در کتابخانه استاتیک ایجاد کند. ساختن اشیاء کتابخانه وضعیت شما به PID تضمین می کند که آنها دقیقاً مانند یک کتابخانه پویا قابل جابجایی هستند (این همان چیزی است که سیستم عامل در نهایت برای برقراری تماس از آن استفاده می کند).
استفاده از پیوند استاتیک و دینامیک
پیوند استاتیک و پویا دو روش اساسی برای کامپایل و ارسال یک برنامه هستند. هر کدام مزایا و مزایای خاص خود را در رابطه با زمان بارگذاری، عملکرد کلی و سهولت به روز رسانی دارند.
روشی که انتخاب میکنید کاملاً به مورد استفاده شما و جایی که برنامه خود را اجرا میکنید بستگی دارد. قبل از تصمیمگیری، پیامدهای سیستمعاملهای مختلف، تجربه کاربری و توانایی خود را برای استقرار سریع وصلهها و بهروزرسانیها به دقت در نظر بگیرید.