Verified optimizations for functional languages

Το σύστημα Coq είναι ένα από τα πιο διαδεδομένα συστήματα μηχανικών αποδείξεων. Επιτρέπει στους χρήστες να γράφουν συναρτησιακά προγράμματα, να εκφράζουν τυπικές προδιαγραφές για αυτά, και στη συνέχεια να τις αποδεικνύουν μέσω μιας διαλογικής διεπαφής. Τα προγράμματα που είναι γραμμένα σε Coq μπορούν να εξαχθούν σε μία από τις γλώσσες OCaml, Haskell, ή Scheme και στην συνέχεια να μεταγλωττιστούν και να εκτελεστούν. Όταν το πρόγραμμα Coq συνοδεύεται από μια μηχανική απόδειξη ορθότητας, τότε το πρόγραμμα που εξάγεται πρόκειται για ένα πιστοποιημένο πρόγραμμα. Ωστόσο, σφάλματα τόσο στο πρόγραμμα εξαγωγής όσο και στους μεταγλωττιστές μπορούν να δημιουργήσουν σημασιολογικές διαφορές μεταξύτου τελικού εκτελέσιμου και του αρχικού προγράμματος, με αποτέλεσμα οι αποδεδειγμένες ιδιότητες να μην ισχύουν για τον τελικό κώδικα. Προκειμένου να επιτευχθεί πιστοποίηση του προγράμματος απο άκρη σε άκρη, χρειάζεται ο τελικός κώδικας να παράγεται μέσω μιας πιστοποιημένης διαδικασίας μεταγλώττισης. Επιπλέον, είναι σύνηθες κάποια προγράμματα να μεταγλωττίζονται ξεχωριστά (π.χ. βιβλιοθήκες). Είναι σημαντικό λοιπόν οι αποδείξεις ορθότητας μεταγλώττισης που αφορούν κάθε πρόγραμμα ξεχωριστά, να μπορούν να συντεθούν σε μια απόδειξη που αφορά το τελικό πρόγραμμα μετά τη σύνδεση. Αυτό είναι ένα γνωστό πρόβλημα στην βιβλιογραφία επαλήθευσης μεταγλωττιστών που αυξάνει σημαντικά την πολυπλοκότητα των αποδείξεων. Σε αυτή τη διατριβή παρουσιάζεται υλοποίηση και πιστοποίηση του μέσου τμήματος του μεταγλωττιστή CertiCoq, ενός μηχανικά επαληθευμένου μεταγλωττιστή για την γλώσσα Coq. Ο μεταγλωττιστής όπως και οι αποδείξεις είναι γραμμένα στην Coq. Το μέσο τμήμα αποτελείται από 7 μετασχηματισμούς προγραμμάτων (closure conversion, lambda lifting, inlining, shrink reduction, hoisting, uncurrying, dead parameter elimination) πάνω σε μια συναρτησιακή ενδιάμεση αναπαράσταση που βασίζεται στην Α-κανονική μορφή. Οι μετασχηματισμοί αυτοί μετατρέπουν τις συναρτήσεις υψηλής τάξης σε συναρτήσεις πρώτης τάξης. Έτσι, το πρόγραμμα μπορεί να μεταφραστεί άμεσα σε μια γλώσσα χαμηλού επιπέδου. Οι μετασχηματισμοί εκτελούν επίσης βελτιστοποιήσεις που είναι κρίσιμες για την αποδοτικότητα τουτελικού προγράμματος. Προκειμένου να αποδειχτεί η ορθότητα των μετασχηματισμών αναπτύσσεται ένα νέο πλαίσιο που βασίζεται στην τεχνική των λογικών σχέσεων. Το πλαίσιο δίνει τη δυνατότητα σε αποδείξεις ορθής μεταγλώττισης προγραμμάτων που έχουν μεταγλωττιστεί ξεχωριστά να συντεθούν σε έναμια απόδειξη ορθής μεταγλώττισης που αφορά το τελικό πρόγραμμα μετά τη σύνδεση. Αυτό μπορεί να γίνει ακόμα και αν εσωτερικά οι μεταγλωττιστές που χρησιμοποιούνται για την ξεχωριστή μεταγλώττιση χρησιμοποιούν διαφορετικούς μετασχηματισμούς. Ωστόσο, επιβάλλεται ο επιπλέον περιορισμός ότι οι μεταγλωττιστές χρησιμοποιούν τις ίδιες ενδιάμεσες αναπαραστάσεις. Η διατριβή δείχνει πως μια γνωστή τεχνική μπορεί να χρησιμοποιηθεί για να λύσει ένα δύσκολο πρόβλημα στην βιβλιογραφία, για το οποίο οι προηγούμενες τεχνικές που θα μπορούσαν να εφαρμοστούν θα αύξαναν σημαντικά την πολυπλοκότητα. Το πλαίσιο χρησιμοποιείται επίσης για να αποδειχτεί ότι η μετατροπή κλεισίματος συναρτήσεων (closure conversion) του μεταγλωττιστή διατηρεί την χωρική και χρονική ασυμπτωτική πολυπλοκότητα του προγράμματος. Αυτό είναι ιδιαιτέρως σημαντικό καθώς έχει βρεθεί ότι συγκεκριμένες υλοποιήσεις του μετασχηματισμού μπορούν να προκαλέσουν διαρροές μνήμης, αλλάζοντας την χωρική ασυμπτωτική πολυπλοκότητα των προγραμμάτων.