Βιβλιοθήκη (υπολογιστές)

Στην πληροφορική καλούμε βιβλιοθήκη (library) μια συλλογή από έτοιμα υποπρογράμματα που χρησιμοποιείται για την ανάπτυξη λογισμικού. Οι βιβλιοθήκες περιέχουν υποβοηθητικό κώδικα και δεδομένα, παρέχοντας, με αυτόν τον τρόπο, υπηρεσίες σε προγράμματα. Αυτό επιτρέπει τον διαμοιρασμό και τη χρήση του κώδικα και των δεδομένων με αρθρωτό τρόπο. Η έννοια της βιβλιοθήκης είναι αναπόσπαστο τμήμα του δομημένου προγραμματισμού και αναπτύχθηκε παράλληλα με αυτόν.

Κάποια εκτελέσιμα αρχεία (executables) είναι προγράμματα και βιβλιοθήκες ταυτόχρονα, αλλά οι περισσότερες βιβλιοθήκες δεν είναι εκτελέσιμες. Τα εκτελέσιμα αρχεία και οι βιβλιοθήκες αναφέρονται το ένα στον κώδικα και τα δεδομένα του άλλου μέσω μιας διαδικασίας που ονομάζεται σύνδεση και την πραγματοποιεί ο συνδέτης. Τα σύγχρονα λειτουργικά συστήματα παρέχουν βιβλιοθήκες που υλοποιούν την πλειονότητα των υπηρεσιών του συστήματος. Έτσι, ο περισσότερος κώδικας που χρησιμοποιούν οι σύγχρονες εφαρμογές παρέχεται από αυτές τις βιβλιοθήκες και δεν χρειάζεται να γραφεί από την αρχή για κάθε νέο πρόγραμμα.

Λειτουργία

Ένα αρχείο πηγαίου κώδικα υψηλού επιπέδου γραμμένο σε κάποια γλώσσα προγραμματισμού, μεταγλωττίζεται σε ένα αντίστοιχο αρχείο συμβολικού κώδικα (assembly) από τον κατάλληλο μεταγλωττιστή (compiler). Το προκύπτον αρχείο στη συνέχεια μετασχηματίζεται σε αντικειμενικό αρχείο γλώσσας μηχανής από έναν συμβολομεταφραστή (assembler), μία διαδικασία που μετατρέπει τον κώδικα σε αρχείο άμεσα εκτελέσιμο από τον επεξεργαστή. Η συμβολική γλώσσα και η γλώσσα μηχανής είναι ίδιου επιπέδου και υπάρχει αμφιμονοσήμαντη αντιστοιχία μεταξύ τους, αλλά η συμβολική αποτελείται από χαρακτήρες του λατινικού αλφαβήτου και δεκαεξαδικά ψηφία, ώστε να είναι κάπως κατανοητή από τον άνθρωπο, ενώ η γλώσσα μηχανής συντίθεται αποκλειστικά από bit.

Έτσι, τελικά, σε κάθε αρχείο πηγαίου κώδικα, είτε αυτό είναι αυτόνομο (με «σημείο εισόδου εκτέλεσης», π.χ. στη γλώσσα C η συνάρτηση main() από την οποία εκκινεί η εκτέλεση ενός προγράμματος) είτε όχι (π.χ. αρχείο βιβλιοθήκης), αντιστοιχίζεται ένα αντικειμενικό αρχείο με κώδικα μηχανής (αρχεία με επέκταση «.o» στο Unix και «.obj» στα Windows). Ένα αντικειμενικό αρχείο περιέχει εκτελέσιμο κώδικα, δηλώσεις δεδομένων, έναν πίνακα συμβόλων, όπου ορίζονται τα αναγνωριστικά (ονόματα μεταβλητών, σταθερών ή διαδικασιών) που εξάγονται από το αρχείο -δηλώνονται δηλαδή σε αυτό- ή εισάγονται στο αρχείο -χρησιμοποιούνται δηλαδή χωρίς να δηλώνονται-, και λοιπές πληροφορίες για τον «συνδέτη» (linker). Ο τελευταίος συνήθως καλείται αυτομάτως αμέσως μετά τον συμβολομεταφραστή, δέχεται ως είσοδο ένα ή περισσότερα αντικειμενικά αρχεία, τα συνενώνει κατάλληλα και παράγει ένα μοναδικό, τελικό εκτελέσιμο αρχείο. Αυτή η συνένωση που επιτελεί όμως ο συνδέτης δεν αφορά μόνο πολλαπλά αντικειμενικά αρχεία (που προκύπτουν προφανώς από αντίστοιχα πολλαπλά πηγαία αρχεία) της ίδιας εφαρμογής, αλλά επεκτείνεται και στο να «επιλύει αναφορές εισαγόμενων συμβόλων»: σαρώνει δηλαδή τον πίνακα συμβόλων κάθε αντικειμενικού αρχείου εισόδου, ανακαλύπτει ποια αναγνωριστικά παρέχονται από κάποια βιβλιοθήκη, αναζητά τον αντικειμενικό κώδικα της βιβλιοθήκης και εισάγει στο τελικό εκτελέσιμο της εφαρμογής τα κατάλληλα τμήματά του.

Προκειμένου να επιτύχει τους στόχους του ο συνδέτης, ανάμεσα στ' άλλα, προβαίνει σε ένα πρώτο βήμα επανατοποθέτησης. Αυτό σημαίνει ότι κάθε τμήμα κώδικα μηχανής που εισάγει και τακτοποιεί στο τελικό εκτελέσιμο αρχείο, είτε είναι από αντικειμενικό αρχείο που έδωσε ως είσοδο στον συνδέτη ο χρήστης είτε από αντικειμενικό αρχείο βιβλιοθήκης, το τροποποιεί κατάλληλα ώστε τελικά όλες οι διευθύνσεις μνήμης εντολών και δεδομένων στο τελικό εκτελέσιμο να είναι συνεπείς μεταξύ τους, να μην επικαλύπτονται και να είναι σχετικές ως προς μία κοινή διεύθυνση βάσης. Αυτό το βήμα είναι απαραίτητο γιατί ο μεταγλωττιστής νωρίτερα είχε δράσει θεωρώντας ξεχωριστό χώρο διευθύνσεων για κάθε αντικειμενικό αρχείο με διαφορετικές διευθύνσεις βάσης. Συνήθως, για διευκόλυνση του προγραμματιστή, ο μεταγλωττιστής, ο συμβολομεταφραστής και ο συνδέτης καλούνται με μία μόνο εντολή και με τη σωστή σειρά· αν ωστόσο ο προγραμματιστής το επιθυμεί, μπορεί περνώντας κάποια κατάλληλη παράμετρο να τροποποιήσει αυτήν τη συμπεριφορά (π.χ. στον μεταγλωττιστή της C gcc με την παράμετρο «-c» παραλείπεται η σύνδεση). Τα αντικειμενικά αρχεία υπακούν σε διάφορα προτυποποιημένα μορφότυπα (format), τα οποία καθορίζουν τη δομή τους και, συνήθως, είναι ίδια και για τα τελικά εκτελέσιμα αρχεία. Επιπλέον, τα μορφότυπα αυτά είναι ίδια τόσο για τα αυτόνομα εκτελέσιμα αρχεία όσο και για τις βιβλιοθήκες. Σύνηθες μορφότυπο εκτελέσιμου αρχείου στα Windows είναι το PE, ενώ στο Unix το ELF.

Όταν επίκειται το «τρέξιμο» (εκτέλεση) ενός εκτελέσιμου αρχείου, εκτελείται πρώτα ένα κατάλληλο πρόγραμμα του λειτουργικού συστήματος (ΛΣ): ο φορτωτής (loader). Ο τελευταίος αντιγράφει τα περιεχόμενα του εκτελέσιμου από τον δίσκο στη μνήμη, δίνει κατάλληλες τιμές σε εσωτερικές δομές του πυρήνα (αφού ουσιαστικά εκκινείται μία νέα διεργασία) και ειδοποιεί σχετικά το υποσύστημα εικονικής μνήμης, ενώ, αν το τελευταίο δεν είναι διαθέσιμο, κάτι σπάνιο σήμερα αφού όλα τα μοντέρνα ΛΣ χρησιμοποιούν εικονική μνήμη, τροποποιεί επιπλέον τον κώδικα του προγράμματος με ένα δεύτερο βήμα επανατοποθέτησης: η διεύθυνση βάσης, ως προς την οποία γίνονται όλες οι αναφορές μνήμης εντός του κώδικα, παίρνει την τιμή της θέσης μνήμης στην οποία πραγματικά φορτώθηκε η πρώτη εντολή του προγράμματος. Αυτή η θέση μνήμης δεν είναι γνωστή πριν από τη φόρτωση (εκτός αν το ΛΣ δεν είναι πολυδιεργασιακό, όπως το MS-DOS, κάτι πολύ σπάνιο σήμερα), οπότε αυτή η επανατοποθέτηση όλου του εκτελέσιμου πρέπει να γίνεται σε κάθε εκτέλεση. Αν όμως το ΛΣ παρέχει μηχανισμό εικονικής μνήμης, τότε αυτό το βήμα δεν είναι απαραίτητο αφού κάθε διεργασία έχει έναν πλήρη, ιδιωτικό χώρο εικονικών διευθύνσεων στη διάθεσή της, με το υποσύστημα εικονικής μνήμης του πυρήνα να αναλαμβάνει την αντιστοίχιση με τη φυσική μνήμη (αχρηστεύοντας έτσι την επανατοποθέτηση χρόνου φόρτωσης). Σε κάθε περίπτωση, μόλις ο φορτωτής ολοκληρώσει την εργασία του τερματίζεται και η νέα διεργασία είναι έτοιμη προς εκτέλεση. Το πότε θα αρχίσει πραγματικά να εκτελείται είναι θέμα του χρονοπρογραμματιστή του πυρήνα.

άλλες γλώσσες
العربية: مكتبة برمجية
eesti: Teek
Bahasa Indonesia: Pustaka perangkat lunak
日本語: ライブラリ
norsk nynorsk: Programvarebibliotek
தமிழ்: நிரலகம்
中文: 函式庫