Compiling to Java as a target language
matt.might.net
matt.might.net
A lot of languages are doing exactly that, like Mirah, Clojure, ABCL, Scala and many more.
And what you gain by not learning to output bytecode, you lose by writing supporting libs.
And the example in the article is too simple. Yes you can translate Scheme to Java easily, until you need to do I/O, or until you need to optimize it such that you could use it for real work. I also don't see any mention of continuations, which are surely part of the Scheme standard, or am I wrong?
Another great example of how straightforward compilers can be is the Tiny C Compiler (http://bellard.org/tcc/).
JVM bytecode isn't that far away from machine code.
It is far away in the case the type system is a complete mismatch, like Haskell. Or in the case of Scheme, if you want to have continuations without a huge performance penalty, you've got to put some effort into it.For these instances I've see advices on Lambda-the-Ultimate to just go for native-code, as it is easier to experiment since you have a lot more freedom.
That said, building on top of the JVM can have advantages other than being easy to write the compiler.
mirahc still does have a --java option, anyway...
By the way, ABCL source code seems very interesting for anyone interested in compilers/interpreters/Lisp.
> performance will go up, but implementation code size and > complexity will go up by about a factor of two
Moving from basic compiler optimizations (CSE, let-floating, unused variable elimination) to static-analysis driven optimizations (arity raising, useless variable elimination, super-beta, CFA-driven closure conversion, transducer identification and optimization for concurrency) may only double code size, but the implementation complexity is pretty intense. Those optimizations often are performing global reasoning against a CPS-style intermediate representation, and debugging issues with them can take a while. We do all of the parenthesized operations listed earlier (in Manticore, http://manticore.cs.uchicago.edu), and I would claim order of magnitude more time/thought spent on the them.
That said, I think I'm supporting Matt's argument of avoiding moving up the complexity order unless you have to!