Βιβλιοθήκη (υπολογιστές): Διαφορά μεταξύ των αναθεωρήσεων

Περιεχόμενο που διαγράφηκε Περιεχόμενο που προστέθηκε
JohnMad (συζήτηση | συνεισφορές)
Χωρίς σύνοψη επεξεργασίας
JohnMad (συζήτηση | συνεισφορές)
Χωρίς σύνοψη επεξεργασίας
Γραμμή 1:
Στην [[επιστήμη υπολογιστών]] καλούμε '''βιβλιοθήκη''' μια συλλογή από έτοιμα [[Διαδικασία (υπολογιστές)|υποπρογράμματα]] που χρησιμοποιείται για την ανάπτυξη λογισμικού. Οι βιβλιοθήκες περιέχουν υποβοηθητικό κώδικα και δεδομένα παρέχοντας υπηρεσίες σε προγράμματα. Αυτό επιτρέπει
Στην [[επιστήμη υπολογιστών]] καλούμε '''βιβλιοθήκη''' μια
το διαμοιρασμό και τη χρήση κώδικα και δεδομένων με [[άρθρωμα (υπολογιστές)|αρθρωτό]] τρόπο. Η έννοια της βιβλιοθήκης είναι αναπόσπαστο τμήμα του [[δομημένος προγραμματισμός|δομημένου προγραμματισμού]] και αναπτύχθηκε παράλληλα με αυτόν.
συλλογή από [[υποπρόγραμμα|υποπρογράμματα]]
που χρησιμοποιείται για την ανάπτυξη λογισμικού.
Οι βιβλιοθήκες περιέχουν υποβοηθητικό κώδικα-δεδομένα
παρέχοντας υπηρεσίες σε προγράμματα. Αυτό επιτρέπει
τον διαμοιρασμό και τροποποίηση κώδικα και δεδομένων με [[άρθρωμα (υπολογιστές)|αρθρωτό]] τρόπο.
Μερικά [[εκτελέσιμο (υπολογιστές)|εκτελέσιμα]] είναι προγράμματα και βιβλιοθήκες μαζί αλλά οι περισσότερες
βιβλιοθήκες δεν είναι εκτελέσιμα.Τα εκτελέσιμα και οι βιβλιοθήκες
κάνουν αναφορές το ένα στο άλλο γνωστές ως ''συνδέσεις'' μέσω μιας διαδικασίας που ονομάζεται ''σύνδεση'' και την πραγματοποιεί ο [[συνδέτης]].
 
Μερικά [[εκτελέσιμο (υπολογιστές)|εκτελέσιμα]] είναι προγράμματα και βιβλιοθήκες ταυτόχρονα αλλά οι περισσότερες βιβλιοθήκες δεν είναι εκτελέσιμα. Τα εκτελέσιμα και οι βιβλιοθήκες αναφέρονται το ένα στον κώδικα και τα δεδομένα του άλλου μέσω μιας διαδικασίας που ονομάζεται ''σύνδεση'' και την πραγματοποιεί ο [[συνδέτης]]. Τα σύγχρονα [[λειτουργικό σύστημα|λειτουργικά συστήματα]] παρέχουν βιβλιοθήκες που υλοποιούν την πλειονότητα των υπηρεσιών του συστήματος. Έτσι ο περισσότερος κώδικας που χρησιμοποιούν οι σύγχρονες εφαρμογές παρέχεται από αυτές τις βιβλιοθήκες και δε χρειάζεται να γραφεί από την αρχή για κάθε νέο πρόγραμμα.
Τα σύγχρονα [[λειτουργικό σύστημα|λειτουργικά σύστηματα]]
παρέχουν βιβλιοθήκες που υλοποιούν την πλειονότητα των
υπηρεσιών του συστήματος.Έτσι ο περισσότερος κώδικας
που χρησιμοποιούν οι σύγχρονες εφαρμογές παρέχεται από αυτές τις
βιβλιοθήκες
 
 
== Λειτουργία ==
==Συνοπτικά==
Ένα αρχείο πηγαίου κώδικα υψηλού επιπέδου γραμμένο σε κάποια γλώσσα μεταγλωτίζεται σε ένα αντίστοιχο αρχείο συμβολικού κώδικα ([[assembly]]) από τον κατάλληλο μεταγλωττιστή. Το προκύπτον αρχείο στη συνέχεια μετασχηματίζεται σε [[αντικειμενικό αρχείο]] [[γλώσσα μηχανής|γλώσσας μηχανής]] από έναν συμβολομεταφραστή ([[assembler]]), μία διαδικασία που μετατρέπει τον κώδικα σε άμεσα εκτελέσιμο από τον επεξεργαστή. Η συμβολική γλώσσα και η γλώσσα μηχανής είναι ίδιου επιπέδου και υπάρχει αμφιμονοσήμαντη αντιστοιχία μεταξύ τους, απλώς η assembly αποτελείται από χαρακτήρες του λατινικού αλφαβήτου και δεκαεξαδικά ψηφία, ώστε να είναι κάπως κατανοητή από τον άνθρωπο, ενώ η γλώσσα μηχανής συντίθεται αποκλειστικά από [[bit]].
Οι βιβλιοθήκες μπορούν να ταξινομηθούν ανάλογα με το αν μπορούν
να διαμοιραστούν , το πως συνδέονται και πότε με ένα πρόγραμμα.
 
Έτσι τελικά σε κάθε αρχείο πηγαίου κώδικα, είτε αυτό είναι αυτόνομο (με σημείο εισόδου εκτέλεσης, π.χ. συνάρτηση main()) είτε όχι (π.χ. αρχείο βιβλιοθήκης), αντιστοιχίζεται ένα αντικειμενικό αρχείο με κώδικα μηχανής (αρχεία *.o στο [[Unix]] και *.obj στα [[Windows]]). Ένα αντικειμενικό αρχείο περιέχει εκτελέσιμο κώδικα, δηλώσεις δεδομένων, έναν πίνακα συμβόλων, όπου ορίζονται τα αναγνωριστικά (ονόματα μεταβλητών, σταθερών ή συναρτήσεων) που εξάγονται από το αρχείο -δηλώνονται δηλαδή σε αυτό- ή εισάγονται στο αρχείο -χρησιμοποιούνται δηλαδή χωρίς να δηλώνονται-, και λοιπές πληροφορίες για το συνδέτη. Ο συνδέτης (linker) συνήθως καλείται αυτόματα αμέσως μετά τον assembler, δέχεται ως είσοδο ένα ή περισσότερα αντικειμενικά αρχεία, τα συνενώνει κατάλληλα και παράγει ένα μοναδικό, τελικό εκτελέσιμο αρχείο. Αυτή η συνένωση που επιτελεί όμως ο συνδέτης δεν αφορά μόνο πολλαπλά αντικειμενικά αρχεία (που προκύπτουν προφανώς από αντίστοιχα πολλαπλά πηγαία αρχεία) της ίδιας εφαρμογής, αλλά επεκτείνεται και στο να "επιλύει αναφορές εισαγόμενων συμβόλων": σαρώνει δηλαδή τον πίνακα συμβόλων κάθε αντικειμενικού αρχείου εισόδου, ανακαλύπτει ποια αναγνωριστικά παρέχονται από κάποια βιβλιοθήκη, αναζητά τον αντικειμενικό κώδικα της βιβλιοθήκης και εισάγει στο τελικό εκτελέσιμο της εφαρμογής τα κατάλληλα τμήματα του. Προκειμένου να επιτύχει τους στόχους του ο συνδέτης, ανάμεσα στ' άλλα, προβαίνει σε ένα πρώτο βήμα "επανατοποθέτησης". Αυτό σημαίνει ότι κάθε τμήμα κώδικα μηχανής που εισάγει και τακτοποιεί στο τελικό εκτελέσιμο αρχείο, είτε είναι από αντικειμενικό αρχείο που έδωσε ως είσοδο στο συνδέτη ο χρήστης είτε από αντικειμενικό αρχείο βιβλιοθήκης, το τροποποιεί κατάλληλα ώστε τελικά όλες οι διευθύνσεις μνήμης εντολών και δεδομένων στο τελικό εκτελέσιμο να είναι συνεπείς μεταξύ τους, να μην επικαλύπτονται και να είναι σχετικές ως προς μία κοινή διεύθυνση βάσης. Αυτό το βήμα είναι απαραίτητο γιατί ο μεταγλωττιστής νωρίτερα είχε δράσει θεωρώντας ξεχωριστό [[χώρος διευθύνσεων|χώρο διευθύνσεων]] για κάθε αντικειμενικό αρχείο με διαφορετικές διευθύνσεις βάσης. Συνήθως, για διευκόλυνση του προγραμματιστή, ο μεταγλωττιστής, ο assembler και ο συνδέτης καλούνται με μία μόνο εντολή και με τη σωστή σειρά -ενώ αν ο προγραμματιστής το επιθυμεί μπορεί περνώντας κάποια κατάλληλη παράμετρο να τροποποιήσει αυτήν τη συμπεριφορά (π.χ. στον μεταγλωττιστή της [[C (γλώσσα προγραμματισμού)|C]] [[gcc]] με την παράμετρο -c παραλείπεται η σύνδεση). Τα αντικειμενικά αρχεία υπακούν σε διάφορα προτυποποιημένα [[φορμά]] τα οποία καθορίζουν τη δομή τους και συνήθως είναι ίδια και για τα τελικά εκτελέσιμα αρχεία. Επιπλέον τα φορμά αυτά είναι ίδια τόσο για τα αυτόνομα εκτελέσιμα όσο και για τις βιβλιοθήκες. Σύνηθες φορμά στα MS Windows είναι το PE ενώ στο Unix το ELF.
 
Όταν επίκειται το τρέξιμο ενός εκτελέσιμου αρχείου εκτελείται πρώτα ένα κατάλληλο πρόγραμμα του ΛΣ: ο [[φορτωτής]]. Ο τελευταίος αντιγράφει τα περιεχόμενα του εκτελέσιμου από το δίσκο στη μνήμη, δίνει κατάλληλες τιμές σε εσωτερικές δομές του πυρήνα (αφού ουσιαστικά εκκινείται μία νέα διεργασία) και ειδοποιεί σχετικά το υποσύστημα εικονικής μνήμης, ενώ αν το τελευταίο δεν είναι διαθέσιμο, κάτι σπάνιο σήμερα αφού όλα τα μοντέρνα ΛΣ χρησιμοποιούν [[εικονική μνήμη]], τροποποιεί επιπλέον τον κώδικα του προγράμματος με ένα δεύτερο βήμα επανατοποθέτησης που είναι απαραίτητο κάθε φορά που το πρόγραμμα εκτελείται: η διεύθυνση βάσης, ως προς την οποία γίνονται όλες οι αναφορές μνήμης εντός του κώδικα, παίρνει την τιμή της θέσης μνήμης στην οποία πραγματικά φορτώθηκε η πρώτη εντολή του προγράμματος. Αυτή η θέση μνήμης δεν είναι γνωστή πριν από τη φόρτωση (εκτός αν το ΛΣ δεν είναι [[πολυδιεργασία|πολυδιεργασιακό]], όπως το MS-DOS, κάτι σπάνιο σήμερα) οπότε αυτή η επανατοποθέτηση όλου του εκτελέσιμου πρέπει να γίνεται σε κάθε εκτέλεση. Αν όμως το ΛΣ παρέχει υποσύστημα εικονικής μνήμης τότε αυτό το βήμα δεν είναι απαραίτητο, αφού κάθε διεργασία έχει έναν πλήρη, ιδιωτικό χώρο εικονικών διευθύνσεων στη διάθεση της, με το μηχανισμό εικονικής μνήμης του [[πυρήνας (υπολογιστές)|πυρήνα]] να αναλαμβάνει την αντιστοίχιση με τη φυσική μνήμη (αχρηστεύοντας έτσι την επανατοποθέτηση [[χρόνος φόρτωσης|χρόνου φόρτωσης]]). Εν πάσει περιπτώσει, μόλις ο φορτωτής ολοκληρώσει την εργασία του τερματίζεται και η νέα διεργασία είναι έτοιμη προς εκτέλεση. Το πότε θα αρχίσει πραγματικά να εκτελείται είναι θέμα του [[χρονοπρογραμματιστής|χρονοπρογραμματιστή]] του πυρήνα.
== Παραδοσιακές βιβλιοθήκες ==
Ιστορικά οι βιβλιοθήκες αποτελούνταν από ένα σύνολο ρουτινών
που αντιγράφονταν από τον μεταγλωττιστή / συνδέτη μέσα στο πρόγραμμα-στόχο δίνοντας μια εκτελέσιμη εφαρμογή. Οι δημιουργοί των μεταγλωττιστών παρείχαν πρότυπες βιβλιοθήκες (πχ η πρότυπη βιβλιοθήκη της C) αλλά οι προγραμματιστές μπορούσαν να δημιουργήσουν και τις δικές τους.
 
== Κατηγορίες ==
== Δυναμική σύνδεση ==
Οι βιβλιοθήκες μπορεί να είναι στατικές ή δυναμικές, καθώς και κοινόχρηστες ή μη. Όταν ένα πρόγραμμα καλεί ρουτίνες από στατικές βιβλιοθήκες, ο συνδέτης (ο οποίος συμβουλεύεται κατάλληλα αρχεία ρυθμίσεων ή το ΛΣ για να βρει τις βιβλιοθήκες) ενσωματώνει πραγματικά τον αντικειμενικό τους κώδικα στο εκτελέσιμο που παράγει και επανατοποθετεί κατάλληλα τις διευθύνσεις μνήμης σε [[χρόνος σύνδεσης|χρόνο σύνδεσης]]. Αντίθετα οι δυναμικές βιβλιοθήκες ενσωματώνονται και επανατοποθετούνται στον τελικό κώδικα απευθείας στη μνήμη ενώ το πρόγραμμα εκτελείται, με αποτέλεσμα τα εκτελέσιμα αρχεία να έχουν σαφώς μικρότερο μέγεθος (αφού περιέχουν απλώς οδηγίες προς έναν συνδέτη [[χρόνος εκτέλεσης|χρόνου εκτέλεσης]], που παρέχεται από το ΛΣ, αντί για τον ίδιο τον αντικειμενικό κώδικα των καλούμενων ρουτινών βιβλιοθήκης) αλλά να απαιτείται η μόνιμη παρουσία του αντικειμενικού αρχείου της βιβλιοθήκης στο σύστημα αρχείων προκειμένου να είναι δυνατή η εκτέλεση του προγράμματος. Επίσης οι βιβλιοθήκες -συνήθως οι δυναμικές- μπορεί να είναι κοινόχρηστες, δηλαδή να υπάρχει μόνο ένα αντίγραφο τους το οποίο διαμοιράζεται σε πολλές διεργασίες που τις χρησιμοποιούν ταυτόχρονα. Η κοινοχρησία μπορεί να είναι είτε μόνο στο δίσκο (να υπάρχει δηλαδή ένα μόνο αντικειμενικό αρχείο της βιβλιοθήκης), όπως συμβαίνει με τα αρχεία *.dll στα Windows, είτε και στη μνήμη (να φορτώνεται μόνο μία φορά η βιβλιοθήκη στη RAM και όσα προγράμματα τη χρησιμοποιούν να απεικονίζουν το τμήμα μνήμης που καταλαμβάνει στο χώρο διευθύνσεων τους), όπως συμβαίνει με τα αρχεία *.so στο Unix. Επειδή το φορμά αρχείου των βιβλιοθηκών είναι ίδιο με των αυτόνομων εκτελέσιμων και αντικειμενικών αρχείων, ακόμα κι ένα εκτελέσιμο μπορεί να χρησιμοποιηθεί ως κοινόχρηστη βιβλιοθήκη αρκεί να περιέχει έναν πίνακα συμβόλων για χρήση από το συνδέτη χρόνου εκτέλεσης, με πληροφορίες για τις συναρτήσεις και τις δομές δεδομένων που εξάγει.
'''Δυναμική σύνδεση''' σημαίνει ότι τα δεδομένα και ο κώδικας μιας
βιβλιοθήκης δεν αντιγράφονται σε ένα νέο εκτελέσιμο αρχείο
ή σε μια νέα βιβλιοθήκη στον [[χρόνος μεταγλώττισης|χρόνο μεταγλώττισης]], αλλά παραμένουν σε ένα ξεχωριστό αρχείο στο δίσκο.
Η μόνη ελάχιστη εργασία που κάνει ο [[συνδέτης]] , σε χρόνο
μεταγλώττισης ,είναι
να καταγράφει τις βιβλιοθήκες ,και ποιές συναρτήσεις μέσα σε αυτές, χρειάζεται το εκτελέσιμο. Η κυρίως δουλειά της σύνδεσης γίνεται
κατά την διάρκεια που η εφαρμογή φορτώνεται ([[χρόνος φόρτωσης]])
ή κατά την διάρκεια της εκτέλεσης της διεργασίας ([[χρόνος εκτέλεσης]])). Ο [[φορτωτής]] , που είναι μέρος του λειτουργικού
συστήματος , την κατάλληλη στιγμή θα εντοπίσει τις σχετικές
βιβλιοθήκες στον δίσκο και προσθέτει τα σχετικά δεδομένα-κώδικα
στον χώρο μνήμης της διεργασίας.
 
Η εξάπλωση του [[αντικειμενοστρεφής προγραμματισμός|αντικειμενοστρεφούς προγραμματισμού]] στις αρχές της δεκαετίας του '90 έκανε επιτακτική την ανάγκη προτυποποίησης ενός φορμά αντικειμενικών αρχείων βιβλιοθηκών που δε θα περιείχαν μεμονωμένες δομές δεδομένων και συναρτήσεις αλλά κλάσεις. Η κληρονομικότητα όμως, έμφυτο και ισχυρό χαρακτηριστικό της αντικειμενοστρέφειας, δυσχαίρενε αυτήν την προσπάθεια αφού για να οριστεί μία μέθοδος (η αντικειμενοστρεφής εκδοχή της συνάρτησης) δεν επαρκεί το πλήρες αναγνωριστικό της και το σημείο εισόδου του κώδικα της, αλλά χρειάζεται και μια λίστα των κλάσεων από τις οποίες κληρονομεί. Παράλληλα την ίδια στιγμή είχαν γίνει δημοφιλή τα [[κατανεμημένη επεξεργασία|κατανεμημένα συστήματα]] λογισμικού, τα οποία επέτρεπαν σε ένα πρόγραμμα να εκτελεί διαφανώς κλήσεις σε απομακρυσμένες συναρτήσεις ο κώδικας των οποίων ήταν τοποθετημένος σε κάποιον άλλον κόμβο ενός δικτύου. Οι ενδιαφερόμενες εταιρίες λοιπόν, περί τα μέσα της δεκαετίας του '90, δημιούργησαν διάφορα φορμά αντικειμενικών αρχείων βιβλιοθηκών κλάσεων, οι μέθοδοι των οποίων μπορούσαν να εκτελεστούν σε διαφορετικά ΛΣ και να προσπελαστούν από διάφορες γλώσσες προγραμματισμού. Συνήθως διατίθονταν σε δύο εκδόσεις: μία απλή και μία κατανεμημένη που υποστήριζε απομακρυσμένη πρόσβαση και κλήση. Το μόνο που επιβίωσε από αυτά τα πρότυπα είναι το COM της [[Microsoft]] (με το DCOM να είναι η κατανεμημένη εκδοχή του). Εξαίρεση αποτέλεσε ο προγραμματιστικός κόσμος της [[Java]] ο οποίος ακολούθησε τον δικό του δρόμο, αφού τα προγράμματα και οι βιβλιοθήκες της Java δε μεταγλωττίζονται σε εγγενή κώδικα μηχανής αλλά σε έναν ενδιάμεσο, κοινό για όλες τις [[αρχιτεκτονική υπολογιστών|αρχιτεκτονικές υπολογιστών]], [[bytecode]] ο οποίος για να τρέξει [[διερμηνευτής|διερμηνεύεται]] σε χρόνο εκτέλεσης από μία Εικονική Μηχανή Java, ένα περιβάλλον εκτέλεσης που τοποθετείται πάνω από το ΛΣ. Στην Java κάθε κλάση μεταγλωττίζεται σε ένα αρχείο *.class με bytecode, αντίστοιχο του αντικειμενικού αρχείου, ενώ ένα αυτόνομο πρόγραμμα είναι απλά μία κλάση που περιέχει μία μέθοδο με όνομα main() ως σημείο εισόδου. Ο συνδέτης και ο φορτωτής είναι τμήματα της Εικονικής Μηχανής Java και καλούνται αυτόματα και δυναμικά όταν επίκειται εκτέλεση ενός αρχείου *.class. Μία συλλογή αρχείων *.class που δεν περιέχουν μεθόδους main(), ουσιαστικά δηλαδή μία βιβλιοθήκη κλάσεων, μπορεί να συνενωθεί σε ένα συμπιεσμένο αρχείο *.jar, το οποίο δεν είναι παρά ένα ανεξάρτητο αρχιτεκτονικής φορμά αρχείων μεταγλωττισμένων (σε bytecode) βιβλιοθηκών κλάσεων.
 
Η δυναμική σύνδεση αναπτύχθηκε αρχικά στο λειτουργικό σύστημα [[Multics]] ξεκινώντας από το 1964.
Ήταν επίσης ένα από τα χαρακτηριστικά του [[Michigan Terminal System|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 λειτουργικό σύστημα|Solaris]] και κλώνοι του [[BSD]]-παρόμοια: <code>libfoo.a</code> και <code>libfoo.so</code> τα αρχεία τοποθετούνται σε καταλόγους όπως <code>/lib</code>, <code>/usr/lib</code> ή <code>/usr/local/lib</code>.Τα ονόματα των αρχείων ξεκινάνε πάντα με <code>lib</code>, και τελειώνουν με <code>.a</code> (αρχειοθήκες, στατικές βιβλιοθήκες) ή <code>.so</code> (διαμοιραζομέναδιαμοιραζόμενα αρχεία αντικείμενα, δυναμικά συνδεδεμένες βιβλιοθήκες), με έναν προαιρετικό αριθμό έκδοσης. Για παράδειγμα η <code>libfoo.so.2</code> είναι η δεύτερη κύρια αναθεώρηση της δυναμικής βιβλιοθήκης <code>libfoo</code>. Παλιές εκδόσεις του [[Unix]] χρησιμοποιούσαν πρωτεύων και δευτερεύων αριθμό έκδοσης πχ (<code>libfoo.so.1.2</code>) ενώ οι σύγχρονες εκδόσεις μόνο τον πρωτεύωνπρωτεύοντα, πχπ.χ. (<code>libfoo.so.1</code>). Δυναμικά ''φορτωμένες''Δυναμικές βιβλιοθήκες τοποθετούνται στο <code>/usr/libexec</code> και παρόμοιους καταλόγους. Η κατάληξη <code>.la</code> που συναντάται σε αρχεία μερικές φορές είναι αρχειοθήκες [[libtool]] , σε κατάσταση μη χρήσιμηάμεσα άμμεσαχρησιμοποιήσιμη κατάσταση.
*[[Mac OS X]] και άνω: Το σύστημα κληρονομεί για τις στατικές βιβλιοθήκες τις συμβάσεις από το [[BSD]], και μπορεί να χρησιμοποιεί και βιβλιοθήκες του στυλτύπου <code>.so</code> (όμως με την κατάληξη <code>.dylib</code>).
*[[Microsoft Windows]]: αρχεία με κατάληξη <code>*.LIB</code> είναι στατικές βιβλιοθήκες και αρχεία με κατάληξη <code>*.DLL</code> είναι δυναμικά συνδεμένεςδυναμικές βιβλιοθήκες. Οι εκδόσεις είναι κωδικοποιημένες μέσα στα αρχεία.
 
== Δείτε επίσης==
* [[Επαναχρησιμοποίηση κώδικα]]
* [[Δυναμική βιβλιοθήκη]]
* [[Συνδέτης]]
* [[Φορτωτής (υπολογιστές)]]
Γραμμή 136 ⟶ 30 :
* [[Αρχείο αντικείμενο]]
* [[Plugin]]
* [[Prebinding]]
* [[Στατική βιβλιοθήκη]]
 
== Εξωτερικοι σύνδεσμοι ==