Code generation
- C kursu
- Uzman
- Ders 16/47
- 5 dk
Code generation aşamasını öğrenirsin.
Kod üretimi (codegen)
Kod üretimi (codegen), AST'yi hedef dile çeviren aşamadır. Hedef, gerçek makine assembly'si, bytecode veya başka bir üst düzey dil olabilir.
Bu derste assembly benzeri bir ara dil üretiyoruz. emit fonksiyonu her AST düğümü için bir komut yazar. Örneğin sayı düğümü MOV, işleç düğümü ADD üretir. Kod üretimi ağacı postorder dolaşır: önce çocukların değerleri register'a yüklenir, sonra işleç uygulanır. Bu yöntem basit bir sanal makine üzerinde çalıştırılabilir. Üretilen kod kalıtesi hedef mimarisine göre değişir.
emit desenleri
Codegen genellikle bir emit fonksiyonu üzerinden yürür. Bu fonksiyon bir komut adı ve argümanlarını alır, biçimlendirilmiş satırı çıktıya yazar. Komut listesi hedef dile göre değişir.
Basit bir sanal makine için yeterli komutlar: MOV reg, value, ADD reg, reg, LOAD reg, addr, STORE addr, reg. Codegen postorder dolaşıp önce sol, sonra sağ çocuğu işler; sonra kök düğümün komutunu üretir. Register tahsisi karmaşıksa sınırlı sayıdaki register'i yığıtla yönetir. Bu derste yalnızca tek register varsayıyoruz; R0 tüm değerleri taşır.
Uygulama Assembly komutları üret
void emit(const char *instr, int arg) fonksiyonunu tanımla; gövdesi printf("%s %d\n", instr, arg); olsun. main içinde dört komut için çağır: ("MOV", 42), ("ADD", 7), ("STORE", 0), ("LOAD", 1).
Başlangıç kodu
#include <stdio.h>
// emit fonksiyonunu tanımla
// MOV, ADD, STORE, LOAD için çağır
int main(void) {
return 0;
}Örnek çözüm
#include <stdio.h>
void emit(const char *instr, int arg) {
printf("%s %d\n", instr, arg);
}
int main(void) {
emit("MOV", 42);
emit("ADD", 7);
emit("STORE", 0);
emit("LOAD", 1);
return 0;
}Beklenen çıktı
MOV 42 ADD 7 STORE 0 LOAD 1
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Codegen aşaması ne üretir?
- Token
- AST
- Sembol
- Hedef kod Doğru cevap
Açıklama: Codegen hedef dile yönelik kod yazar.
2 Düğüm türlerini komuta eşle
| Kavram | Anlamı |
|---|---|
num |
MOV |
binop |
ADD |
var |
LOAD |
assign |
STORE |
3 emit çağrısını tamamla
emit("MOV R0, #%d", ____);
emit("MOV R0, #%d", value);
Açıklama: emit MOV komutuna sayısal değer taşır.