Library — boshqa dasturlar tomonidan qayta foydalanish uchun yaratilgan funksiya, class, type va resurslar to‘plami. Library odatda mustaqil foydalanuvchi workflow’ini boshqarmaydi; application uning APIlarini chaqiradi.
Library source code, bytecode, static binary yoki dynamic binary shaklida tarqatilishi mumkin.
Asosiy vazifa
Library umumiy funksionallikni qayta yozmasdan ishlatishga yordam beradi.
Misollar:
- matematika;
- HTTP client;
- database driver;
- image processing;
- encryption;
- logging;
- parsing;
- GUI widget;
- machine learning.
Library foydalanuvchiga public API beradi, ichki implementationni yashiradi.
Static library
Static library link vaqtida executable ichiga qo‘shiladi.
Formatlar platformaga qarab farq qiladi.
Afzalliklari:
- deploymentda alohida library talab qilinmaydi;
- aniq code versiyasi;
- runtime symbol topish kamroq;
- optimization imkoniyati.
Kamchiliklari:
- executable hajmi;
- security patch uchun qayta link;
- bir xil code bir nechta processda takrorlanishi.
Dynamic library
Dynamic library runtime loader orqali ulanadi.
Afzalliklari:
- disk va RAMni bo‘lishish;
- alohida yangilash;
- plugin;
- kichik executable.
Kamchiliklari:
- ABI mosligi;
- library path;
- version conflict;
- loader xatosi;
- deployment murakkabligi.
Header va declaration
C/C++ ekotizimida header public function va type declarationlarini beradi.
Compiler header orqali chaqiriqni tekshiradi, linker esa binary symbolni topadi.
Header va binary versiyasi mos bo‘lmasa compile muvaffaqiyatli, runtime yoki link xato bo‘lishi mumkin.
API
Library API:
ni belgilaydi.
Yaxshi API common use-case’ni sodda, noto‘g‘ri ishlatishni qiyin qiladi.
ABI
Native dynamic library uchun ABI muhim.
Library update’da:
mos bo‘lishi kerak.
ABI buzilsa major library version o‘zgarishi mumkin.
Framework bilan farqi
Libraryda application libraryni chaqiradi.
Frameworkda asosiy control flowni framework boshqaradi va application callback yoki extension nuqtalarini beradi.
Bu Inversion of Control bilan bog‘liq.
Chegara qat’iy emas; ko‘p paketda ikkalasi ham bor.
Package bilan farqi
Library funksional code.
Package esa libraryni tarqatish va versionlash birligi.
Bitta package:
- bir nechta library;
- CLI;
- documentation;
- type definition
o‘z ichiga olishi mumkin.
Standard library
Dasturlash tili yoki runtime bilan birga keladigan asosiy library.
Unda:
- collection;
- string;
- I/O;
- network;
- date;
- concurrency;
- math
mavjud bo‘lishi mumkin.
Standard library versiyasi ko‘pincha runtime versiyasi bilan bog‘langan.
Third-party library
Tashqi ishlab chiquvchi yaratgan library dependency sifatida qo‘shiladi.
Tanlashda:
- maintenance;
- license;
- security;
- API stability;
- dependency soni;
- performance;
- platform support
kabi xususiyatlar muhim.
Header-only library
Ba’zi C++ library faqat headerda implementation beradi.
Template kod uchun bu odatiy.
Afzalligi — alohida linking talab qilinmaydi.
Kamchiligi — compile vaqti, binary code takrorlanishi va implementationning public bo‘lishi.
Shared state
Library global cache, thread pool yoki singleton saqlashi mumkin.
Bu:
muammolariga olib kelishi mumkin.
Lifecycle hujjatlashtiriladi.
Thread safety
Library API:
- thread-safe;
- reentrant;
- immutable;
- external synchronization talab qiladi
degan qoidaga ega.
Bir object thread-safe, lekin global konfiguratsiya thread-safe emasligi mumkin.
Memory ownership
Library buffer yoki object qaytarsa, kim bo‘shatishi aniq bo‘lishi kerak.
Native API:
- caller-allocated;
- library-allocated;
- reference counted;
- opaque handle
modelidan foydalanishi mumkin.
Allocator chegarasini buzish heap corruptionga sabab bo‘ladi.
Error handling
Library xatoni:
- exception;
- result type;
- error code;
- null;
- callback;
- future rejection
orqali qaytaradi.
Xato ichida sabab, context va retry mumkinligi bo‘lishi kerak.
Library processni oddiy recoverable xatoda o‘zi tugatmasligi ma’qul.
Configuration
Library global environmentdan yashirin config olish o‘rniga explicit option qabul qilishi mumkin.
Bu test va bir processda bir nechta instance uchun qulay.
Defaultlar hujjatlashtiriladi.
Versioning
Library public API o‘zgarganda compatibility boshqariladi.
O‘zgarishlar:
Semantik versiyalash keng qo‘llanadi, ammo compatibility contract alohida hujjat talab qiladi.
Deprecation
Eski API darhol o‘chirilmaydi.
Deprecation:
- warning;
- replacement;
- migration guide;
- olib tashlash versiyasi
bilan beriladi.
Juda uzoq compatibility ichki murakkablikni oshiradi.
Documentation
Library hujjati:
- installation;
- minimal example;
- API;
- error;
- thread safety;
- performance;
- lifecycle;
- compatibility;
- security
ni qamrab oladi.
Faqat function signature yetarli emas.
Testing
Library:
- unit;
- integration;
- API contract;
- platform matrix;
- ABI test;
- fuzz;
- performance benchmark
bilan tekshiriladi.
Consumer projectlar bilan compatibility test foydali.
Security
Library application processi huquqida ishlaydi.
Zaif dependency butun applicationga ta’sir qiladi.
Security boshqaruvi:
- dependency scanning;
- signature;
- SBOM;
- patch;
- minimal feature;
- untrusted input test;
- vulnerability disclosure.
Diagnostika
Library muammosida:
- aniq versiya;
- package source;
- dynamic loader;
- ABI;
- duplicate version;
- configuration;
- thread safety;
- native dependency;
- symbol;
- license va platforma
tekshiriladi.
Bir processda bir libraryning ikki nomos versiyasi yuklanishi noaniq xatolar keltirishi mumkin.
Initialization va shutdown
Library background thread, native handle yoki connection pool yaratsa, lifecycle API beradi. Initializationni bir necha marta chaqirish, forkdan keyingi holat va process shutdown tartibi hujjatlashtiriladi. Yopilmagan global resurs test va hot reloadda muammo tug‘diradi.
Bog‘liq tushunchalar
API, ABI, Static library, Dynamic library, Package, Framework, Dependency, Linker, Standard library, Versioning