And that's why we can't have nice things

Over the years, I’ve dabbled with a lot of different hardware and software combinations, to name a few: Own Forth implementations, GNU Ada of different vintages, C++ from ancient CFront 3.0 to C++23, OCaml 4, Zig, Rust, Go, Node/JavaScript/TypeScript and of course C - many of these on STM32, AVR, MSP430 and desktop systems.

One of my conclusions on this is that when implementing systems for longer term use, the churn of the underlying technologies is starting to get very frustrating. Some examples:

  • Setting up Ada cross compilers with runtimes is despite existing scripts not trivial.
  • Cross compiling Zig for AVR broke at some point due to an LLVM bug.
  • MSP430 targets are in general difficult regardless of the programming language
  • Anything more modern than C++03 is a gamble.
  • While the core of the JavaScript/Node ecosystem has a certain level of stability, dependencies change very rapidly.
  • Tools might not be available for all development platforms equally

Three programming languages stand out though:

  • Go is by design very conservative.
  • C will always have compilers for whatever target system.
  • Forth is whatever you want it to be, by design it starts from zero, and if the hardware doesn’t change, everything stays the same.

So maybe the way to build systems which need to be maintained for more than just a couple of years is to stick to one of the three above? The safest bet would be Forth, if a host/target combination is missing, just write it yourself :) Janus has the p3212 VM target, which is written in Rust, but moving that to C would be trivial.

2025-05-25