Классически компилятор состоит из трех частей: лексического анализа, анализа и генерации кода. Лексический анализ разбивает текст программы на ключевые слова, имена и значения языка. Анализирует, как токены, полученные из лексического анализа, объединяются в синтаксически правильные выражения для языка. Генерация кода берет структуры данных, созданные синтаксическим анализатором, и переводит их в машинный код или другое представление. В настоящее время лексический анализ и анализ могут быть объединены в один шаг.
Очевидно, что человек, пишущий генератор кода, должен понимать целевой машинный код на очень глубоком уровне, включая наборы команд, конвейеры процессора и поведение кэша. В противном случае программы, созданные компилятором, будут медленными и неэффективными. Они вполне могут читать и писать машинный код, представленный восьмеричными или шестнадцатеричными числами, но обычно они пишут функции для генерации машинного кода, ссылаясь внутренне на таблицы машинных инструкций. Теоретически, люди, пишущие лексер и парсер, могут ничего не знать о генерации машинного кода. Фактически, некоторые современные компиляторы позволяют вам подключать свои собственные процедуры генерации кода, которые могут генерировать машинный код для некоторого процессора, о котором никогда не слышали авторы лексера и анализатора.
Однако на практике разработчики компиляторов на каждом этапе много знают о различных архитектурах процессоров, и это помогает им спроектировать структуры данных, необходимые для этапа генерации кода.