I compile the AST to an intermediate representation, untyped lambda terms. That is for convenience, but how convenient is it? As it looks now, most transformations are just as well done on the AST, with the added benefit that work is moved from the linker to the compiler; and another benefit, that functions become available for other optimizations on the AST like type directed optimizations.
On the other hand, it gives a clear split between a front and back/intermediate end.
I compile the lambda terms to text directly. That might have been a pretty bad idea.