کتابخانه های ایستا و پویا و شیوه های Linker در برنامه نویسی

دو روش برای ساخت یک برنامه دودویی اجرا شدنی یا Binary Executable هست: ۱) شیوه Static Linking و  ۲)  شیوه Dynamic Linking. در شیوه Static Linking از یک کتابخانه استاتیک یا Static Library کمک گرفته شده است.

کتابخانه های ایستا و اشتراکی چه هستند

در این شیوه، برنامه موسوم به Linker (پیوند دهنده) همه ی کد تابع کتابخانه و همه داده ها را درون یک فایل دودویی اجرایی  با پسوند out برای نمونه a.out نگهداری می کند. البته این پسوند out اجباری نیست و می توانید آنرا ننوسید. در دستور زیر می بینید که خروجی دودویی اجرایی برنامه سی، بدست گزینه o- ساخته می شود که در اینجا آن را a.out نامگذاری کرده ایم ولی بایدی برای بودن پسوند out نیست. برای کامپایل یک برنامه نوشته شده به زبان C می توانیم از خط فرمان و از کامپایلر gcc (کوتاه شده GNU C Compiler) به گونه زیر کمک بگیریم:

gcc my_c_program.c -o a.out

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

شیوه دیگر، Dynamic Library است، که در آن به جای استفاده از Static Library، از Shared Library کمک گرفته می شود. در این شیوه، دیگر همه کتابخانه ها درون فایل a.out نگهداری نمی شوند، بلکه فراخوان هایی (Call) به تابع های استفاده شده به ریخت یک Directive در فایل a.out نگهداری می شوند.

هرگاه که یک فایل a.out به گونه پیوند پویا را اجرا می کنید، وظیفه سیستم عامل است تا هم فایل a.out و هم کتابخانه های نیاز آن را درون حافظه بارگذاری کند. از این رو درون حافظه برنامه دودویی اجرا شدنی به کدهای مورد نیازش دسترسی دارد.

بنابراین در شیوه پیوند پویا، به جای آن که کتابخانه ها به ریخت ایستا درون خود فایل a.out نگهداری شوند، هر زمان که برنامه a.out اجرا شد، سیستم عامل کتابخانه های نیاز را به درون حافظه بارگذاری می کند و از این رو از بزرگ شدن بی دلیل و بی سود فایل دودویی اجرایی، جلوگیری می شود.

سودمندی های فایل a.out کاهش اندازه فایل بسیاری دیگر از برنامه ها، به کتابخانه های اشتراکی همسانی نیاز دارند که اکنون برای همگی در حافظه بارگذاری شده اند. چرایی برجسته دیگر برای به کار گیری Dynamic Linker در این است با دگرگونی در یک کتابخانه، دیگر نیازی نیست که خود فایل a.out را از نو کامپایل کنیم.

در سیستم عامل ویندوز با واژه کوتاه شده DLL را شنیده باشید که کوتاه شده Dynamic Linking Librarie است. این کتابخانه های شناخته شده به نام DLL کتابخانه های اشتراکی هستند که در کنار (و نه درون) فایل دودویی اجرایی، در حافظه بارگذاری می شوند.

در سیستم عامل لینوکس، کتابخانه های اشتراکی به نام Dynamically Loaded یا کوتاه شده DL شناخته می شوند. بنابراین کتابخانه های اشتراکی زمانی در حافظه بارگذاری می شوند که به آنها نیاز باشد و این نقطه پیش روی کتابخانه های ایستا است که همیشه درون فایل دودویی اجرایی هستند. کتابخانه های DL برای ماژول هایی پویا درون حافظه بارگذاری می شوند، بسیار سودمند و کاربردی هستند.

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

منبع

برای فراگیری بیشتر می توانید به سایت زیر نگاهی بیاندازید

http://sysadmingeeks.ir

https://dataset-academy.com

و یا می توانید در کانال تلگرام عضو شوید.

https://t.me/datasetacademydotcom