I love diving into other peoples forths and checking out what trade offs they made. After figuring out the model (theaded, token etc.) I usually jump to the flags, dictionary layout and then the assembler (in forth) if it has one. My favorite is still f83 - it’s a masterpiece.
Then you might be interested in my Go implementation of Forth [1]. No assembler required, but bootstrapped and with some rudimentary internal type checking.
The heap is just an `[]any` type array.