Οι γλώσσες προγραμματισμού με μη αυστηρή σημασιολογία χρησιμοποιούνται για τη συγγραφή προγραμμάτων στα οποία μια έκφραση μπορεί να αντιστοιχίζεται σε ένα όνομα, χωρίς όμως να υπολογίζεται στο σημείο της δέσμευσης. Γλώσσες αυτού του τύπου χρησιμοποιούνται αρκετά σε ερευνητικά θέματα αλλά και σε πρακτικές εφαρμογές γιατί επιτρέπουν τη συγγραφή γρήγορων και κομψών προγραμμάτων, όπου οι υπολογισμοί ορίζονται όπου έχει νόημα αλλά εκτελούνται μόνο όταν χρειάζονται.
Αυτή η διδακτορική διατριβή εξετάζει τον νοηματικό μετασχηματισμό (intensional transformation) ως εναλλακτική τεχνική υλοποίησης μη αυστηρών συναρτησιακών γλωσσών, καταλήγοντας στα εξής αποτελέσματα:
(1) Περιγράφεται ο γενικευμένος νοηματικός μετασχηματισμός, το βασικό νέο θεωρητικό αποτέλεσμα που αποτελεί γενίκευση του κλασικού νοηματικού μετασχηματισμού και, σε συνδυασμό με τον μετασχηματισμό απαλοιφής συναρτήσεων (defunctionalization), επιτυγχάνει να μετασχηματίσει προγράμματα υψηλότερης τάξης με αυθαίρετες δομές δεδομένων σε προγράμματα ροής δεδομένων (dataflow) μηδενικής τάξης.
(2) Αποδεικνύεται η εκφραστική ισοδυναμία των δύο κλασικών εκδοχών του νοηματικού μετασχηματισμού (πρώτης τάξης και υψηλότερης τάξης) χρησιμοποιώντας τον μετασχηματισμό defunctionalization.
(3) Δίνεται μια αποδοτική υλοποίηση του γενικευμένου νοηματικού μετασχηματισμού με τη μορφή ενός μεταγλωττιστή για τη γλώσσα Haskell. Η υλοποίηση είναι κατάλληλη για δημοφιλείς αρχιτεκτονικές υλικού και μπορεί να συγκριθεί σε ταχύτητα με άλλους διαθέσιμους μεταγλωττιστές της Haskell.
(4) Περιγράφεται μια νέα, οικονομική σε μνήμη, κωδικοποίηση των δομών του χρόνου εκτέλεσης, για την αρχιτεκτονική υλικού AMD64. Αυτή η κωδικοποίηση βελτιώνει την ταχύτητα και τη χρήση κρυφής μνήμης των προγραμμάτων που παράγονται, με αποτέλεσμα η υλοποίηση να είναι συγκρίσιμη σε ταχύτητα με τον μεταγλωττιστή GHC, ο οποίος αποτελεί την ντε φάκτο υλοποίηση της Haskell.
(5) Ως σήμερα, ο μετασχηματισμός defunctionalization και ο νοηματικός μετασχηματισμός έχουν περιγραφεί ως μετασχηματισμοί χωρίς δυνατότητα ξεχωριστής μεταγλώττισης. Στη διατριβή αυτή αποδεικνύεται πώς αυτό το χαρακτηριστικό μπορεί να προστεθεί και στους δύο, ώστε να μπορούν να επεξεργαστούν προγράμματα με τη μορφή μονάδων κώδικα Haskell, φτάνοντας έτσι στον τμηματικό νοηματικό μετασχηματισμό και στον τμηματικό μετασχηματισμό defunctionalization.
Non-strict programming languages are used to write programs where an expression may be bound to a name, but it is not necessarily evaluated on the spot. Such languages have been successful in both research and applications, since they allow programmers to write efficient and elegant programs where computations are declared where it makes sense but only run when needed.
This thesis describes the intensional transformation, a technique that translates higher-order non-strict programs to dataflow programs that can still be implemented using familiar lazy evaluation techniques on mainstream computers. The main contributions of this work are:
(1) We present the generalized intensional transformation, an extension of the classic intensional transformation that can handle languages with user-defined data types. Having data types, we then use the defunctionalization transformation to add support for higher-order functions in the intensional transformation, addressing the other open problem of the classic intensional transformation, that of supporting closures.
(2) We prove that the two flavors of the classic intensional transformation are equally expressive, using defunctionalization.
(3) We demonstrate that the intensional transformation is an efficient implementation technique on mainstream hardware by building a compiler that is competitive with other compilers of the Haskell programming language.
(4) We present a compact representation of program runtime structures that takes advantage of the AMD64 hardware architecture and results in fast and memory-efficient programs.
(5) We show how to combine separate compilation with defunctionalization and the intensional transformation, two transformations so far considered whole-program. In particular, we show how Haskell-style modules can be separately compiled and then linked in variants of both transformations.