Secara klasik kompiler memiliki tiga bagian: analisis leksikal, parsing, dan pembuatan kode. Analisis leksikal memecah teks program menjadi kata kunci, nama, dan nilai bahasa. Parsing menggambarkan bagaimana token yang berasal dari analisis leksikal digabungkan dalam pernyataan sintaksis yang benar untuk bahasa. Pembuatan kode mengambil struktur data yang dihasilkan oleh parser, dan menerjemahkannya ke dalam kode mesin atau representasi lainnya. Saat ini analisis leksikal dan penguraian dapat digabungkan menjadi satu langkah.
Jelas orang yang menulis generator kode harus memahami kode mesin target pada level yang sangat dalam, termasuk set instruksi, jalur pipa prosesor, dan perilaku cache. Kalau tidak, program yang dihasilkan oleh kompiler akan lambat dan tidak efisien. Mereka sangat mungkin dapat membaca dan menulis kode mesin seperti diwakili oleh angka oktal atau heksadesimal, tetapi mereka umumnya akan menulis fungsi untuk menghasilkan kode mesin, merujuk secara internal ke tabel instruksi mesin. Secara teoritis orang-orang yang menulis lexer dan parser mungkin tidak tahu apa-apa tentang pembuatan kode mesin. Bahkan, beberapa kompiler modern memungkinkan Anda memasang rutinitas pembuatan kode sendiri yang mungkin memancarkan kode mesin untuk beberapa CPU yang belum pernah didengar oleh penulis lexer dan parser.
Namun, dalam praktiknya penulis kompiler pada setiap langkah tahu banyak tentang arsitektur prosesor yang berbeda, dan yang membantu mereka merancang struktur data langkah pembuatan kode akan diperlukan.