Compiling Functional Languages (2002) [pdf]
xavierleroy.org
xavierleroy.org
Closures are just functions with an extra parameter for the environment (free variables). Subsequent passes after desugaring can treat them like any other function.
Function composition and currying should also be static transformations. Maybe you made it harder than it has to be?
Implementing these things is maybe easy for you ;) but for myself, doing it well, I would definitely not describe as a walk in the park
My main objection to the grand parent is the idea that functional languages are 10x more difficult to implement than mainstream languages. Maybe that is true for Haskell, but most functional features can be compiled efficiently without much additional complexity. The complexity added by closures for instance would be closer to 1% than 10x.
[0] http://www.mlton.org/guide/20130715/References.attachments/C... ("Flow-Directed Closure Conversion for Typed Languages")
One way to go is compilation to combinators, which are functions that don't have a runtime representation of a lexical environment, aka functions that can be serialised as C without change in semantics. Basically add arguments to represent closed over data and rewrite call sites.
On reflection I think continuation capture is a candidate for inherent overhead that cannot be eliminated - at least I can't currently see how to eliminate it - but then C can't do that. There's also the question of runtime cost of error detection, out of bounds etc, which C also doesn't do.
You probably need whole program compilation to desugar everything. And I'm essentially claiming a sufficiently smart compiler can make functional languages as fast as imperative, which has dubious empirical support. Stuff like hash tables are hard to express without mutation or overhead. Still, mlton and stalin (r4rs scheme) take a reasonable stab at it.
Probably fair to say that with today's compiler tech I'm wrong, but not in a fundamentally unsolvable tomorrow sort of way.
I wonder what is a zero overhead abstraction. For instance closures are expensive (they malloc), but to what extent can we consider closures to be malloc'd structs; then potentially do away with the concept of structs -- because they've become a subset of the functionality provided by closures. At that point can we not consider closures as zero cost; because malloc of structs is essential to c, and with optimization we need be no more expensive
And to what extent does that hold true for every other feature? In some sense it is maybe always true
``` Today: we are able to certify realistic bytecode compilers and abstract machines.
Tomorrow: certification of optimizing native-code compilers? ```
Xavier Leroy actually got the ACM Software System Award in 2021 for CompCert, an optimizing native-code compiler! It's first version seems to have been released in 2005, just 3 years after this presentation was written. Though CompCert is a C compiler, which isn't really a functional language.
- https://en.wikipedia.org/wiki/ACM_Software_System_Award - https://en.wikipedia.org/wiki/CompCert