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 + 10→15 - 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 Derleme | Incremental | Paralel (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