This is a topic I've given some thought to, and came to similar conclusions as the author. There's no general solution to the static recompilation problem.
However, there is potential for tooling that makes it easier to generate a crafted solution for a particular game/program. NES games may be too complex for a crafted solution. But if a program's execution can be characterized in a way to make most of it machine translatable, leaving only a few trouble areas to patch up (and implementing I/O integrations), then a recompilation could be practical.
Some categories of program are likely even harder than most NES games. For example, I've seen C64 games with self-modifying 6502 code. But in one case, the self-modification technique is applied consistently throughout (possibly a compiler optimization) and can theoretically be characterized and taken into account.
I occasionally tinker with the idea of recompiling a particular 8086 game. But I sometimes feel that it's almost cheating to pick it as a target, since it's so ridiculously suited for such an endeavor. :) It's tiny (far smaller than any NES game), has very simple I/O needs, and was apparently compiled in Turbo Pascal without any sort of optimizations, thus producing machine code that is immensely straightforward. Maybe someday I'll get around to it.
I would think you would still need some sort of microVM or container that would act as the runtime. I get that MAME is probably too large now serving so many masters.
I would think you would still need some sort of microVM or container that would act as the runtime. I get that MAME is probably too large now serving so many masters.
However, there is potential for tooling that makes it easier to generate a crafted solution for a particular game/program. NES games may be too complex for a crafted solution. But if a program's execution can be characterized in a way to make most of it machine translatable, leaving only a few trouble areas to patch up (and implementing I/O integrations), then a recompilation could be practical.
Some categories of program are likely even harder than most NES games. For example, I've seen C64 games with self-modifying 6502 code. But in one case, the self-modification technique is applied consistently throughout (possibly a compiler optimization) and can theoretically be characterized and taken into account.
I occasionally tinker with the idea of recompiling a particular 8086 game. But I sometimes feel that it's almost cheating to pick it as a target, since it's so ridiculously suited for such an endeavor. :) It's tiny (far smaller than any NES game), has very simple I/O needs, and was apparently compiled in Turbo Pascal without any sort of optimizations, thus producing machine code that is immensely straightforward. Maybe someday I'll get around to it.