Βιβλιοθήκη (επιστήμη υπολογιστών)
Από τη Βικιπαίδεια, την ελεύθερη εγκυκλοπαίδεια
Στην επιστήμη υπολογιστών καλούμε βιβλιοθήκη μια συλλογή από υποπρογράμματα που χρησιμοποιείται για την ανάπτυξη λογισμικού. Οι βιβλιοθήκες περιέχουν υποβοηθητικό κώδικα-δεδομένα παρέχοντας υπηρεσίες σε προγράμματα. Αυτό επιτρέπει τον διαμοιρασμό και τροποποίηση κώδικα και δεδομένων με αρθρωτό τρόπο. Μερικά εκτελέσιμα είναι προγράμματα και βιβλιοθήκες μαζί αλλά οι περισσότερες βιβλιοθήκες δεν είναι εκτελέσιμα.Τα εκτελέσιμα και οι βιβλιοθήκες κάνουν αναφορές το ένα στο άλλο γνωστές ως συνδέσεις μέσω μιας διαδικασίας που ονομάζεται σύνδεση και την πραγματοποιεί ο συνδέτης.
Τα σύγχρονα λειτουργικά σύστηματα παρέχουν βιβλιοθήκες που υλοποιούν την πλειονότητα των υπηρεσιών του συστήματος.Έτσι ο περισσότερος κώδικας που χρησιμοποιούν οι σύγχρονες εφαρμογές παρέχεται από αυτές τις βιβλιοθήκες
Πίνακας περιεχομένων |
[Επεξεργασία] Συνοπτικά
Οι βιβλιοθήκες μπορούν να ταξινομηθούν ανάλογα με το αν μπορούν να διαμοιραστούν , το πως συνδέονται και πότε με ένα πρόγραμμα.
[Επεξεργασία] Παραδοσιακές βιβλιοθήκες
Ιστορικά οι βιβλιοθήκες αποτελούνταν από ένα σύνολο ρουτινών που αντιγράφονταν από τον μεταγλωττιστή,συνδετή μέσα στο πρόγραμμα-στόχο δίνοντας μια εκτελέσιμη εφαρμογή. Οι δημιουργοί των μεταγλωττιστών παρείχαν στάνταρ βιβλιοθήκες (πχ η στάνταρ βιβλιοθήκη της C) αλλα οι προγραμματιστές μπορούσαν να δημιουργήσουν και τις δικές τους.
[Επεξεργασία] Δυναμική σύνδεση
Δυναμική σύνδεση σημαίνει ότι τα δεδομένα και ο κώδικας μιας βιβλιοθήκης δεν αντιγράφονται σε ένα νέο εκτελέσιμο αρχείο ή σε μια νέα βιβλιοθήκη στον χρόνο μεταγλώττισης, αλλά παραμένουν σε ένα ξεχωριστό αρχείο στον δίσκο. Η μόνη ελάχιστή εργασία που κάνει ο συνδέτης , σε χρόνο μεταγλώττισης ,είναι να καταγράφει τις βιβλιοθήκες ,και ποιές συναρτήσεις μέσα σε αυτές, χρειάζεται το εκτελέσιμο. Η κυρίως δουλειά της σύνδεσης γίνεται κατά την διάρκεια που η εφαρμογή φορτώνεται (χρόνος φόρτωσης) ή κατά την διάρκεια της εκτέλεσης της διεργασίας (χρόνος εκτέλεσης)). Ο φορτωτής , που είναι μέρος του λειτουργικού συστήματος , την κατάλληλη στιγμή θα εντοπίσει τις σχετικές βιβλιοθήκες στον δίσκο και προσθέτει τα σχετικά δεδομένα-κώδικα στον χώρο μνήμης της διεργασίας.
Η δυναμική σύνδεση αναπτύχθηκε αρχικά στο λειτουργικό σύστημα Multics ξεκινώντας από το 1964. Ήταν επίσης ένα από τα χαρακτηριστικά του MTS), που χτίστηκε τα τέλη της δεκατίας του 1960. ("A History of MTS", Information Technology Digest, Vol. 5, No. 5)
[Επεξεργασία] Επανατοποθέτηση
Μια τεχνική λεπτομέρεια που πρέπει να χειριστεί ο φορτωτής είναι ότι η θέση στη μνήμη των δεδομένων της βιβλιοθήκης που θα χρειαστεί το πρόγραμμα δεν μπορεί να είναι γνωστή παρά μετά τη φόρτωση του εκτελέσιμου και των δυναμικά συνδεμένων βιβλιοθηκών στη μνήμη.
Αυτό συμβαίνει γιατί οι διευθύνσεις μνήμης που χρησιμοποιούνται εξαρτώνται από το ποιές δυναμικές βιβλιοθήκες θα φορτωθούν. Δεν είναι δυνατό να αποθηκεύσουμε μια απόλυτη διεύθυνση δεδομένων βιβλιοθήκης μέσα στο εκτελέσιμο ούτε καν στη βιβλιοθήκη, αφού τότε θα προέκυπταν συγκρούσεις ανάμεσα σε διαφορετικές βιβλιοθήκες, πχ αν δύο βιβλιοθήκες καθόριζαν αλληλοκαλυπτόμενες διευθύνσεις για κάποια δεδομένα-κώδικά τους.
Θεωρητικά θα ήταν πιθανό να εξετάσουμε όλο το πρόγραμμα στον χρόνο φόρτωσης και να αντικαταστήσουμε όλες τις αναφορές σε δεδομένα βιβλιοθηκών με δείκτες στις ανάλογες θέσεις μνήμης αφού θα έχουν φορτωθεί οι βιβλιοθήκες στη μνήμη, αλλά αυτή η μέθοδος είναι μηαποδεχτή καθώς θα κατανάλωνε αρκετό χρόνο και μνήμη. Αντίθετα τα περισσότερα δυναμικά συστήματα σύνδεσης συνδέουν με το πρόγραμμα,κατά τον χρόνο μεταγλώττισης , έναν πίνακα συμβόλων με κενές διευθύνσεις. Όλες οι αναφορές σε κώδικα ή δεδομένα της βιβλιοθήκης 'περνάνε' διαμέσου αυτού του πίνακα που ονομάζεται κατάλογος εισαγωγών. Στο χρόνο φόρτωσης ο πίνακας αυτός τροποποιείται με τις θέσεις των κώδικα-δεδομένων της βιβλιοθήκης από των φορτωτή και συνδέτη. Αυτή η διαδικασία είναι αργή και επηρεάζει σημαντικά την ταχύτητα των προγραμμάτων.
Η βιβλιοθήκη η ίδια περιέχει έναν πίνακα-ευρετήριο όλων των μεθόδων που περιέχει .Οι καταχωρήσεις στον πίνακα αυτών λέγονται σημεία εισόδου.Κλήσεις σε συναρτήσεις-δεδομένα της βιβλιοθήκης 'περνάνε' πρώτα από αυτόν τον πίνακα αναζητώντας τη διεύθυνση του κώδικα στη μνήμη και κατόπιν τον καλλούνε. Αυτή η διαδικασία εισάγει καθυστέρηση στις κλήσεις μέσα σε μια δυναμική βιβλιοθήκη αλλά συνήθως η καθυστέρηση αυτή είναι αμελητέα.
[Επεξεργασία] Εντοπίζοντας βιβλιοθήκες σε τρέχων χρόνο
Οι δυναμικοί φορτωτές/συνδέτες διαφέρουν σε λειτουργικότητα. Μερικοί εξαρτώνται από συγκεκριμένα μονοπάτια βιβλιοθηκών και οποιαδήποτε μετακίνηση των βιβλιοθηκών η αλλαγή στα ονόματά τους θα προκαλέσει σφάλμα στο σύστημα. Ποιό σύνηθες είναι να περιλαμβάνεται μόνο το όνομα της βιβλιοθήκης (και όχι το μονοπάτι) στο εκτελέσιμο, και το λειτουργικό σύστημα να παρέχει ένα υποσύστημα για εύρεση βιβλιοθηκών στον σκληρό δίσκο.
[Επεξεργασία] Δυναμικό φόρτωμα
Το δυναμικό φόρτωμα είναι ένα υποσύνολο της δυναμικής σύνδεσης όπου μια δυναμικά συνδεδεμένη βιβλιοθήκη μπορεί κατόπιν αίτησης να φορτώνεται και να ξεφορτώνεται σε χρόνο εκτέλεσης.
[Επεξεργασία] Διαμοιραζόμενες βιβλιοθήκες
Εκτός από την διαφοροποίηση του κατά πόσο μια βιβλιοθήκη φορτώνεται στατικά ή δυναμικά , μια άλλη παράμετρος ταξινόμησης είναι κατά πόσο μπορούν να διαμοιραστούνε ανάμεσα στα προγράμματα. Οι δυναμικές βιβλιοθήκες σχεδόν πάντα προσφέρουν τη δυνατότητα διαμοιρασμού, επιτρέποντας πολλά προγράμματα να χρησιμοποιούνε την ίδια βιβλιοθήκη την ίδια στιγμή. Οι στατικές βιβλιοθήκες εξ'ορισμού δεν μπορούν να διαμοιραστούν αφού συνδέονται-ενσωματόνονται σε κάθε πρόγραμμα.
[Επεξεργασία] Βιβλιοθήκες αντικείμενα
Αν και η δυναμική σύνδεση αναπτύχθηκε αρχικά το 1960 , δεν ενσωματώθηκε σε λειτουργικά συστήματα του εμπορίου παρά στα τέλη της δεκαετίας 1980. Ήταν γενικά διαθέσιμη με την μια ή την άλλη μορφή στα περισσότερα λειτουργικά συστήματα στις αρχές της δεκαετίας 1990.
Κατά την περίοδο αυτή διαδόθηκε και ο αντικειμενοστρεφής προγραμματισμός δίνωντας ώθηση στην ανάπτυξη αντικειμενοστρεφών βιβλιοθηκών-αντικειμένων που θα μπορούσαν να χρησιμοποιηθούν παντού. Τέτοιες είναι πχ οι [Component Object Model]](COM/DCOM) της Microsoft, η CORBA και [[jar (φορμάτ αρχείου)] στη Java.
[Επεξεργασία] Ονομασία
- GNU/Linux, Solaris και BSD-παρόμοια:
libfoo.a
καιlibfoo.so
τα αρχεία τοποθετούνται σε καταλόγους όπως/lib
,/usr/lib
ή/usr/local/lib
.Τα ονόματα των αρχείων ξεκινάνε πάντα μεlib
, και τελειώνουν με.a
(αρχειοθήκες, στατικές βιβλιοθήκες) ή.so
(διαμοιραζομένα αρχεία αντικείμενα, δυναμικά συνδεδεμένες βιβλιοθήκες), με έναν προαιρετικό αριθμό έκδοσης. Για παράδειγμα ηlibfoo.so.2
είναι η δεύτερη κύρια αναθεώρηση της δυναμικής βιβλιοθήκηςlibfoo
. Παλιές εκδόσεις του Unix χρησιμοποιούσαν πρωτεύων και δευτερεύων αριθμό έκδοσης πχ (libfoo.so.1.2
) ενώ οι σύγχρονες εκδόσεις μόνο τον πρωτεύων πχ (libfoo.so.1
). Δυναμικά φορτωμένες βιβλιοθήκες τοποθετούνται στο/usr/libexec
και παρόμοιους καταλόγους. Η κατάληξη.la
που συναντάται σε αρχεία μερικές φορές είναι αρχειοθήκες libtool , σε κατάσταση μη χρήσιμη άμμεσα. - Mac OS X και άνω: Το σύστημα κληρονομεί για τις στατικές βιβλιοθήκες τις συμβάσεις από το BSD, και μπορεί να χρησιμοποιεί και βιβλιοθήκες του στυλ
.so
(όμως με την κατάληξη.dylib
). - Microsoft Windows: αρχεία με κατάληξη
*.LIB
είναι στατικές βιβλιοθήκες και αρχεία με κατάληξη*.DLL
είναι δυναμικά συνδεμένες βιβλιοθήκες. Οι εκδόσεις είναι κωδικοποιημένες μέσα στα αρχεία.
[Επεξεργασία] Δείτε επίσης
- Επαναχρησιμοποίηση κώδικα
- Δυναμική βιβλιοθήκη
- Συνδέτης
- Φορτωτής (υπολογιστές)
- Microsoft Dynamic Link Library
- Αρχείο αντικείμενο
- Plugin
- Prebinding
- Στατική βιβλιοθήκη