A supercompiler pass for Erlang
github.com
github.com
Just wanted to say that 99% of this is thanks to [1] and his 2013 Masters thesis.
There has been slight discussion to integrate a supercompiling pass (more involved than the ones that are in the compiler already) over at [2].
Hope to motivate enough people to see this happen, especially since we now have even cheaper constant literals [3]! Let's get on this.
[1] https://github.com/weinholt
[2] https://github.com/erlang/otp/pull/1080#issuecomment-3145985...
[3] https://medium.com/@jlouis666/an-erlang-otp-20-0-optimizatio...
How much speedup? Potentially infinite, at the price of compile time. In real world cases though I don't have any data yet. I want to be able to compile a whole project first and that fails for one last reason, described in the README. But I have faith :)
The patterns that can be superoptimized are few for now. [2] describes how some of lists.erl functions work so that they can be supercompiled. The long-term idea is to have a local(/global if secured) cache of code so that inter-module calls can be optimized if the developer wants.
My real world case/motivation is supercompilation of code such as [3] (goal is to turn `a` into `b` at the assembly level). This pattern is extremely common in my employer's software [4] (which is probably the biggest open source Erlang project AFAIK).
A short example of a being super compiled into b:
a() -> hd([get()]).
b() -> get().
[1] https://github.com/fenollp/erlscp/tree/master/test/asm_data[2] https://github.com/fenollp/erlscp/blob/master/src/erlang_sup...
[3] https://github.com/fenollp/erlscp/blob/master/test/asm_data/...
To quote it :
A SuperCompiler is a dynamic optimizer that can transform the code of an object according to its actual usage.
This may be simple static optimizations, removing state that isn't used from an object; or it may be very complex e.g. partial evaluation of functions leading to code transformation.
Erlang isn't purely functional, since it has things like message sends. This project doesn't seem to handle such things properly :(
> Something will happen if the supercompiled module contains side-effects such as message passing, and it will probably not be something good.
If the supercompiler can't handle message passing then it can't handle ~98% of all Erlang code.
It would be kind of cool to hook a profiling execution tracer into a JIT to find hot paths, resolve that to the nearest "usefully supercompilable" code block (it sounds like supercompilation works best when fed whole programs, I'm not sure how much bigger-picture comprehension [large-scale] JITs have of program scope in practice) and then supercompile that in a CPU-throttled background thread.
Thinking in the context of LLVM et al.
I'm aware that JS engines do a "fast" compile designed to just generate code now within a few ms, and a fractionally slower compile that does do some optimizations and returns executable results within a few hundred ms.
This could be a third optimization stage that takes 1 second, or maybe even 2 or 3, but produces really really good results. If this doesn't already exist - I don't know, so I can't really assume either way - it almost sounds like low hanging fruit, and a super fun project too.
Naming things are really hard
I feel like this is the lament of every compiler author.
Can anybody explain like I'm 5?
As such, what's concerns still exist?
http://www.infoworld.com/article/3217347/java/oracle-doesnt-...
That said: I agree it seems extremely likely at this point that Oracle is going to milk Substrate for enterprise money, and that's a shame because it is a really important component of the system, in my opinion. And not having it will be a big drag for people who are considering Truffle/Graal.