Along the way, I've had a lot of fun on this project. I removed the virtual machine from the Epoch runtime, building a full garbage collection engine on top of LLVM in the process. I started - and, at long last, successfully finished - a self-hosted compiler.
There's a lot to look back on this year. I'm not feeling excessively nostalgic, though, so screw all that. Let's talk about where this sucker is heading.
I've been resisting the itch for a long time now, but it's become apparent to me that Epoch has some problems with large-scale code. Particularly, it's really hard to keep track of how state mutates as it propagates through dozens of functions with reference-typed parameters. I'm thinking this is mainly an artifact of the language lacking more powerful composition features, but it seems like a bad thing either way.
So I'm going to sit down and think carefully about the type system and how reference-vs-value semantics will be implemented and how they will affect program design. This may turn into a huge rabbit hole, but I think ultimately the language will be a lot better off for it, and I'd rather take the time to fix fundamental design issues before there's a ton of Epoch code in the wild.
Aside from core type system changes, I really want to get back to working on the green thread/task model I proposed for the language a while ago. I suspect that the combination of fixing the type system and empowering better composition will make the language a lot more powerful and clean. This is also the perfect time to start working on parallelism support again, which is something I've wanted to hack on for years now, but keep getting side-tracked by other, more primary tasks.
I have a compiler written now, which is pretty cool by itself, but that's just the beginning. I want to build a really rich toolset for working on Epoch programs, wrapped in a nice and powerful IDE as well as command line modes. Some more details about the kinds of tools I'm contemplating will probably emerge in the next few months.
One more thing that I really ought to tackle is moving away from 32-bit support. I'd really like Epoch to be a native 64-bit language, but that's going to be a monumental amount of conversion work, so I keep putting it off. Maybe this year... we shall see.
Anyways, that's all later. For now, I just finished a rough implementation of support for separate compilation, so I can finally split the compiler out of its single 380KB file and into properly organized modules. So, huzzah.
Next up, it's time to fix some latent bugs in Era and get the garbage collector back online (finally) so I can start refining the IDE and stop using Notepad to edit my code.