Macro-embedding Compiler Intermediate Languages in Racket
By: William J. Bowman
Potential Business Impact:
Builds many computer languages easily in one.
We present the design and implementation of a macro-embedding of a family of compiler intermediate languages, from a Scheme-like language to x86-64, into Racket. This embedding is used as part of a testing framework for a compilers course to derive interpreters for all the intermediate languages. The embedding implements features including safe, functional abstractions as well as unsafe assembly features, and the interactions between the two at various intermediate stages. This paper aims to demonstrate language-oriented techniques and abstractions for implementing (1) a large family of languages and (2) interoperability between low- and high-level languages. The primary strength of this approach is the high degree of code reuse and interoperability compared to implementing each interpreter separately. The design emphasizes modularity and compositionality of an open set of language features by local macro expansion into a single host language, rather than implementing a language pre-defined by a closed set of features. This enables reuse from both the host language (Racket) and between intermediate languages, and enables interoperability between high- and low-level features, simplifying development of the intermediate language semantics. It also facilitates extending or redefining individual language features in intermediate languages, and exposing multiple interfaces to the embedded languages.
Similar Papers
Fast and Extensible Hybrid Embeddings with Micros
Programming Languages
Makes computer programs run much faster.
Choreographies as Macros
Programming Languages
Builds new computer languages faster and better.
Compilation as Multi-Language Semantics
Programming Languages
Makes computer programs work together safely.