Компилятор - это любая программа, которая преобразует программу из одного представления в другое представление. Это целевое представление может быть любым , при условии, что оно по крайней мере столь же вычислительно мощно, как и исходное представление. В частности, это означает, что если исходное представление является полным по Тьюрингу, целевое представление также должно быть полным по Тьюрингу.
Компилятор может компилировать из языка высокого уровня в другой язык высокого уровня (например, GWT, который компилирует Java в ECMAScript), из языка высокого уровня в язык низкого уровня (например, Gambit, который компилирует Scheme в C), от языка высокого уровня до машинного кода (например, GCJ, который компилирует Java в нативный код), от языка низкого уровня до языка высокого уровня (например, Clue, который компилирует C в Java, Lua, Perl, ECMAScript и Common Lisp), от низкоуровневого языка к другому низкоуровневому языку (например, Android SDK, который компилирует байт-код JVML в байт-код Dalvik), от низкоуровневого языка до машинного кода (например, компилятор C1X, который является частью HotSpot, который компилирует байт-код JVML в машинный код, машинный код в язык высокого уровня (любой так называемый «декомпилятор»), машинный код в язык низкого уровня (например, JIT-компилятор в JPC, который компилирует собственный код x86 в байт-код JVML) и нативный код в нативный код (например, JIT-компилятор в PearPC, который компилирует нативный код PowerPC для собственный код x86).