I recently realized that I had to change my implementation plans a bit. Originally the plan was to implement an interpreter for the core language in Java, then implement a native code generator in the core language, and then bootstrap the core language. The interpreter could then be thrown away and the self-hosting implementation could be gradually extended to the full language.
At this point I have a working interpreter written in java and an IA386 code generator written in neutrino itself for a very simple subset of neutrino. However, it’s become clear that a number of decisions made early on weren’t optimal. The distinction between the core subset and the full language isn’t that helpful and in fact having the full language available to write the code generator would be very useful, even if it means that the code generator will then have to handle a bigger language before it can be bootstrapped. The generator uses an intermediate bytecode format which turns out to be too inflexible so I’m in the process of revising that. And finally the language has evolved a bit since I implemented the Java interpreter – I’ve changed the method lookup algorithm slightly and there’s a completely revised model for mutable state.
All in all I’ve decided to go back and take another pass over the existing implementation before adding any new functionality. It’s not as exciting as forging ahead with the language but necessary for the implementation to have a solid foundation.