CodeBlanks Logo Icon CodeBlanks

Code generation

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

main.c
#include <stdio.h>

// emit fonksiyonunu tanımla
// MOV, ADD, STORE, LOAD için çağır

int main(void) {
    return 0;
}

Örnek çözüm

main.c
#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

Soru
emit("MOV R0, #%d", ____);
Cevap
emit("MOV R0, #%d", value);

Açıklama: emit MOV komutuna sayısal değer taşır.

Uzman bölümündeki tüm dersler