mazeppa: An IR and supercompiler for functional languages
mazeppa: An IR and supercompiler for functional languages
A modern supercompiler for call-by-value functional languages - mazeppa-dev/mazeppa
![GitHub - mazeppa-dev/mazeppa: A modern supercompiler for call-by-value functional languages](https://programming.dev/pictrs/image/86d6c1fd-a57f-4873-8466-6cec4881dc70.png?format=webp&thumbnail=256)
Supercompilation1 is a program transformation technique that symbolically evaluates a given program, with run-time values as unknowns. In doing so, it discovers execution patterns of the original program and synthesizes them into standalone functions; the result of supercompilation is a more efficient residual program. In terms of transformational power, supercompilation subsumes both deforestation2 and partial evaluation3, and even exhibits certain capabilities of theorem proving.
Mazeppa is a modern supercompiler intended to be a compilation target for call-by-value functional languages. Unlike previous supercompilers, Mazeppa 1) provides the full set of primitive data types, 2) supports manual control of function unfolding, 3) is fully transparent in terms of what decisions it takes during transformation, and 4) is designed with efficiency in mind from the very beginning.
Supercompilation explained on Stack Overflow
Mazeppa example (https://github.com/mazeppa-dev/mazeppa/blob/master/examples/sum-squares/main.mz):
main(xs) := sum(mapSq(xs)); sum(xs) := match xs { Nil() -> 0i32, Cons(x, xs) -> +(x, sum(xs)) }; mapSq(xs) := match xs { Nil() -> Nil(), Cons(x, xs) -> Cons(*(x, x), mapSq(xs)) };
Mazeppa automatically translates the above program into the semantically-equivalent but more efficient:
main(xs) := f0(xs); f0(x0) := match x0 { Cons(x1, x2) -> +(*(x1, x1), f0(x2)), Nil() -> 0i32 };
It also generates a graph to visualize and debug the transformation (SVG if it doesn't load):
Mazeppa is written in OCaml and can be used as an OCaml library.