Στις μέρες μας, οι υπάρχοντες μεταγλωττιστές ανοιχτού κώδικα χρησιμοποιούν
απαρχαιωμένες τεχνικές παραγωγής κώδικα μηχανής και δεν μοιράζονται μεταξύ τους
κώδικα υλοποίησης. Επιπλέον, αποτελούνται από πολύπλοκο κώδικα υλοποίησης,
γεγονός που καθιστά δύσκολο το να μελετηθούν και ακόμα πιο δύσκολο το να
αλλάξουν. Η Low Level Virtual Machine (LLVM) είναι μια βιβλιοθήκη τελευταίας
τεχνολογίας για μεταγλωττιστές. Παρέχει ένα σύνολο από επαναχρησιμοποιήσιμα
εργαλεία που υλοποιούν τις καλύτερες τεχνικές μεταγλώττισης και στατικής
ανάλυσης, εστιάζοντας στην επίδοση του παραγόμενου κώδικα και στο χρόνο
μεταγλώττισης. Ο απώτερος στόχος της LLVM είναι να παρέχει ανεξάρτητα
εξαρτήματα για την κατασκευή υψηλής ποιότητας μεταγλωττιστών για πολλές
διαφορετικές γλώσσες.
Η διπλωματική αυτή περιγράφει την παρούσα αρχιτεκτονική, τις βασικές σχεδιαστικές
αποφάσεις και κάποιες λεπτομέρειες υλοποίησης ενός νέο οπίσθιου τμήματος για
τον HiPE, το μεταγλωττιστή κώδικα μηχανής του συστήματος της Erlang/OTP, που
χρησιμοποιεί την υποδομή της LLVM. Διαπιστώθηκε πως μία από τις ενδιάμεσες
γλώσσες του HiPE, η Register Transfer Language (RTL), έχει πολύ απλή και
προφανή απεικόνιση στη συμβολική γλώσσα της LLVM. Παρόλα αυτά, υπήρχαν κάποια
λεπτά σημεία, όπως η σύμβαση κλήσης συναρτήσεων, ο μηχανισμός χειρισμού
εξαιρέσεων και η συλλογή σκουπιδιών, που απαιτούσαν ειδικούς χειρισμούς για να
διατηρηθεί η συμβατότητα με το Application Binary Interface (ABI) του
Συστήματος Χρόνου-Εκτέλεσης της Erlang (Erlang Run-Time System) και κατ'
επέκταση η ενσωμάτωση της δουλειάς μας να γίνει διατηρώντας την υπάρχουσα
αρχιτεκτονική της Εικονικής Μηχανής. Γι' αυτούς τους λόγους χρειάστηκε να
αλλάξουμε τo Εξάρτημα Παραγωγής Κώδικα της LLVM, εφαρμόζοντας τους κανόνες που
επέβαλλε το ABI στον παραγόμενο κώδικα.
Στο κεφάλαιο της αξιολόγησης αναλύουμε λεπτομερώς την τρέχουσα πολυπλοκότητα
και την επίδοση του νέου οπίσθιου τμήματος που υλοποιήσαμε με χρήση της LLVM
για την οικογένεια επεξεργαστών AMD64. Οι χρόνοι εκτέλεσης των
μετρο-προγραμμάτων που μεταγλωττίστηκαν στο δικό μας οπίσθιο τμήμα ήταν
συγκρίσιμοι με εκείνους των προγραμμάτων που μεταγλωττίστηκαν στο υπάρχων
οπίσθιο τμήμα του HiPE, και σημαντικά πιο μικροί από εκείνων της Eικονικής
Mηχανής BEAM και της Erjang, η οποία είναι μια εικονική μηχανή για την Erlang
βασισμένη στην Εικονική Μηχανή της Java (JVM). Η πολυπλοκότητα του τμήματός μας
αποδείχθηκε σημαντικά μικρότερη. Ιδιαιτέρως αν λάβει κανείς υπόψιν του ότι, με
σχετικά απλές επεκτάσεις, το οπίσθιο τμήμα που υλοποιήσαμε μπορεί να καλύψει
όλες τις αρχιτεκτονικές επεξεργαστών που σήμερα υποστηρίζει ο HiPE. Αρκετές
βελτιώσεις έχουν ήδη προγραμματιστεί ως αντικείμενο μελλοντικής εργασίας.
Existing open-source compilers are based on old code generation technology, with
code bases that are difficult to learn and hard to change, and share no code
between each other. The Low Level Virtual Machine (LLVM) is a state-of-the-art
compiler infrastructure providing a set of reusable components that implement
the best known techniques focusing on compile time and performance of the
generated code. The goal of LLVM is to provide modular components for building
high quality compilers for many different languages.
This thesis describes the current architecture, design decisions and implementation
details of a new back end for HiPE, the native code compiler of
Erlang/OTP, that targets the LLVM infrastructure. One of HiPE's intermediate
representation, called Register Transfer Language (RTL), was found to have a
very straightforward translation to LLVM assembly. However, there were a few
subtle points, such as the calling convention, the exception handling mechanism
and the garbage collection, that needed to be handled in order to retain Application
Binary Interface (ABI) compatibility with the Erlang Run-Time System (ERTS) and
integrate our work in the existing Virtual Machine architecture. For these
reasons we patched the LLVM Code Generator and imposed the appropriate rules on
the generated binary code.
In the evaluation we detail the current complexity and performance of the new
LLVM back end for the AMD64 architecture. The run-time performance was found to
be comparable with HiPE and signifficantly faster than BEAM virtual machine
and Erjang, a virtual machine for Erlang based on the Java Virtual Machine
(JVM). The complexity of the LLVM back end proved to be far simpler;
especially, if you take into consideration that, with rather plain extensions,
it can support all hardware architectures that HiPE currently targets. Various
performance improvements are planned for future work.