Biblioteka programistyczna – plik dostarczający podprogramy, dane oraz typy danych, które mogą zostać wykorzystane z poziomu kodu źródłowegoprogramu. Użycie bibliotek to sposób na ponowne wykorzystanie tego samego kodu.
Dobór odpowiedniej biblioteki programistycznej może ułatwić zaimplementowanie niemalże dowolnego zadania. Pisanie programów jedynie za pomocą czystych elementów języka programowania jest czasochłonne, a czasami nawet niemożliwe.
Kategoryzacja
Ze względu na czas dołączania biblioteki do programu wyróżniamy biblioteki statyczne dołączane w czasie konsolidacji oraz biblioteki dynamiczne dołączane w czasie uruchamiania programu.
Biblioteki statyczne
Biblioteki statyczne (ang.static library) łączone są z programem w momencie konsolidacji (linkowania). W przypadku narzędzi dostarczonych przez Microsoft dla systemów z rodziny Windows pliki bibliotek mają zazwyczaj rozszerzenia .lib lub .obj, natomiast dla pakietów w systemach z rodziny Unix (np. GCC) i ich portach dla systemu Microsoftu (jakim jest np. MinGW) są to .a lub .o[potrzebny przypis].
Biblioteki dynamiczne
Biblioteki dynamiczne łączone są z programem wykonywalnym dopiero w momencie jego wykonania. Dane z bibliotek dynamicznych mogą być współdzielone przez różne programy jednocześnie. Biblioteki są ładowane do pamięci tylko raz, nawet jeśli są równocześnie współużytkowane[1].
Dla standaryzacji pracy z biblioteką programistyczną definiuje się dla niej z reguły interfejs programistyczny aplikacji (ang.application programming interface, API). Dzięki temu użytkownik biblioteki może się skupić na tym co biblioteka oferuje niż na tym jak jest to realizowane na różnych platformach.
API projektuje się jako standard komunikacji aplikacji z funkcjami biblioteki. Twórcy interfejsów programistycznych (np. Microsoft[2]) kładą z zasady nacisk, by były proste w użyciu, jednoznaczne i dobrze udokumentowane. W cyklu życiowym biblioteki programistycznej interfejs jest elementem najbardziej trwałym, a konsekwencje każdej zmiany muszą być dokładnie przeanalizowane. Poszczególne biblioteki mogą mieć wiele implementacji, ale trzymać się standardowej struktury interfejsu (np. definicja „biblioteki standardowej języka C”, która jest właśnie definicją interfejsu API, a nie jedną konkretną biblioteką).
Dzięki dobrze zdefiniowanemu API możliwa ma być podmiana jednej biblioteki na inną bez potrzeby modyfikowania aplikacji. Przykładem tu może być biblioteka libjpeg, której API zostało wykorzystane w implementacji dużo szybszej biblioteki libjpeg-turbo. W efekcie biblioteka libjpeg-turbo zastąpiła bibliotekę libjpeg w wielu projektach które używają formatu JPG m.in. w przeglądarkach i programach graficznych jak również stała się domyślą biblioteką obsługi formatu JPG w nowych dystrybucjach systemu Linux i innych uniksopodobnych[3].
Bindingi
Biblioteki są bardzo często realizowane z użyciem jednego, źródłowego języka programowania. Interfejsy (API) do innych języków są tworzone za pomocą tzw. bindingów – czyli realizacji danej biblioteki programowania w innym języku. Główny kod bibliotek programistycznych jest realizowany w języku programowania najbardziej efektywnym obliczeniowo. Reszta języków definiuje jedynie warstwę interfejsu (API), specyficzną dla danego języka, obejmującą mechanizmy, które pozwalają skorzystać z możliwości biblioteki z poziomu innego języka programowania. Popularnym językiem, w którym pisana jest główna część bibliotek, jest język C, ze względu na szybkość działania oraz łatwość pisania wrapperów z C do innych języków.
Dostępne biblioteki mogą być napisane z użyciem stylu programowania lub paradygmatu programowania, który nie przystaje do tych obowiązujących w danym środowisku lub systemie operacyjnym. Żeby nie wymuszać na programistach nienaturalnego stylu programowania, a zarazem pozwolić na użycie możliwości biblioteki programistycznej, tworzy się biblioteki o zbliżonej funkcjonalności lecz o interfejsie przepisanym według prawideł i zasad docelowego środowiska. Wykorzystuje się w tym celu tzw. wrappery – fragmenty kodu, które odbierają wywołanie w języku danego programu, przetwarzają je na wywołanie języka biblioteki, wysyłają wywołanie do biblioteki i przetwarzają zwrócone wyniki na postać odpowiednią dla danego języka.