Her derleyici makina kodu uretmez. Mesela Java derleyicisi soyut bir makina icin kod uretir. Bazi derleyiciler C kodu uretir (ilk haskell derleyicisi C dilinin bir alt kumesini uretiyordu).
Temelde derleyiciler ve yorumlayicilar ayni islemleri yaparlar.
Yazdigimiz kaynak kodu ilk olarak sozcuksel analize (lexing) girer. Bu islem sirasinda programlama dilinde tanimlanmis sozcukler (token,lexeme vb.) bulunur ve isaretlenir.
f(1+2) ---> Sozcuksel Analiz ----> (ID,f) (Parantez_Ac,( ) (Sayi,1) (Toplama,+) (Sayi,2) (Parantez_Kapa)
Bu Sozcukler dizisi daha sonra dilin grammerine gore ogelerine ayrilir (parsing). Bu noktada kaynak kodunda yazilan ifade dilde sentaks olarak gecerli bir ifade ise elimize bir soyut sentaks agaci (abstract syntax tree) gecer.
(ID,f) (Parantez_Ac,( ) (Sayi,1) (Toplama,+) (Sayi,2) (Parantez_Kapa)
|
|
Ogelere Ayirma
|
\|/
Fonksiyon_cagir
|
|
+----> f
|
|
+--------------> Fonksiyon Cagir
|
|
+--->Topla
|
|
+---> 1
|
|
+---->2
Bu agac uzerinde cesitli optimizasyonlar (agacin sekli degistirilir) yapilir ve/veya yazilan gecerliligi daha fazla kontrol edilebilir (mesela Haskell de bu agac uzerinde tip dogrulamasi yapilir). Yorumlayicilar bu agaci gezerek olarak degerlendirirken, derleyiciler bu soldan saga gezerek "makina" kodunu olustururlar.
Derleyicinin yigin temelli bir dil urettigi kod soyle gorunebilir.
2 1 Topla f Fonksiyon_cagir
Pythonda yazdigim turkce yigin temelli programlama dilinin C derleyecisini paylasacaktim ama karakter sinirindan paylasamadim.