مقدمهواژه «کتابخانه» (Library) در برنامه نویسی بسیار پرکاربرد است و هر گاه سخن از برنامه نویسی به میان میآید، اصطلاح کتابخانه هم شنیده میشود. اما ممکن است تا کنون تعریف دقیقی از چیستی کتابخانه در ذهن وجود نداشته باشد. کتابخانه یکی از مفاهیم و اجزای بسیار مهم در برنامه نویسی به حساب میآید و شناخت دقیق آن برای هر فرد فعال در حوزه برنامه نویسی ضرورت دارد. میتوان به صورت کلی گفت که کتابخانه در برنامه نویسی مجموعهای از کدهای از قبل نوشته شده است که برنامه نویسان برای بهینهسازی کدهای خود از آنها استفاده میکنند.
|
چرا باید از کتابخانه ها استفاده کنیم؟
- این کتابخانه ها دارای کدهایی از پیش ساخته هستند که توسط برنامه نویسان دیگر در سراسر جهان نوشته شده اند. وجود این کدها می تواند کمک شایانی در نوشتن برنامه های اندروید داشته باشد. درواقع کدهای موجود در این برنامه ها می توانند به سرعت بخشیدن ساخت ماژول ها مفید باشند. با کتابخانه های برنامه نویسی دیگر نیازی نیست که نوشتن برنامه خود را از صفر شروع کنید.
- این کتابخانه ها چون توسط کاربرانی از سراسر دنیا نوشته شده و مورد استفاده قرار می گیرند در نتیجه تست شده هستند و امکان خطا در آن ها کمتر است. اگر هم اشکالی به صورت پیش فرض در آن ها وجود داشته باشد با میلیون ها بار استفاده به طور قطع برطرف شده است. از این رو پایداری و ثبات بیشتری را به شما می دهند.
- این کتابخانه ها در مجموعه خود دارای قوانینی هستند که میتوان آنها را به عنوان تنظیمات پیش فرض دانست. این قوانین باعث می شوند که ویژگی های یک برنامه از حد خاصی تجاوز نکنند بنابراین اپلیکیشن را تا حد زیادی امن می کنند.
کتابخانه به بستهبندی توابعی کمک میکند که در یک فایل باهم در ارتباط هستند و سازماندهی و دسترسی به این توابع از طریق کتابخانه آسانتر میشود. در دنیای برنامه نویسی و رو به پیشرفت امروزی، هر روز تعداد بسیاری برنامه نوشته میشوند و هر لحظه تعداد کدهای برنامه به صورت نمایی در حال افزایش است. کتابخانه در برنامه نویسی به جهت مدیریت چندین هزار و حتی میلیونها خط از کدها مورد استفاده قرار میگیرد.
در ادامه مقاله به «مفهوم کتابخانه ها در لینوکس» پرداخته شده است.
انواع کتابخانه های لینوکس
کتابخانه های سرور مجازی و سیستم عامل لینوکس به طور کلی به دو دسته تقسیم می شوند:
کتابخانههای پویا یا Shared Libraries (Dynamic Libraries) و کتابخانه های ثابت یا (Static Libraries)
-
کتابخانه های ثابت (Static Libraries)
وجود کتابخانه های ثابت در زمان کامپایل یک برنامه ضروری است اما مشکل عمده آن ها این است که برای هر برنامه ای نیاز به کامپایل دارند. به زبانی ساده تر هر برنامه ای به صورت مستقل نیازمند اجرا و بارگیری در حافظه دارد. در واقع کاربرد بیشتر این کتابخانه ها زمانی مشخص می شود که برنامه ای کوچک و با توابع کم مورد بررسی باشد. اما برای برنامه های بزرگ از کتابخانه های پویا استفاده می شود که از این پس راجع به آن صحبت می کنیم.
-
کتابخانه های پویا (Dynamic Libraries) یا اشتراکی (Shared Libraries)
ممکن است که برنامه های متعدد از تعداد زیادی کتابخانه استفاده کنند، در این صورت نیازمند یک کتابخانه به اشتراک گذاشته شده هستند. همان طور که از نام آن ها پیداست، این کتابخانه ها قابلیت اشتراک گذاری توابع را برای برنامه های مختلف دارا هستند. در واقع این نوع کتابخانه ها نیاز به استفاده مداوم ندارند و تنها یک بار بارگذاری می شوند و پس از آن برنامه های مختلف قابلیت استفاده از توابع و کدهای آنها را دارند.
در لینوکس کتابخانه های پویا را با فرمت so. (مخفف Shared Object) بر اساس معماری ۳۲ یا ۶۴ بیتی سیستم عامل، درون یکی از دایرکتوری های /usr/lib یا /usr/lib64 قرار دارند. این کتابخانه ها را می توان از دو راه استفاده کرد:
- (Dynamic linking) زمانی که برنامه لینک شده در حال انجام است, لینوکس می تواند این کتابخانه را در زمان اجرای برنامه های دیگر بارگذاری کند.
- (Dynamic loading) با دو گزینه load و Unload این کتابخانه ها می توانند به صورت کاملا پویا عمل کنند و زمانی که یک برنامه نیازمند یک تابع است آن را بارگذاری و در اختیار آن قرار دهند. روش کاملا پویا روشی رایج برای برنامه هایی مانند مرورگرهاست که قابلیت پشتیبانی از افزونه ها را دارند.
منطور از برنامه یک فرایند است که در حافظه قرار گرفته است و به همراه آن نیز فایل های کتابخانه اشتراکی نیز در حافظه قرار می گیرند. این فایل ها معادل فایل های dll. در ویندوز و فایل dylib. در سیستم عامل مکینتاش هستند. کتابخانه های استاتیک بر خلاف کتابخانه های اشتراکی در زمان کامپایل به فایل های Object پیوند داده می شوند. این فایل ها دارای پسوند a. هستند که به صورت فایل های Object معمولی هستند.
” زمانی که یک برنامه اجرا میشود کتابخانه های مرتبط با آن در صورتی که از قبل بارگیری نشده باشند توسط مفسر (Interpreter) بارگیری میشوند. “
|
مثال لیست کردن فایل
به عنوان مثال در ادامه ما برنامه باینری ls که به منظور لیست کردن فایل استفاده میشود را مورد بررسی قرار میدهیم.
[root@server lib64]# file /bin/ls bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically/ linked (uses shared libs), for GNU/Linux 2.6.18, strippe
|
همانطور که مشاهده میکنید این فایل یک فایل باینری و قابل اجرا است که توسط ELF یا Executable Linking Format مدیریت میشود و به صورت پویا لینک شده است.
Interpreter ELF وظیفه اجرای کتابخانه های یک برنامه را دارد؛ هر فایل اجرایی شامل یک header است که مشخصات کتابخانهها و کدهای استفاده شده و نقطه شروع (Start Point) را مشخص می کند.
مفسر مربوط به فراخوانی کتابخانه ها که در تصویر زیر مشاهده میشود، ld-linux-x86-64.so.2 است که به فایل ld-2.12.so لینک شده است.
این فایل که خود به صورت کتابخانهای از توابع و کلاسها است به صورت ایستا لینک شده است، زمانی که یک کتابخانه پویا به صورت لینک شده نیاز است، هسته لینوکس این لینک را اجرا و مقداردهی میکند تا بتواند کتابخانه های مرتبط با یک برنامه را لود کند.
[root@server lib64]# ldd /lib64/ld-2.12.so statically linked
|
زمانی که کار اجرای بارگیری کتابخانهها انجام شد، جابجایی صورت گرفته در مرحله قبل به حالت اولیه بازگشته و کنترل برای اجرا به برنامه داده میشود و هنگام خروج از یک برنامه این وظیفه لینکر است تا سیگنالهای مربوط به توقف اجرای یک کتابخانه را به CPU ارسال کند.
علیرغم این روند که به صورت کاملا خودکار و توسط یک هدایتگر (لینکر) انجام میشود، میتوان مدیریت اجرای یک کتابخانه را به برنامه داد. از این رو برنامه میتواند مشخص کند کدام کتابخانه نیاز به بارگیری دارد. در این مرحله برنامه کتابخانه را به عنوان یک فایل اجرایی اجرا میکند تا بتواند از توابع داخل آن استفاده کند؛ در این مرحله ازAPI هایی که مرتبط با بارگیری و بارگذاری یک کتابخانه هستند استفاده خواهد شد.
از API های مهم میتوان به موارد زیر اشاره کرد:
dlopen Makes an object file accessible to a program dlsym Obtains the address of a symbol within a dlopened object file dlerror Returns a string error of the last error that occurred dlclose Closes an object file
|
سخن پایانی
کتابخانه یکی از مفاهیم و اجزای بسیار مهم در برنامه نویسی به حساب میآید و شناخت دقیق آن برای هر فرد فعال در حوزه برنامه نویسی ضرورت دارد. میتوان به صورت کلی گفت که کتابخانه در برنامه نویسی مجموعهای از کدهای از قبل نوشته شده است که برنامه نویسان برای بهینهسازی کدهای خود از آن ها استفاده میکنند. در این مقاله متوجه شدیم که کتابخانه ها در لینوکس چه مفهومی دارند و همچنین به چند دسته تقسیم و چه کابردی دارند.
” با تلاش نت همراه باشید “