Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Derleme Süreci

BERK derleyicisi, kaynak kodunuzu native makine koduna dönüştüren çok aşamalı bir pipeline kullanır.

Derleme Aşamaları

1. Lexical Analysis (Lexer)

Kaynak kodu token'lara ayırır:

değişken x = 42
// Token'lar:
// [değişken] [x] [=] [42]

Lexer Görevleri:

  • Boşlukları ve yorumları temizler
  • Anahtar kelimeleri tanır (değişken, fonksiyon, eğer...)
  • Türkçe/İngilizce keyword mapping
  • Sayıları, stringleri, operatörleri ayırt eder

2. Syntax Analysis (Parser)

Token'ları Abstract Syntax Tree (AST) yapısına dönüştürür:

değişken x = 42 + 10

AST:
VariableDeclaration
  ├─ name: "x"
  └─ value: BinaryExpression
      ├─ left: Literal(42)
      ├─ operator: "+"
      └─ right: Literal(10)

Parser Görevleri:

  • Syntax kurallarını kontrol eder
  • Hiyerarşik yapı oluşturur
  • Syntax hatalarını tespit eder

3. Semantic Analysis

Kodun anlamsal doğruluğunu kontrol eder:

değişken x: sayı = "merhaba"  // ❌ Tip hatası!

Semantic Analyzer Görevleri:

  • Tip kontrolü (type checking)
  • Değişken tanımlılık kontrolü
  • Fonksiyon imza doğrulaması
  • Ownership ve lifetime analizi
  • Dead code detection

4. Intermediate Representation (IR)

AST'yi LLVM IR formatına çevirir:

define i32 @main() {
entry:
  %x = alloca i32
  store i32 42, i32* %x
  %0 = load i32, i32* %x
  ret i32 %0
}

LLVM IR Avantajları:

  • Platform bağımsız
  • Optimizasyona uygun
  • Çok sayıda backend desteği

5. Optimization

LLVM optimizer kodu hızlandırır:

  • Dead code elimination: Kullanılmayan kodu siler
  • Constant folding: 5 + 1015
  • Inlining: Küçük fonksiyonları çağrı yerine kopyalar
  • Loop unrolling: Döngü performansını artırır
  • Vectorization: SIMD instruction'ları kullanır

6. Code Generation

Optimize edilmiş IR'dan native assembly üretir:

main:
    push rbp
    mov rbp, rsp
    mov DWORD PTR [rbp-4], 42
    mov eax, DWORD PTR [rbp-4]
    pop rbp
    ret

7. Linking

Tüm object file'ları birleştirir ve çalıştırılabilir dosya oluşturur:

  • Static linking: Tüm kütüphaneler binary'ye dahil
  • Dynamic linking: Sistem kütüphanelerine bağlantı

Derleme Komutları

Basit Derleme

# Kaynak dosyayı derle
berk-lang build program.berk

# Çıktı dosyası belirt
berk-lang build program.berk -o program.exe

# Birden fazla dosya
berk-lang build main.berk lib.berk utils.berk

Derleme Modları

# Debug modu (varsayılan)
berk-lang build --debug program.berk

# Release modu (optimizasyonlu)
berk-lang build --release program.berk

# Profiling için
berk-lang build --profile program.berk

Ara Çıktılar

# AST yazdır
berk-lang build --print-ast program.berk

# Tip bilgilerini göster
berk-lang build --print-types program.berk

# LLVM IR oluştur
berk-lang build --emit-llvm program.berk -o program.ll

# Assembly oluştur
berk-lang build --emit-asm program.berk -o program.s

# Object file oluştur
berk-lang build --emit-obj program.berk -o program.o

Derleme Süresi Optimizasyonu

Incremental Compilation

Sadece değişen modülleri yeniden derler:

# İlk derleme: 10 saniye
berk-lang build main.berk

# Tek bir dosya değişti: 0.5 saniye
berk-lang build main.berk

Cache Mekanizması:

  • .berk-cache/ dizininde intermediate file'lar saklanır
  • Dosya değişmediyse cache'ten kullanılır
  • Bağımlılık değişirse ilgili modüller yeniden derlenir

Paralel Derleme

# Tüm CPU çekirdeklerini kullan
berk-lang build --parallel program.berk

# Belirli sayıda thread
berk-lang build --jobs=4 program.berk

Hata Mesajları

BERK derleyicisi anlaşılır hata mesajları verir:

error[E0308]: tip uyuşmazlığı
  --> src/main.berk:5:14
   |
 5 |     değişken x: sayı = "merhaba";
   |              ^^^^      ^^^^^^^^^ beklenen: sayı, bulunan: metin
   |
   = yardım: "merhaba" string'ini sayıya çevirmek için `metin::sayıya()` kullanın

Hata Mesajı Özellikleri:

  • Hata kodu (E0308)
  • Dosya ve satır numarası
  • Kod snippet'i
  • Açıklama ve öneriler
  • Renkli çıktı (terminal destekliyorsa)

Derleme Performansı

Proje Boyutuİlk DerlemeIncrementalParalel (8 core)
1,000 satır~0.2s~0.05s~0.15s
10,000 satır~1s~0.1s~0.4s
100,000 satır~8s~0.5s~2s
1,000,000 satır~80s~5s~20s

Derleme Bayrakları

Genel Bayraklar

# Verbose çıktı
berk-lang build -v program.berk

# Uyarıları göster
berk-lang build --warnings program.berk

# Uyarıları hata say
berk-lang build --warnings-as-errors program.berk

# Bağımlılık grafiği göster
berk-lang build --show-deps program.berk

# İstatistikler
berk-lang build --stats program.berk

Debug Bayrakları

# Debug sembolleri ekle
berk-lang build -g program.berk

# Debug bilgisi seviyesi
berk-lang build --debug-info=2 program.berk

# Assertion'ları aktif et
berk-lang build --enable-assertions program.berk

Build System Entegrasyonu

Make

build:
    berk-lang build main.berk -o program.exe

release:
    berk-lang build --release main.berk -o program.exe

clean:
    rm -rf .berk-cache/ program.exe

CMake

add_custom_command(
    OUTPUT program.exe
    COMMAND berk-lang build ${CMAKE_SOURCE_DIR}/main.berk -o program.exe
    DEPENDS main.berk
)

Özet

  • 7 aşamalı pipeline: Lexer → Parser → Semantic → IR → Optimize → Codegen → Link
  • LLVM backend: Platform bağımsız, optimize edilmiş native kod
  • Incremental compilation: Hızlı yeniden derleme
  • Paralel derleme: Çok çekirdekli işlemci desteği
  • Anlaşılır hatalar: Detaylı hata mesajları ve öneriler
  • Hızlı derleme: 10K satır ~1 saniye