A direct-threaded representation of program code is simply a vector of procedure pointers to call, in the order they appear. In x86 assembly language, the "inner interpreter" of such a representation is drop-dead trivially simple: LODSD JMP EAX This assumes that ESI contains the program's next-PC value. Direct ''call'' threading (usually referred to as just "call threading") is also possible: ; in x86 assembly runVM: MOV EAX,[ESI] ADD ESI,4 CALL EAX JMP runVM /* In C; if global state is kept in global variables, then there is no need for a specific environment. */ void runVM(Instruction *virtualIP, Environment *env) { while(ShouldNotQuit(env)) { (*virtualIP++)(env); } } Note that some C compilers permit computed goto expressions, such as GCC. If these are available, then C can also be used to implement a true direct threaded interpreter as well, thus avoiding the overheads of subroutine threading. ---- Contrast with IndirectThreadedCode, SubroutineThreadedCode, TokenThreadedCode