Achieving good performance in bytecoded language interpreters is di cult without sacri cing both simplicity and portability. This is due to the complexity of dynamic translation (\just-in-time compilation") of bytecodes into native code, which is the mechanism employed universally by highperformance interpreters. We demonstrate that a few simple techniques make it possible to create highly-portable dynamic translators that can attain as much as 70% the performance of optimized C for certain numerical computations. Translators based on such techniques can o er respectable performance without sacri cing either the simplicity or portability of much slower \pure" bytecode interpreters.