Lightweight Modular Staging and Embedded Compilers:Abstraction without Regret for High-Level High-Performance Programming
Tiark Rompf
2012
Programs expressed in a high-level programming language need to be translated to a low-level machine dialect for execution. This translation is usually accomplished by a compiler, which is able to translate any legal program to equivalent low-level code. But for individual source programs, automatic translation does not always deliver good results: Software engineering practice demands generalization and abstraction, whereas high performance demands specialization and concretization. These
more »
... are at odds, and compilers can only rarely translate expressive high-level programs to modern hardware platforms in a way that makes best use of the available resources. Explicit program generation is a promising alternative to fully automatic translation. Instead of writing down the program and relying on a compiler for translation, developers write a program generator, which produces a specialized, efficient, low-level program as its output. However, developing high-quality program generators requires a very large effort that is often hard to amortize. In this thesis, we propose a hybrid design: Integrate compilers into programs so that programs can take control of the translation process, but rely on libraries of common compiler functionality for help. We present Lightweight Modular Staging (LMS), a generative programming approach that lowers the development effort significantly. LMS combines program generator logic with the generated code in a single program, using only types to distinguish the two stages of execution. Through extensive use of component technology, LMS makes a reusable and extensible compiler framework available at the library level, allowing programmers to tightly integrate domain-specific abstractions and optimizations into the generation process, with common generic optimizations provided by the framework. Compared to previous work on program generation, a key aspect of our design is the use of staging not only as a front-end, but also as a way to implement internal compiler passes and optimizations, many of which can be combined into powerful joint simplification passes. LMS is well suited to develop embedded domain specific languages (DSLs) and has been used to develop powerful performance-oriented DSLs for demanding domains such as machine learning, with code generation for heterogeneous platforms including GPUs. LMS has also been used to generate SQL for embedded database queries and JavaScript for web applications. Zusammenfassung In einer "high-level" Programmiersprache geschriebene Programme müssen zur Ausführung in einen "low-level" Maschinendialekt übersetzt werden. Diese Übersetzung wird üblicherweise von einem Compiler durchgeführt, der jedes zulässige Programm in äquivalenten low-level Code übersetzen kann. Für individuelle Quellprogramme führt die automatische Übersetzung allerdings nicht immer zu einem guten Ergebnis: Anforderungen des Software-Engineering (Generalisierung und Abstrahierung) stehen im Widerspruch zu denen hoher Rechenleistung (Spezialisierung und Konkretisierung). Compiler können ausdrucksstarke Programme nur selten auf eine solche Weise übersetzen, dass sie die verfügbaren Ressourcen moderner Hardware-Plattformen in günstigster Weise ausnutzen. Explizite Programmgenerierung is eine vielversprechende Alternative zur vollautomatischen Übersetzung. Anstatt ein Programm fertig auszuformulieren und sich auf einen Compiler zur Übersetzung zu verlassen, können Entwickler einen Programmgenerator schreiben. Dieser erzeugt ein spezialisiertes, effizientes low-level Programm als Ausgabe. Die Entwicklung qualitativ hochwertiger Programmgeneratoren erfordert allerdings einen sehr großen Aufwand der schwer zu amortisieren ist. Diese Dissertation schlägt ein Hybrid-Modell vor: Man integriere Compiler in Programme so dass die Programme Kontrolle über den Übersetzungsvorgang übernehmen können wobei sie von Bibliotheken gängiger Übersetzerfunktionalität unterstützt werden. Wir präsentieren Lightweight Modular Staging (LMS), eine Methode zur Programmgenerierung die den Entwicklungsaufwand deutlich verringert. LMS verbindet Logik des Programmgenerators mit erzeugtem Code im gleichen Programm und unterscheidet die zwei Ausführungsstufen anhand von Typen. Durch weitreichenden Einsatz von Komponenten macht LMS ein erweiterbares Compiler Framework als Bibliothek verfügbar. Dies erlaubt Prorammierern die enge Integration von Programm-spezifischen Abstraktionen und Optimierungen in den Generatorprozess, wobei generische Optimierungen vom Framework bereit gestellt werden. Ein wesentlicher Aspekt ist die Verwendung von Staging nicht allein als Front-End sondern auch zur implementierung interner Compiler-Stufen. LMS ist gut geeignet zur Entwicklung von Domain-Specifc Languages (DSLs) und wurde erfolgreich eingesetzt um Performance-orientierte DSLs für anspruchsvolle Bereiche wie Machine Learning zu implementieren, einschließlich Code Generierung für GPUs. LMS wurde ebenfalls eingesetzt um SQL for eingebettete Datenbankabfragen und JavaScript für Web Anwendungen zu erzeugen.
doi:10.5075/epfl-thesis-5456
fatcat:bmnuaa34nbdyfixtrgmmm4vh4i