After completing the NAND game I've developed a basic competency in the Hack computer's architecture and assembly language. See
https://en.wikipedia.org/wiki/Hack_computer for an overview.
It's an interesting computer architecture because it is Von Neumann, but partitions memory into a program section and a data section. This is because the load A immediate instruction assumes zero for the most significant bit to allow packing a literal into a 16 bit instruction. But that limits data pointers to values below 0x8000. Conversely any instruction which creates a program counter value assumes 1 for that bit, so all code must reside above 0x7fff. The designers assumed programs are written to a ROM mapped to high memory. Basically like a 1980s video game machine.
It's such a crude architecture that creating a VM was the first order of business for its creators. But they chose a Java-like programming language. This got me thinking about how to create a Forth implementation, and I realized it would be difficult because it looks like data structures can't be built in program memory. Indeed the assembler reference doesn't mention directives for byte, word, or string constants. Everything is done via load immediate.
This is a big problem for a Forth implementation because you would need these to build the Forth dictionary for built-in words, and building in RAM at startup would be a massive headache. Granted this is an educational architecture, so its limitations are not something you would see in many real world systems.
But this made me wonder, are their real world architectures that are unable to host a Forth system? It would seem like any Harvard architecture might have a problem due to the need to construct the dictionary.