Εικονικές Μηχανές, Διερμηνείς και Δυναμική Διαχείριση Μνήμης

Σχετικά έγγραφα
Εικονικές Μηχανές, ιερµηνείς και υναµική ιαχείριση Μνήµης

Εικονικές Μηχανές, Διερμηνείς

Αρχιτεκτονική Υπολογιστών

ΚΥΠΡΙΑΚΗ ΕΤΑΙΡΕΙΑ ΠΛΗΡΟΦΟΡΙΚΗΣ CYPRUS COMPUTER SOCIETY ΠΑΓΚΥΠΡΙΟΣ ΜΑΘΗΤΙΚΟΣ ΔΙΑΓΩΝΙΣΜΟΣ ΠΛΗΡΟΦΟΡΙΚΗΣ 19/5/2007

Αρχιτεκτονική Υπολογιστών

Εισαγωγή στην Πληροφορική

derivation of the Laplacian from rectangular to spherical coordinates

ΓΡΑΜΜΙΚΟΣ & ΔΙΚΤΥΑΚΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

Multi Cycle Datapath. Αρχιτεκτονική Υπολογιστών. 5ο εξάμηνο ΣΗΜΜΥ ακ. έτος: Νεκ. Κοζύρης

05β Η ιδεατή μηχανή της Java

Αντικειμενοστρεφής Προγραμματισμός

Αρχιτεκτονική Υπολογιστών

Instruction Execution Times

Εργαστήριο Ανάπτυξης Εφαρμογών Βάσεων Δεδομένων. Εξάμηνο 7 ο

ΚΥΠΡΙΑΚΗ ΕΤΑΙΡΕΙΑ ΠΛΗΡΟΦΟΡΙΚΗΣ CYPRUS COMPUTER SOCIETY ΠΑΓΚΥΠΡΙΟΣ ΜΑΘΗΤΙΚΟΣ ΔΙΑΓΩΝΙΣΜΟΣ ΠΛΗΡΟΦΟΡΙΚΗΣ 6/5/2006

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ. Ψηφιακή Οικονομία. Διάλεξη 7η: Consumer Behavior Mαρίνα Μπιτσάκη Τμήμα Επιστήμης Υπολογιστών

Αρχές Γλωσσών Προγραμματισμού και Μεταφραστών

EPL 603 TOPICS IN SOFTWARE ENGINEERING. Lab 5: Component Adaptation Environment (COPE)

Μηχανική Μάθηση Hypothesis Testing

HOMEWORK 4 = G. In order to plot the stress versus the stretch we define a normalized stretch:

Λειτουργικά Συστήματα. Εισαγωγή

Αρχιτεκτονική Υπολογιστών

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 8 & 9 18/10/07

Οντοκεντρικός Προγραμματισμός

ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΪΚΑ ΜΑΘΗΜΑΤΑ

2 Composition. Invertible Mappings

Business English. Ενότητα # 9: Financial Planning. Ευαγγελία Κουτσογιάννη Τμήμα Διοίκησης Επιχειρήσεων

Μεταγλωττιστές Ενότητα 1: Εισαγωγή

Γλώσσες Προγραμματισμού Μεταγλωττιστές

Assalamu `alaikum wr. wb.

Single Cycle Datapath. Αρχιτεκτονική Υπολογιστών. 5ο εξάμηνο ΣΗΜΜΥ ακ. έτος: Νεκ. Κοζύρης

Phys460.nb Solution for the t-dependent Schrodinger s equation How did we find the solution? (not required)

Υπολογιστικά Συστήματα

ΜΥΥ- 402 Αρχιτεκτονική Υπολογιστών Φροντιστήριο: MIPS assembly

ΕΠΙΧΕΙΡΗΣΙΑΚΗ ΑΛΛΗΛΟΓΡΑΦΙΑ ΚΑΙ ΕΠΙΚΟΙΝΩΝΙΑ ΣΤΗΝ ΑΓΓΛΙΚΗ ΓΛΩΣΣΑ

Δομημένος Προγραμματισμός

ΤΕΧΝΙΚΕΣ ΑΥΞΗΣΗΣ ΤΗΣ ΑΠΟΔΟΣΗΣ ΤΩΝ ΥΠΟΛΟΓΙΣΤΩΝ I

Πώς μπορεί κανείς να έχει έναν διερμηνέα κατά την επίσκεψή του στον Οικογενειακό του Γιατρό στο Ίσλινγκτον Getting an interpreter when you visit your

Πανεπιστήμιο Δυτικής Μακεδονίας. Τμήμα Μηχανικών Πληροφορικής & Τηλεπικοινωνιών. Ηλεκτρονική Υγεία

The Simply Typed Lambda Calculus

LANGUAGE OF THE MACHINE. TEI Κρήτης, Τμ. ΕΠΠ, Αρχιτεκτονική Υπολογιστών. Οργάνωση Υπολογιστή. Τυπική οργάνωση υπολογιστή

Homework 3 Solutions

Πρόβλημα 1: Αναζήτηση Ελάχιστης/Μέγιστης Τιμής

ω ω ω ω ω ω+2 ω ω+2 + ω ω ω ω+2 + ω ω+1 ω ω+2 2 ω ω ω ω ω ω ω ω+1 ω ω2 ω ω2 + ω ω ω2 + ω ω ω ω2 + ω ω+1 ω ω2 + ω ω+1 + ω ω ω ω2 + ω

ΕΠΙΧΕΙΡΗΣΙΑΚΗ ΑΛΛΗΛΟΓΡΑΦΙΑ ΚΑΙ ΕΠΙΚΟΙΝΩΝΙΑ ΣΤΗΝ ΑΓΓΛΙΚΗ ΓΛΩΣΣΑ

Ανάπτυξη Μεγάλων Εφαρµογών στη Γλώσσα C (2)

MIPS functions and procedures

(C) 2010 Pearson Education, Inc. All rights reserved.

Τέτοιες λειτουργίες γίνονται διαμέσου του

Αρχιτεκτονική υπολογιστών

Φροντιστήριο. Παραγωγή τελικού κώδικα. Παραγωγή τελικού κώδικα

Ηλεκτρονικοί Υπολογιστές IV

Σχεδίαση Εφαρμογών και Υπηρεσιών Διαδικτύου 7 η Διάλεξη: Σύντομη εισαγωγή στην Java

{ int a = 5; { int b = 7; a = b + 3;

ΟΡΟΛΟΓΙΑ -ΞΕΝΗ ΓΛΩΣΣΑ

Chapter 2. Εντολές : Η γλώσσα του υπολογιστή. (συνέχεια) Η διασύνδεση Υλικού και λογισμικού David A. Patterson και John L.

ΑΓΓΛΙΚΑ IV. Ενότητα 6: Analysis of Greece: Your Strategic Partner in Southeast Europe. Ιφιγένεια Μαχίλη Τμήμα Οικονομικών Επιστημών

ΜΑΘΗΜΑ: ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ(Visual Basic)

Οργάνωση Υπολογιστών ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ. Ασκήσεις 7: Πρόγραμμα Συνδεδεμένης Λίστας και Διαδικασιών. Μανόλης Γ.Η.

Σχεδίαση Γλωσσών Προγραμματισμού. Εαρινό Εξάμηνο Lec03 18/02/2019

ΕΠΙΧΕΙΡΗΣΙΑΚΗ ΑΛΛΗΛΟΓΡΑΦΙΑ ΚΑΙ ΕΠΙΚΟΙΝΩΝΙΑ ΣΤΗΝ ΑΓΓΛΙΚΗ ΓΛΩΣΣΑ

The challenges of non-stable predicates

Modbus basic setup notes for IO-Link AL1xxx Master Block

ΠΛΗΡΟΦΟΡΙΚΗ ΙI Ενότητα 1: Εισαγωγικές έννοιες

6.1. Dirac Equation. Hamiltonian. Dirac Eq.

ΕΙΣΑΓΩΓΗ ΣΤΟN ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΠΑΤΡΩΝ ΠΟΛΥΤΕΧΝΙΚΗ ΣΧΟΛΗ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ Η/Υ ΚΑΙ ΠΛΗΡΟΦΟΡΙΚΗΣ

Εισαγωγή στη γλώσσα προγραμματισμού JAVA. Δομές Δεδομένων Διδάσκων: Π.Α. Μήτκας Τομέας Ηλεκτρονικής και Υπολογιστών

Προχωρηµένα Θέµατα Αρχιτεκτονικής

Advanced Subsidiary Unit 1: Understanding and Written Response

Block Ciphers Modes. Ramki Thurimella

Τεχνολογία Ψυχαγωγικού Λογισμικού και Εικονικοί Κόσμοι Ενότητα 8η - Εικονικοί Κόσμοι και Πολιτιστικό Περιεχόμενο

Writing kernels for fun and profit

Dynamic types, Lambda calculus machines Section and Practice Problems Apr 21 22, 2016

03 Η ιδεατή μηχανή της Java

Είναι μια αλληλουχία κατάλληλων οδηγιών(εντολών) που εκτελεί ο υπολογιστής για την επίλυση ενός προβλήματος.

ΠΛΕ- 074 Αρχιτεκτονική Υπολογιστών 2

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ. ΕΠΛ342: Βάσεις Δεδομένων. Χειμερινό Εξάμηνο Φροντιστήριο 10 ΛΥΣΕΙΣ. Επερωτήσεις SQL

Δομημένος Προγραμματισμός

Δομημένος Προγραμματισμός

Section 8.3 Trigonometric Equations

Μικροηλεκτρονική - VLSI

Μηχανοτρονική. Τμήμα Μηχανικών Παραγωγής και Διοίκησης 7 ο Εξάμηνο,

European Human Rights Law

1. Ξεκινώντας. 1.1 Τι είναι η Java. PDF created with FinePrint pdffactory Pro trial version

Other Test Constructions: Likelihood Ratio & Bayes Tests

Υπολογιστές Ι. Άδειες Χρήσης. Εισαγωγή. Διδάσκοντες: Αν. Καθ. Δ. Παπαγεωργίου, Αν. Καθ. Ε. Λοιδωρίκης

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα. Ξενόγλωσση Τεχνική Ορολογία

Συστήματα Διαχείρισης Βάσεων Δεδομένων

Math 6 SL Probability Distributions Practice Test Mark Scheme

Μνήμη Διευθύνσεις Δείκτες. Προγραμματισμός II 1

Overview. Transition Semantics. Configurations and the transition relation. Executions and computation

DESIGN OF MACHINERY SOLUTION MANUAL h in h 4 0.

ΚΥΠΡΙΑΚΗ ΕΤΑΙΡΕΙΑ ΠΛΗΡΟΦΟΡΙΚΗΣ CYPRUS COMPUTER SOCIETY ΠΑΓΚΥΠΡΙΟΣ ΜΑΘΗΤΙΚΟΣ ΔΙΑΓΩΝΙΣΜΟΣ ΠΛΗΡΟΦΟΡΙΚΗΣ 11/3/2006

Ordinal Arithmetic: Addition, Multiplication, Exponentiation and Limit

Οντοκεντρικός Προγραμματισμός

3.4 SUM AND DIFFERENCE FORMULAS. NOTE: cos(α+β) cos α + cos β cos(α-β) cos α -cos β

MIPS Interactive Learning Environment. MILE Simulator. Version 1.0. User's Manual

Κεφάλαιο 7 : Είδη, Τεχνικές, και Περιβάλλοντα Προγραµµατισµού

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ - ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΕΠΛ 133: ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΕΡΓΑΣΤΗΡΙΟ 3 Javadoc Tutorial

Εθνικό Μετσόβιο Πολυτεχνείο Σχολή Ηλεκτρολόγων Μηχανικών - Μηχανικών Υπολογιστών. Αρχιτεκτονική Υπολογιστών Νεκτάριος Κοζύρης. Multicycle datapath

Transcript:

Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών Τομέας Τεχνολογίας Πληροφορικής και Υπολογιστών Εθνικό Μετσόβιο Πολυτεχνείο Γλώσσες Προγραμματισμού ΙΙ Διδάσκοντες: Νικόλαος Παπασπύρου, Κωστής Σαγώνας Εικονικές Μηχανές, Διερμηνείς και Δυναμική Διαχείριση Μνήμης Franz Marc, Rehe im Walde (II), 1913-14, The Yorck Project: 10.000 Meisterwerke der Malerei. DVD-ROM, 2002. ISBN 3936122202. Distributed by DIRECTMEDIA Publishing GmbH., Public domain

Άδεια Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative Commons. Για εκπαιδευτικό υλικό, όπως εικόνες, που υπόκειται σε άδεια χρήσης άλλου τύπου, αυτή πρέπει να αναφέρεται ρητώς.

Περιεχόµενα Εικονικές µηχανές (Virtual Machines) ιερµηνείς (Interpreters) υναµική διαχείριση µνήµης Στοίβες (Stacks) Σωροί (Heaps) Συλλογή σκουπιδιών (Garbage Collection) Μαρκάρισµα και σκούπισµα (mark and sweep) Αντιγραφή (copying) Μέτρηµα αναφορών (reference counting) Εικονικές µηχανές, διερµηνείς και διαχείριση µνήµης 2

Εικονικές Μηχανές (Virtual Machines) Οι εικονικές µηχανές (VMs) αποτελούν ένα ενδιάµεσο στάδιο στη µεταγλώττιση των γλωσσών προγραµµατισµού Οι VMs είναι µηχανές διότι επιτρέπουν τη βήµα προς βήµα εκτέλεση των προγραµµάτων Οι VMs είναι εικονικές (ή αφηρηµένες) διότι συνήθως δεν υλοποιούνται στο υλικό κάποιου υπολογιστή παραλείπουν πολλές από τις λεπτοµέρειες των πραγµατικών υπολογιστικών µηχανών (αυτών που υλοποιούνται σε hardware) Οι VMs συνήθως έχουν συστατικά στοιχεία που υλοποιούν λειτουργίες που είναι αναγκαίες για την υλοποίηση συγκεκριµένων (κλάσεων) γλωσσών προγραµµατισµού Εικονικές µηχανές, διερµηνείς και διαχείριση µνήµης 3

Εικονικές Μηχανές: Πλεονεκτήµατα Γεφυρώνουν το χάσµα του υψηλού επιπέδου των γλωσσών προγραµµατισµού και του χαµηλού επιπέδου των πραγµατικών υπολογιστών µηχανών Απαιτούν λιγότερη προσπάθεια για την υλοποίησή τους και για τη µεταγλώττιση των προγραµµάτων Ο πειραµατισµός και η µετατροπή τους είναι ευκολότερη από ότι η µετατροπή ενός µεταγλωττιστή για τη γλώσσα Σηµαντικές ιδιότητες, ειδικά για πρωτοεµφανιζόµενες γλώσσες Εικονικές µηχανές, διερµηνείς και διαχείριση µνήµης 4

Εικονικές Μηχανές: Πλεονεκτήµατα Προσφέρουν αυξηµένη φορητότητα (portability) Οι διερµηνείς VM συνήθως υλοποιούνται σε C Ο VM κώδικας µπορεί να µεταφερθεί µέσω διαδικτύου και να τρέξει στις περισσότερες υπολογιστικές πλατφόρµες Συνήθως, ο VM κώδικας για ένα πρόγραµµα είναι (σηµαντικά) µικρότερος σε µέγεθος από τον αντίστοιχο κώδικα µηχανής Αρκετές ιδιότητες ασφάλειας του VM κώδικα µπορούν να επαληθευθούν (verified) µηχανικά Είναι ευκολότερο να αποδείξουµε τυπικά την ορθότητα του σχεδιασµού και της υλοποίησής των VMs Η µέτρηση της επίδοσης (profiling) και η αποσφαλµάτωση (debugging) προγραµµάτων είναι ευκολότερες Εικονικές µηχανές, διερµηνείς και διαχείριση µνήµης 5

Εικονικές Μηχανές: Μειοκτήµατα Χειρότερη επίδοση (σε χρόνο) των διερµηνέων εικονικών µηχανών σε σχέση µε την εκτέλεση εντολών σε γλώσσα µηχανής λόγω του Eπιπλέον κόστους διερµηνίας (overhead of interpretation) Ότι είναι σηµαντικά πιο δύσκολο να επωφεληθούµε από κάποια χαρακτηριστικά του µοντέρνου hardware των υπολογιστών (π.χ. του hardware-based branch prediction) Εικονικές µηχανές, διερµηνείς και διαχείριση µνήµης 6

Ιστορία των Εικονικών Μηχανών Οι πρώτες VMs εµφανίστηκαν στα τέλη της δεκαετίας του 1950 Οι πρώτες υλοποιήσεις της Lisp (1958) χρησιµοποίησαν VMs µε αυτόµατη ανακύκλωση µνήµης (garbage collection), sandboxing, reflection, και διαδραστικό φλοιό (interactive shell) Στις αρχές της δεκαετίας του 1970, η γλώσσα Forth χρησιµοποίησε µια µικρή και σχετικά εύκολα υλοποιήσιµη VM Η γλώσσα Smalltalk (τέλη του 1970) ήταν από τις πρώτες γλώσσες της οποίας η υλοποίηση επέτρεπε την αλλαγή του κώδικα κατά τη διάρκεια εκτέλεσης του προγράµµατος (πρώτο πραγµατικά διαδραστική υλοποίηση αντικειµενοστρεφούς γλώσσας προγραµµατισµού) Η υλοποίηση της γλώσσας Self µέσω VM (τέλη του 1980), µιας γλώσσας µε πολλά κοινά στοιχεία µε τη Smalltalk, κατάφερε να είναι τέτοια ώστε η επίδοσή της να µη διαφέρει πολύ από αυτήν που αντίστοιχοι µεταγλωττιστές της γλώσσας επιτύγχαναν Η Java (µέσα του 1990) έκανε τις VMs ευρέως χρησιµοποιούµενες και γνωστές Εικονικές µηχανές, διερµηνείς και διαχείριση µνήµης 7

Επιλογές σχεδιασµού των Εικονικών Μηχανών Κάποιες επιλογές σχεδιασµού των VMs είναι παρόµοιες µε επιλογές που κάνουµε κατά το σχεδιασµό της µορφής του ενδιάµεσου κώδικα ενός µεταγλωττιστή. Για παράδειγµα Θέλουµε η µηχανή να χρησιµοιποιείται σε πολλές διαφορετικές αρχιτεκτονικές και λειτουργικά συστήµατα; (όπως π.χ. η JVM) Θέλουµε η µηχανή να χρησιµοιποιείται σε πολλές διαφορετικές γλώσσες πηγαίου κώδικα; (όπως π.χ. το CLI/CLR (.NET)) Κάποιες άλλες είναι παρόµοιες µε αυτές του backend ενός compiler: Είναι καλύτερη επίδοση πιο σηµαντική από µεγαλύτερη φορητότητα; Είναι η αξιοπιστία πιο σηµαντική από την επίδοση; Είναι το (µικρότερο) µέγεθος του κώδικα πιο σηµαντικός παράγοντας από την επίδοση σε ταχύτητα της µηχανής; Κάποιες άλλες παρόµοιες µε αυτές των λειτουργικών συστηµάτων: Πως υλοποιείται η διαχείριση µνήµης, ο ταυτοχρονισµός, οι εξαιρέσεις, Είναι η µικρή κατανάλωση µνήµης, το scalability, ή η ασφάλεια πιο σηµαντικά χαρακτηριστικά από την επίδοση; Εικονικές µηχανές, διερµηνείς και διαχείριση µνήµης 8

Συστατικά των Εικονικών Μηχανών Εξαρτώνται από πολλούς παράγοντες: Είναι η γλώσσα (το περιβάλλον της γλώσσας) διαδραστική; Η γλώσσα υποστηρίζει ενδοσκόπηση (reflection) και/ή δυναµικό φόρτωµα κώδικα (dynamic loading); Είναι η επίδοση το παν; Χρειάζεται η γλώσσα να υποστηρίζει ταυτοχρονισµό; Είναι απαραίτητο το sandboxing; Εικονικές µηχανές, διερµηνείς και διαχείριση µνήµης 9

Υλοποίηση των Εικονικών Μηχανών Οι εικονικές µηχανές συνήθως γράφονται σε φορητές γλώσσες προγραµµατισµού όπως η C ή η C++ Για µέρη που είναι σηµαντικά για την επίδοση της εικονικής µηχανής, συνήθως χρησιµοποιούµε assembly Εικονικές µηχανές για κάποιες γλώσσες (π.χ. Lisp, Forth, Smalltalk) γράφονται µε χρήση της ίδιας τη γλώσσας Πολλοί διερµηνείς για VMs γράφονται σε GNU C, για λόγους που θα γίνουν προφανείς στις επόµενες διαφάνειες Εικονικές µηχανές, διερµηνείς και διαχείριση µνήµης 10

Μορφές ιερµηνέων Αρκετές υλοποιήσεις γλωσσών προγραµµατισµού χρησιµοποιούν διερµηνείς δύο ειδών: Command-line interpreter ιαβάζει και αναλύει συντακτικά κοµµάτια πηγαίου κώδικα της γλώσσας τα οποία και εκτελεί Χρησιµοποιείται σε συστήµατα που αλληλεπιδρούν µε το χρήστη Virtual machine instruction interpreter ιαβάζει και εκτελεί εντολές µιας ενδιάµεσης µορφής εκτελέσιµου κώδικα όπως bytecode εντολών µιας εικονικής µηχανής Εικονικές µηχανές, διερµηνείς και διαχείριση µνήµης 11

Υλοποίηση των ιερµηνέων Υπάρχουν πολλοί τρόποι υλοποίησης διερµηνέων: 1. Direct string interpretation Source level interpreters are very slow because they spend much of their time in doing lexical analysis 2. Compilation into a (typically abstract syntax) tree and interpretation of that tree Such interpreters avoid lexical analysis costs, but they still have to do much list scanning (e.g. when implementing a goto or call ) 3. Compilation into a virtual machine and interpretation of the VM code Εικονικές µηχανές, διερµηνείς και διαχείριση µνήµης 12

ιερµηνείς Εντολών Εικονικών Μηχανών By compiling the program to the instruction set of a virtual machine and adding a table that maps names and labels to addresses in this program, some of the interpretation overhead can be reduced For convenience, most VM instruction sets use integral numbers of bytes to represent everything opcodes, register numbers, stack slot numbers, indices into the function or constant table, etc. Opcode Reg # CONSTANT Example: The GET_CONST2 instruction Εικονικές µηχανές, διερµηνείς και διαχείριση µνήµης 13

Μέρη της Υλοποίησης µιας Εικονικής Μηχανής Το µέρος που αποθηκεύεται το πρόγραµµα (ο κώδικας) Το πρόγραµµα είναι µια ακολουθία από εντολές Φορτωτής (loader) Μέρη που καταγράφουν την κατάσταση (της εκτέλεσης) Στοίβα (stack) Σωρός (heap) Καταχωρητές (registers) Ένας ειδικός καταχωρητής, ο µετρητής προγράµµατος (program counter), δείχνει πάντα στην επόµενη προς εκτέλεση εντολή Το σύστηµα χρόνου εκτέλεσης (runtime system) Σύστηµα παραχώρησης µνήµης (memory allocator) Συλλέκτης σκουπιδιών (garbage collector) Εικονικές µηχανές, διερµηνείς και διαχείριση µνήµης 14

Η βασική δοµή ενός Bytecode Interpreter byte *pc = &byte_program[0]; while(true) { opcode = pc[0]; switch (opcode) { case GET_CONST2: source_reg_num = pc[1]; const_num_to_match = get_2_bytes(&pc[2]); // get_const2 code pc += 4; break; case JUMP: jump_addr = get_4_bytes(&pc[1]); pc = &byte_program[jump_addr]; break; } } Εικονικές µηχανές, διερµηνείς και διαχείριση µνήµης 15

To align or to not align VM instructions? Σε µια 32-bit µηχανή Opcode Jump Address Opcode Unused Bytes Jump Address NOTE: Padding of instructions can be done by the loader. The size of the bytecode files need not be affected. Εικονικές µηχανές, διερµηνείς και διαχείριση µνήµης 16

Bytecode Interpreter with Aligned Instructions byte *pc = &byte_program[0]; while(true) { opcode = pc[0]; switch (opcode) { case GET_CONST2: source_reg_num = pc[1]; const_num_to_match = get_2_bytes(&pc[2]); // get_const2 code pc += 4; break; case JUMP: // aligned version jump_addr = get_4_bytes(&pc[4]); pc = &byte_program[jump_addr]; break; } } Εικονικές µηχανές, διερµηνείς και διαχείριση µνήµης 17

ιερµηνέας µε αφηρηµένη κωδικοποίηση εντολών byte *pc = &byte_program[0]; #define GET_CONST2_SIZEOF 4 while(true) { #define JUMP_SIZEOF 8 opcode = pc[0]; #define GET_CONST2_ARG1 1 switch (opcode) { #define GET_CONST2_ARG2 2 #define JUMP_ARG1 4 case GET_CONST2: source_reg_num = pc[get_const2_arg1]; const_num_to_match = get_2_bytes(&pc[get_const2_arg2]); // get_const2 code pc += GET_CONST2_SIZEOF; break; case JUMP: // aligned version jump_addr = get_4_bytes(&pc[jump_arg1]); pc = &byte_program[jump_addr]; break; } } Εικονικές µηχανές, διερµηνείς και διαχείριση µνήµης 18

ιερµηνέας µε αφηρηµένο έλεγχο byte *pc = &byte_program[0]; while(true) { #define NEXT_INSTRUCTION \ goto next_instruction next_instruction: opcode = pc[0]; switch (opcode) { case GET_CONST2: source_reg_num = pc[get_const2_arg1]; const_num_to_match = get_2_bytes(&pc[get_const2_arg2]); // get_const2 code pc += GET_CONST2_SIZEOF; NEXT_INSTRUCTION; case JUMP: // aligned version jump_addr = get_4_bytes(&pc[jump_arg1]); pc = &byte_program[jump_addr]; NEXT_INSTRUCTION; } } Εικονικές µηχανές, διερµηνείς και διαχείριση µνήµης 19

Έµµεσα Νηµατικοί ιερµηνείς Σε έναν έµεσα νηµατικό διερµηνέα (indirectly threaded interpreter) we do not switch on the opcode encoding; instead we use the bytecodes as indices into a table containing the addresses of the VM instructions The term threaded code refers to a code representation where every instruction is implicitly a function call to the next instruction A threaded interpreter can be very efficiently implemented in assembly In GNU CC, we can use the labels as values C language extension and take the address of a label with &&labelname We can actually write the interpreter in such a way that it uses indirectly threaded code if compiled with GNU CC and a switch for compatibility Εικονικές µηχανές, διερµηνείς και διαχείριση µνήµης 20

οµή ενός Έµµεσα Νηµατικού ιερµηνέα byte *pc = &byte_program[0]; static void *label_tab[] = { while(true) { next_instruction: &&get_const2_label, opcode = pc[0]; &&jump_label, switch (opcode) { } #define NEXT_INSTRUCTION \ case GET_CONST2: goto *(void *)(label_tab[*pc]) get_const2_label: source_reg_num = pc[get_const2_arg1]; const_num_to_match = get_2_bytes(&pc[get_const2_arg2]); // get_const2 code pc += GET_CONST2_SIZEOF; NEXT_INSTRUCTION; case JUMP: // aligned version jump_label: jump_addr = get_4_bytes(&pc[jump_arg1]); pc = &byte_program[jump_addr]; NEXT_INSTRUCTION; } Εικονικές } µηχανές, διερµηνείς και διαχείριση µνήµης 21

Άµεσα Νηµατικοί ιερµηνείς In a directly threaded interpreter, we do not use the bytecode instruction encoding at all during runtime Instead, the loader replaces each bytecode instruction encoding (opcode) with the address of the implementation of the instruction This means that we need one word for the opcode, which increases the VM code size Εικονικές µηχανές, διερµηνείς και διαχείριση µνήµης 22

οµή ενός Άµεσα Νηµατικού ιερµηνέα byte *pc = &byte_program[0]; static void *label_tab[] = { while(true) { next_instruction: &&get_const2_label, opcode = pc[0]; &&jump_label, switch (opcode) { } #define NEXT_INSTRUCTION \ case GET_CONST2: goto **(void **)(pc) get_const2_label: source_reg_num = pc[get_const2_arg1]; const_num_to_match = get_2_bytes(&pc[get_const2_arg2]); // get_const2 code pc += GET_CONST2_SIZEOF; NEXT_INSTRUCTION; case JUMP: // aligned version #define GET_CONST2_SIZEOF 8 jump_label: #define JUMP_SIZEOF 8 pc = get_4_bytes(&pc[jump_arg1]); #define GET_CONST2_ARG1 5 NEXT_INSTRUCTION; #define GET_CONST2_ARG2 6 #define JUMP_ARG1 4 } } Εικονικές µηχανές, διερµηνείς και διαχείριση µνήµης 23

Νηµατικός ιερµηνέας µε Χρήση Prefetching byte *pc = &byte_program[0]; while(true) { next_instruction: opcode = pc[0]; switch (opcode) { case GET_CONST2: get_const2_label: source_reg_num = pc[get_const2_arg1]; const_num_to_match = get_2_bytes(&pc[get_const2_arg2]); pc += GET_CONST2_SIZEOF; // prefetching // get_const2 code NEXT_INSTRUCTION; case JUMP: // aligned version jump_label: pc = get_4_bytes(&pc[jump_arg1]); NEXT_INSTRUCTION; } } Εικονικές µηχανές, διερµηνείς και διαχείριση µνήµης 24

Subroutine Threaded Interpreter The only portable way to implement a threaded interpreter in C is to use subroutine threaded code Each VM instruction is implemented as a function and at the end of each instruction the next function is called Εικονικές µηχανές, διερµηνείς και διαχείριση µνήµης 25

Stack-based vs. Register-based VMs A VM can either be stack-based or register-based In a stack-based VM most operands are (passed) on the stack The stack can grow as needed In a register-based VM most operands are passed in (virtual) registers These registers are often implemented using an array rather than physical machine registers The number of registers is limited Most VMs are stack-based Stack machines are simpler to implement Stack machines are easier to compile to Less encoding/decoding to find the right register Unless virtual registers are mapped to physical registers, virtual registers are not faster than stack slots Εικονικές µηχανές, διερµηνείς και διαχείριση µνήµης 26

Virtual Machine Interpreter Tuning Common VM interpreter optimizations include: Writing the interpreter loop and key instructions in assembly Keeping important VM registers (pc, stack top, heap top) in hardware registers GNU C allows global register variables Top of stack caching Splitting the most used set of instruction into a separate interpreter loop Εικονικές µηχανές, διερµηνείς και διαχείριση µνήµης 27

Instruction Merging and Specialization Instruction Merging: A sequence of VM instructions is replaced by a single (mega-)instruction Reduces interpretation overhead Code locality is enhanced Results in more compact bytecode C compiler has bigger basic blocks to perform optimizations on Instruction Specialization: A special case of a VM instruction is created, typically one where some arguments have a known value which is hard-coded Eliminates the cost of argument decoding Results in more compact bytecode representation Reduces the register pressure from some basic blocks Εικονικές µηχανές, διερµηνείς και διαχείριση µνήµης 28

Χρηματοδότηση Το παρόν εκπαιδευτικό υλικό έχει αναπτυχθεί στα πλαίσια του εκπαιδευτικού έργου του διδάσκοντα. Το έργο «Ανοικτά Ακαδημαϊκά Μαθήματα» του ΕΜΠ έχει χρηματοδοτήσει μόνο την αναδιαμόρφωση του υλικού. Το έργο υλοποιείται στο πλαίσιο του Επιχειρησιακού Προγράμματος «Εκπαίδευση και Δια Βίου Μάθηση» και συγχρηματοδοτείται από την Ευρωπαϊκή Ένωση (Ευρωπαϊκό Κοινωνικό Ταμείο) και από εθνικούς πόρους.