- Rubinius - Ruby JIT on LLVM, often slower than the standard interpreter (!!)
- Pyston - Python JIT by Dropbox, abandoned because it wasn't going anywhere
- FTL - JavaScript backend by Mozilla, they're now doing their own thing with BBB and abandoned LLVM because it wasn't working out
The only ones that have worked well, like Falcon (Java backend by Azul), have major IR and passes in front of them and use LLVM like a portable assembler, but as you say that's not ideal anyway.
You can't just dump your language into LLVM and expect it to work miracles, but people keep trying again and again and again.
* R
* Julia
* MATLAB
* Mathematica
* Swift
Use LLVM as their backend.
- Crystal is Ruby simplified in order to make it amenable to compilation by LLVM. They couldn't move LLVM to the language, so they had to move the language to LLVM.
- R's performance is very limited.
- Julia was specifically designed to be easy to compile.
- Swift has SIL - they don't just output LLVM. See what they say about LLVM! https://llvm.org/devmtg/2015-10/slides/GroffLattner-SILHighL... 'Wide abstraction gap between source and LLVM IR', 'IR isn't suitable for source-level analysis', etc. And they have these problems even with the best LLVM experts on their team!
I don't know much about MATLAB or Mathematica, sorry.
Yes that’s my point - you can’t just emit LLVM and cross your fingers. But people keep on trying.
Notably not on this list and known for fast compile times:
* Nim
* Go
I wouldn't say it's worthless, since Tensorflow is using it and MLIR could grow into the middle-end for some new HPC / data science language, but personally I am somewhat leery. GHC already has Core, STG, and C-- so it doesn't particularly need a new intermediate language, and for a new language I would prefer to investigate something besides SSA like Thorin (https://anydsl.github.io/Thorin.html).
But it can't be so bad that it offsets the gain of the many supported platforms, can it?
As an assembler, LLVM is not particularly fast or convenient. It has a huge API, and lots of optimization passes that have to be tweaked to get reasonable output. The posts I read that got that far generally recommended ditching LLVM and forking a JIT engine like LuaJIT, libjit, etc.
tl;dr I agree with the author that maintaining NCG is the way to go. The difference is, I expect LLVM to implode long-term rather than expand.