Εξηγήθηκε ακριβώς η Συλλογή Χρόνου

Η συλλογή Just-in-Time είναι μια μέθοδος για τη βελτίωση της απόδοσης των ερμηνευμένων προγραμμάτων. Κατά την εκτέλεση, το πρόγραμμα μπορεί να μεταγλωττιστεί σε εγγενή κώδικα για να βελτιώσει την απόδοσή του. Είναι επίσης γνωστό ως δυναμική συλλογή.

Η δυναμική συλλογή έχει κάποια πλεονεκτήματα έναντι της στατικής συλλογής. Κατά την εκτέλεση εφαρμογών Java ή C #, το περιβάλλον χρόνου εκτέλεσης μπορεί να σχεδιάσει την εφαρμογή κατά την εκτέλεση. Αυτό επιτρέπει τη δημιουργία πιο βελτιστοποιημένου κώδικα. Εάν η συμπεριφορά της εφαρμογής αλλάξει ενώ εκτελείται, το περιβάλλον χρόνου εκτέλεσης μπορεί να μεταγλωττίσει ξανά τον κώδικα.

Μερικά από τα μειονεκτήματα περιλαμβάνουν καθυστερήσεις στην εκκίνηση και τα γενικά έξοδα συλλογής κατά τη διάρκεια του χρόνου εκτέλεσης. Για τον περιορισμό των γενικών εξόδων, πολλοί μεταγλωττιστές JIT καταρτίζουν μόνο τις διαδρομές κώδικα που χρησιμοποιούνται συχνά.

ΣΦΑΙΡΙΚΗ ΕΙΚΟΝΑ

Παραδοσιακά, υπάρχουν δύο μέθοδοι για τη μετατροπή του πηγαίου κώδικα σε μια μορφή που μπορεί να εκτελεστεί σε μια πλατφόρμα. Η στατική συλλογή μετατρέπει τον κώδικα σε γλώσσα για μια συγκεκριμένη πλατφόρμα. Ένας διερμηνέας εκτελεί απευθείας τον πηγαίο κώδικα.

Η συλλογή JIT επιχειρεί να χρησιμοποιήσει τα οφέλη και των δύο. Κατά την εκτέλεση του διερμηνευμένου προγράμματος, ο μεταγλωττιστής JIT καθορίζει τον πιο συχνά χρησιμοποιούμενο κώδικα και τον μεταγλωττίζει στον κώδικα του μηχανήματος. Ανάλογα με τον μεταγλωττιστή, αυτό μπορεί να γίνει με μια μέθοδο ή σε μικρότερη ενότητα κώδικα.

Η δυναμική συλλογή περιγράφηκε για πρώτη φορά σε ένα έγγραφο από τον J. McCarthy για το LISP το 1960.

Το Just In Time Compilation, το JIT ή το Dynamic Translation, είναι η συλλογή που γίνεται κατά την εκτέλεση ενός προγράμματος. Σημασία, κατά το χρόνο εκτέλεσης, σε αντίθεση με πριν από την εκτέλεση. Αυτό που συμβαίνει είναι η μετάφραση στον κωδικό του μηχανήματος. Τα πλεονεκτήματα ενός JIT οφείλονται στο γεγονός ότι, δεδομένου ότι η συλλογή πραγματοποιείται σε χρόνο εκτέλεσης, ένας μεταγλωττιστής JIT έχει πρόσβαση σε δυναμικές πληροφορίες χρόνου εκτέλεσης που του επιτρέπουν να κάνει καλύτερες βελτιστοποιήσεις (όπως ενσωματωμένες λειτουργίες).

Αυτό που είναι σημαντικό να κατανοήσουμε σχετικά με τη συλλογή JIT, είναι ότι θα μεταγλωττίσει τον bytecode σε οδηγίες κώδικα μηχανής του τρέχοντος μηχανήματος. Δηλαδή, ο προκύπτων κωδικός μηχανήματος έχει βελτιστοποιηθεί για την αρχιτεκτονική CPU του τρέχοντος μηχανήματος.

Μερικά παραδείγματα των JIT Compilers είναι το JVM (Java Virtual Machine) στην Java και το CLR (Common Language Runtime), στο C #.

Ιστορία

Στην αρχή, ένας μεταγλωττιστής ήταν υπεύθυνος για τη μετατροπή μιας γλώσσας υψηλού επιπέδου (που ορίζεται ως υψηλότερου επιπέδου από τον συναρμολογητή) σε κώδικα αντικειμένου (οδηγίες μηχανήματος), ο οποίος στη συνέχεια θα συνδεόταν (από έναν σύνδεσμο) σε εκτελέσιμο.

Σε ένα σημείο της εξέλιξης των γλωσσών, οι μεταγλωττιστές θα συνθέσουν μια γλώσσα υψηλού επιπέδου σε ψευδοκώδικα, ο οποίος θα ερμηνευόταν τότε (από διερμηνέα) για να εκτελεστεί το πρόγραμμά σας. Αυτό εξάλειψε τον κώδικα αντικειμένου και τα εκτελέσιμα και επέτρεψε σε αυτές τις γλώσσες να είναι φορητές σε πολλαπλά λειτουργικά συστήματα και πλατφόρμες υλικού. Ο Pascal (που μεταγλωττίστηκε σε P-Code) ήταν ένας από τους πρώτους. Τα Java και C # είναι πιο πρόσφατα παραδείγματα. Τελικά ο όρος P-Code αντικαταστάθηκε από bytecode, καθώς οι περισσότερες ψευδο-λειτουργίες έχουν μήκος byte.

Ένας μεταγλωττιστής Just-In-Time (JIT) είναι ένα χαρακτηριστικό του διερμηνέα χρόνου εκτέλεσης, ότι αντί να ερμηνεύει bytecode κάθε φορά που γίνεται επίκληση μιας μεθόδου, θα μεταγλωττιστεί ο bytecode στις οδηγίες κώδικα του μηχανήματος που εκτελείται και στη συνέχεια θα επικαλεστεί αυτό αντ 'αυτού ο κωδικός αντικειμένου. Στην ιδανική περίπτωση, η αποτελεσματικότητα της εκτέλεσης κώδικα αντικειμένου θα ξεπεράσει την αναποτελεσματικότητα της μεταγλώττισης του προγράμματος κάθε φορά που εκτελείται.

Τυπικό σενάριο

Ο πηγαίος κώδικας μετατρέπεται πλήρως σε κώδικα μηχανήματος

Σενάριο JIT

Ο πηγαίος κώδικας θα μετατραπεί σε γλώσσα συναρμολόγησης όπως δομή [για ex IL (ενδιάμεση γλώσσα) για C #, ByteCode για java].

Ο ενδιάμεσος κώδικας μετατρέπεται σε γλώσσα μηχανής μόνο όταν η εφαρμογή χρειάζεται τους κωδικούς που μετατρέπονται μόνο σε κώδικα μηχανήματος.

Σύγκριση JIT έναντι Non-JIT

Στο JIT δεν μετατρέπεται όλος ο κώδικας σε κώδικα μηχανής πρώτα ένα μέρος του κώδικα που είναι απαραίτητο θα μετατραπεί σε κώδικα μηχανήματος και στη συνέχεια εάν μια μέθοδος ή λειτουργικότητα που ονομάζεται δεν υπάρχει στο μηχάνημα τότε αυτό θα μετατραπεί σε κώδικα μηχανήματος, γεγονός που μειώνει την επιβάρυνση η CPU. Καθώς ο κωδικός μηχανήματος θα δημιουργηθεί κατά το χρόνο εκτέλεσης, ο μεταγλωττιστής JIT θα παράγει κώδικα μηχανής που είναι βελτιστοποιημένος για την εκτέλεση της αρχιτεκτονικής της CPU του μηχανήματος.

Μερικά παραδείγματα του JIT είναι:

  • Java: JVM (Java Virtual Machine)
  • C #: CLR (Διάρκεια κοινής γλώσσας)
  • Android: DVM (Dalvik Virtual Machine) ή ART (Android RunTime) σε νεότερες εκδόσεις

Η Java Virtual Machine (JVM) εκτελεί bytecode και διατηρεί μια μέτρηση για το πόση ώρα εκτελείται μια λειτουργία. Εάν αυτός ο αριθμός υπερβαίνει ένα προκαθορισμένο όριο, το JIT μεταγλωττίζει τον κώδικα σε γλώσσα μηχανής που μπορεί να εκτελεστεί απευθείας από τον επεξεργαστή (σε αντίθεση με την κανονική περίπτωση στην οποία το javac μεταγλωττίζει τον κώδικα σε bytecode και στη συνέχεια Java, ο διερμηνέας ερμηνεύει αυτόν τον bytecode γραμμή προς γραμμή τον μετατρέπει σε κωδικός μηχανήματος και εκτελεί).

Επίσης την επόμενη φορά που υπολογίζεται αυτή η συνάρτηση, ο ίδιος μεταγλωττισμένος κώδικας εκτελείται και πάλι σε αντίθεση με την κανονική ερμηνεία στην οποία ο κώδικας ερμηνεύεται ξανά ανά γραμμή. Αυτό κάνει την εκτέλεση γρηγορότερη.