Programlanabilir saqut derleyici projesi
Go to file
saqut 3d970331e2 docs: lisansa katkı, patent, marka ve fesih maddeleri ekle
- Katkı (§7): PR herkese açık, birleştirme kararı yalnızca Abdussamed
  ULUTAŞ'a ait; katkı sahipleri ticari lisanslama dâhil hakları telif
  sahibine verir (ticari lisans modelinin önünü açar)
- Patent (§8): açık patent lisansı + patent davasında otomatik fesih
- Marka/İsim (§9): "saQut" adı/markası üzerinde hak verilmez
- Fesih (§11): ihlalde otomatik fesih + 30 gün düzeltme; edinilmiş Çıktı
  hakları fesihten etkilenmez
- Bölümler yeniden numaralandırıldı (3 dilde)
2026-06-14 23:58:52 +03:00
build fix: kaynak dosya yolu propagasyonu ve AST JSON girinti hataları 2026-06-14 15:57:54 +03:00
docs docs: belgeleri yeniden hizala (IR+VM modeli, kilitli kararlar) 2026-06-14 19:53:12 +03:00
examples docs: belgeleri yeniden hizala (IR+VM modeli, kilitli kararlar) 2026-06-14 19:53:12 +03:00
scripts chore: Gitea issue yönetim betikleri ekle 2026-06-14 22:44:30 +03:00
src fix: kaynak dosya yolu propagasyonu ve AST JSON girinti hataları 2026-06-14 15:57:54 +03:00
.gitignore Rev 2026-05-26 00:00:21 +03:00
CMakeLists.txt Gemini 2026-05-27 10:29:30 +03:00
LICENSE.md docs: lisansa katkı, patent, marka ve fesih maddeleri ekle 2026-06-14 23:58:52 +03:00
readme.md docs: belgeleri yeniden hizala (IR+VM modeli, kilitli kararlar) 2026-06-14 19:53:12 +03:00

readme.md

saQut

Programlanabilir, incelenebilir bir derleyici — bir "alet çantası" (toolbox).

saQut'un asıl varlık sebebi dilin kendisinden çok, derleme sürecinin her aşamasının dışarıdan görülebilir ve müdahale edilebilir olmasıdır. Token'lar, AST, sembol tablosu, optimizasyonun öncesi/sonrası ve IR — hepsi ayrı ayrı incelenebilir. Dil, bu aletin üzerinde çalıştığı küçük, prosedürel bir örnektir; vitrin değil, alet.

Uygulama dili C++'tır (header-only eğilimli, bkz. docs/fikirler.md ADR-003).


Şu an ne çalışıyor, ne çalışmıyor

Belgeler planlanan ile yapılanı net ayırır. Bugünkü gerçek durum:

Çalışıyor (built)

  • Lexer — karakter seviyesi tarama, konum takibi.
  • Tokenizer — token üretimi (6 token tipi), yorum satırı desteği.
  • Pratt parser — ifade (Pratt) + statement (recursive descent) ayrıştırma.
  • AST — fonksiyon, blok, değişken tanımı, if/for/while/do-while/return, ifade node'ları.
  • AST'nin JSON serileştirmesisaqut ast ile incelenebilir.
  • CLI komut yapısıtokens, ast, symbols, run iskeletleri.
  • Kaynak konum takibi (SourceLocation) — offset → (satır, sütun).
  • Minimal IR deneyi — basit aritmetiği düşürür (örn. 1 + (7/3) → kısa doğrusal komut dizisi). Henüz tam bir backend değil, bir deneydir.

🚧 Henüz yok (planned)

  • Sembol tablosu
  • Semantik analiz
  • Tip sistemi
  • Diagnostic (hata raporlama) motoru
  • Optimizasyon
  • IR + bytecode VM ile çalıştırma

feature/frontend-analysis dalı şu an yalnızca bu yapılmamış işin tasarım belgelerini içerir, kodunu değil.

Birinci kilometre taşı ("bitti" tanımı): derleyici fibonacci'yi (recursive + iterative) ve basit matematik/döngü programlarını derleyip çalıştırabilmeli. Referans program: examples/fibonacci.sqt.


Dil kimliği (kilitli)

Prosedürel, C ailesi sözdizimi, value semantics. İlk ifade doğrudan bir işlem/tanım olabilir; zorunlu class/main boilerplate'i yoktur (Java'nın aksine).

Özellik Karar
Class / OOP / kalıtım Yok
Closure Yok
Generic Yok
Kullanıcıya açık pointer (* / &) Yok — derleyici/runtime içeride pointer'ı serbestçe kullanır
struct Var
Tipli fonksiyonlar (dönüş + parametre) Var
Array (int[]) Var
interface Ertelendi (v0 değil — gerekçe ADR-018)
auto / tip çıkarımı Yok
Gizli int↔float dönüşümü Yok (tek istisna: sabit folding)

Gerekçe: prosedürel tasarım semantik karmaşıklığı en aza indirir ve hedeflerle (fibonacci, matematik, sıralama, ayrıştırma) örtüşür. Standart C'de class yoktur (o C++'tır); C, struct + fonksiyonun yettiğini kanıtlar.


Çalıştırma modeli (kilitli): IR + bytecode VM

saQut, kendi IR'sine derler ve bu IR'yi bir yorumlayıcı döngü (bytecode VM) ile çalıştırır.

  • Tree-walker DEĞİL (çok yavaş).
  • Gerçek makine-kodu JIT DEĞİL. Makine kodu üretimi (register allocation, ABI/çağırma sözleşmeleri, çalıştırılabilir mmap bellek) kapsam dışıdır — tek faydası ham hızdır ve hız burada öncelik değildir. Öncelikler determinizm ve incelenebilirliktir; bytecode VM ikisini de doğrudan sağlar.
  • Bellek bu modelde kolaydır: host (C++) heap'i kullanılır; v0 için özel runtime allocator gerekmez.
  • C'ye transpile, geçerli bir İKİNCİ backend olarak ileride kalır (frontend backend-bağımsızdır — middle-end ayrımının amacı budur, ADR-006). İleride makine kodu istenirse elle code generator yazmak yerine libgccjit / LLVM'e bağlanılır — ama bu çok uzak gelecektir.

Eski belge/konuşmalarda geçen "JIT" terimi yanlış yönlendiricidir; doğru çerçeve IR + VM'dir.


Mimari hatlar

KAYNAK KOD
   │  lexer
   ▼
TOKEN'LAR ──────────────  saqut tokens
   │  parser (Pratt + recursive descent)
   ▼
AST ────────────────────  saqut ast
   │  sembol toplama (iki geçişli)        ┐
   ▼                                       │
SEMBOL TABLOSU ─────────  saqut symbols    │  FRONTEND
   │  semantik analiz (annotation)         │  (yapı + anlam)
   ▼                                       │
ANNOTATE EDİLMİŞ AST ───  saqut ast        ┘
   │  optimizasyon (opsiyonel, klon üstünde)   ── MIDDLE-END
   ▼
IR ─────────────────────  (planlanan)      ┐
   │  bytecode VM / yorumlayıcı döngü       │  BACKEND
   ▼                                        │  (çalıştırma + FFI seam)
ÇALIŞTIRMA / ÇIKTI ─────  saqut run        ┘
  • Frontend yapıyı ve anlamı modeller (tip, scope, dataflow).
  • "Hangi çekirdek, hangi cihaz, ne zaman, hangi çıktı formatı" runtime/backend meselesidir — frontend'e yüklenmez.

CLI (mevcut + planlanan)

# --- çalışıyor ---
saqut tokens   file:kaynak.sqt      # token listesi
saqut ast      file:kaynak.sqt      # AST (JSON)
saqut symbols  file:kaynak.sqt      # sembol tablosu (iskelet)

# --- planlanan ---
saqut run      file:kaynak.sqt      # IR üret + bytecode VM ile çalıştır
saqut ast      file:kaynak.sqt --optimized   # klon, optimize edilmiş AST (öncesi/sonrası)
saqut transpile file:kaynak.sqt -o prog.c    # ikinci backend (ileride)

Tasarım gereği her aşamanın çıktısı erken bir noktada dosyalanabilir/loglanabilir (programlanabilir derleyici). Token, ham AST, optimize AST ve IR ayrı ayrı kaydedilebilir.


Batteries / stdlib — kuzey yıldızı, ertelendi

Gerçek bir genel sürüm pil ile gelmeli (sıralama, sıkıştırma, kripto, JSON/XML/HTML ayrıştırma). Ama bu bugünün işi ve v0.1 değildir.

Mimari çerçeve (monolit korkusunu önler): derleyici pilleri çekirdeğine gömmez. Bunun yerine küçük bir gerçek builtin kümesi (print, temel zorunlular) + gerisi kütüphane/FFI ile gelir. "Batteries" sorunu aslında bir sınır (FFI/link seam) sorunudur, "zlib'i yeniden yaz" sorunu değil. Sınır bir kez çizilir, piller üstünde sonsuza dek birikir.

  • JSON/XML/HTML ayrıştırıcıları saQut'un kendisinde yazılabilir (string + struct + fonksiyon + kontrol akışı yeter). İlk gerçek demo programları.
  • Sıkıştırma/kripto: denenmiş C kütüphanelerine FFI ile bağlan. Kripto asla elle yazılmaz.
  • Bugüne tek yansıması: IR/runtime tasarlanırken bilinçli bir FFI seam ("host fonksiyonu çağır" deliği) bırakılır. print bunu zaten zorlar — bunu kaza değil, kasıtlı bir mekanizma yapıyoruz (ADR-016).

Belge haritası

Belge İçerik
docs/fikirler.md ADR-001…005: backend stratejisi, parser, header-only, token, IR
docs/adr-frontend-analiz.md ADR-006…019: frontend, analiz/optimizasyon, çalıştırma modeli, FFI, interface, bellek
docs/roadmap-frontend.md Faz-faz uygulama planı (sembol tablosu → fibonacci)
docs/transkript-frontend-tasarim.md Tasarım oturumunun transkripti
examples/fibonacci.sqt Geçerli referans program (semantik + kod üretimi fixture'ı)
examples/parser-stress/ Yalnızca parser'ı zorlayan, geçerli olmayan fixture'lar

İlke

Bir şey çalışmadan önce çerçeve inşa etmekten kaçın. Önce uçtan uca tek bir dikey dilim çalıştır (kaynak → IR → çalıştır; tamsayı aritmetiği + değişken + kontrol akışı + tek bir print). Modülerlik bir kuzey yıldızıdır, v0.1 gereksinimi değil; ihtiyaç doğmadan eklenen her soyutlama daha az değil, daha çok karmaşıklıktır.