Programını yaz, sonra derleyicinin nasıl düşündüğünü izle. saQut, derleyicisi hiçbir şeyi saklamayan prosedürel bir dildir: kaynaktan çalışan koda kadar her adım çalıştırabileceğin, okuyabileceğin ve kendi araçlarına bağlayabileceğin bir komuttur.
Tipik bir derleyici yalnızca kaynak girdisini ve son çıktısını gösterir;
aradaki aşamalar gözlemlenemez. saQut her aşamayı, isimlendirilmiş ve makinece
okunabilir bir sonuç üreten ayrı bir komut olarak sunar:
Terminal window
saquttokenshello.sqt# token akışı (JSON)
saqutasthello.sqt# soyut sözdizim ağacı (JSON)
saqutsymbolshello.sqt# sembol tablosu (JSON)
saqutirhello.sqt# 3 adresli ara kod
saqutrunhello.sqt# derle ve çalıştır
Dil bilinçli olarak küçük ve C benzeri tutuldu. Amacı, incelenebilir işlem
zincirine derlenecek bir kaynak sağlamaktır.
Bytecode VM: referans çalışma ortamı. Programın basit komutlara
derlenir ve saQut içindeki bir döngü tarafından çalıştırılır. Diğer her
parça buna göre doğrulanır: aynı girdi, her seferinde aynı çıktı.
JIT derleyici (--jit): aynı komutları program başlarken doğrudan
makine koduna çevirir. Döngüler ve hesaplar çok daha hızlı çalışır. Deneysel
durumdadır ve VM ile birebir aynı çıktıyı vermek zorundadır.
Çöp toplayıcı (GC): hiçbir yerden erişilemeyen string, dizi ve struct’lar
(birbirini gösteren döngüler dahil) kendiliğinden serbest bırakılır. free
yazmazsın; --gc-stats neyin toplandığını gösterir.
LSP (Dil Sunucusu): editörlerin “tanıma git”, tip ipucu, yeniden
adlandırma ve anlık hata çizgileri için kullandığı protokol. saqut lsp bunu
doğrudan konuşur.
DAP (Hata Ayıklama Adaptörü): editörlerin kesme noktası ve adım adım
çalıştırma için kullandığı protokol. saqut dap ile programı durdurup
değişkenlerine bakabilirsin.
Yakalanabilir çalışma zamanı hataları: sıfıra bölme, dizi sınırı aşımı,
null erişimi ve yığın taşması, kodu, mesajı ve kaynak konumu olan ve catch
ile yakalanabilen bir hata üretir.
Modüller ve standart kütüphane: kodu import / export ile dosyalara
böl; dosyalara, yollara, metin kodlamaya, tarihe, terminale ve sürece fs,
path, utf8, date, sys gibi modüllerle ulaş.
Her şey makinece okunabilir: token, AST, sembol, IR ve tanılar JSON ya da
JSONL olarak çıkar; betikler ve CI derleyicinin ne gördüğünü okuyabilir.
Token, AST, sembol tablosu ve ara kodun her biri isimlendirilmiş ve
makinece okunabilir bir çıktıdır. saqut ast çıktısını kendi aracınıza
yönlendirin, optimize edilmiş ağacı karşılaştırın ya da yalnızca
saqut symbols çıktısından bir LSP kurun.
Prosedürel ve açık
C ailesi sözdizimi. Nesne yönelimi yok, jenerik tip yok, gizli tip
dönüşümü yok. int ile float karıştığında belirtilmiş tek bir kural
geçerli. Derleyici yazdığınız şeyi çalıştırır.
Değer ve referans, işaretçi yok
Temel tipler (int, float, bool, byte) kopyalanır. Bileşik tipler
(string, struct, array) referans ile paylaşılır. Programcının
görebileceği & veya * yoktur.
Nullable isteğe bağlıdır
Bir değer, siz T? olarak bildirmedikçe null olamaz. Tip
denetleyici, null olamaz bir değerin null olamayacağını kullanımdan önce
doğrular; bu yüzden çalışma zamanında null denetimi yapılmaz.
Belirlenimci sanal makine
Referans arka uç bir bytecode sanal makinesidir: aynı girdi her çalıştırmada
aynı çıktıyı üretir. LLVM bilinçli olarak kullanılmaz. Deneysel bir MIR JIT
–jit ile çalışır ve VM ile bayt bayt eşleşmek zorundadır;
sırada gömülü çalışma zamanlı AOT var.
Yakalanabilir hatalar
try / catch / throw ile struct tabanlı
hata yönetimi. Sınır aşımı, sıfıra bölme ve null referans hataları programı
sessizce sonlandırmak yerine yakalanabilir bir hata fırlatır.
37542b1 | Thread’ler önizleme olarak geliyor. thread { ... } hemen çalışan
bir thread başlatır ve sana join(), stop() ve running() çağırabileceğin
bir Thread verir. Her thread’in kendi heap’i, kendi çöp toplayıcısı ve
globallerin kendi kopyası vardır; thread’ler birbirinin nesnesine hiç dokunmaz.
VM referans backend’dir; JIT deneyseldir.
46f8c35 | Thread’ler arası veri için yeni shared globaller (int,
float, bool, Pool, List). Okuma/yazma atomiktir; +=, -=, ++, --
da atomiktir. Pool sınırlı ve bloklayan bir kuyruk, List yalnız sona
eklenen bir listedir; içlerine konan her değer derin kopyalanır.
46f8c35 | lock a, b; kilitleri sabit bir sırayla alır, bu yüzden iki kilit
birbirini kilitleyemez; blok bitince kilitler bırakılır. Derleyici kuralları
denetler (E014–E019), shared değişkende atomik olmayan x = x + 1 için
(W008) ve kilit içindeki bloklayan çağrılar için (W009) uyarır.
c5d2140 | Thread’ler VM’de ve deneysel JIT’te (0b8eded) çalışır;
örnekler ve kısa bir rehber docs/threading-guide.md içinde.
5fecf75 | print ve dosya yazımları kilit altında tek parça olarak
yazılır, farklı thread’lerin satırları birbirine karışmaz.
19b99aa | Hata ayıklayıcı thread’leri tanır: listeler, başlama/bitiş
olaylarını bildirir, durma noktasında tüm thread’leri durdurur, işçi
thread’in yığınını incelemene izin verir ve bir Shared kapsamı gösterir.
Debugger altındaki deadlock takılmak yerine raporlanır.
6578af2 | Thread kullanmayan programlar bunun için yaklaşık %0,10 öder
(donanım sayaçlarıyla ölçüldü).
72bd1ca | s[i], string’in i’nci karakterini (0 tabanlı, Unicode kod
noktası) tek karakterlik string olarak verir; VM’de ve JIT’te aynıdır.
String değiştirilemez olduğundan s[i] = ... derleme hatasıdır.
72bd1ca | Dizi indeksi artık null olmayan int, byte veya longint
olmalı. d["x"], d[1.5], d[true] ve int? eskiden kabul edilip yanlış
çalışıyordu; enum ile indekslemek artık as int ister.
72bd1ca | VM artık dizi indeksini 32 bite kesmiyor: d[4294967297]
eskiden d[1]’i okuyup yazıyordu, JIT ise doğru biçimde sınır dışı hatası
veriyordu. İki backend de aynı sonucu veriyor.
69913ef | 5 = 3;, 5 += 3; ve 5 &= 3; eskiden derleniyordu. Atamanın
sol tarafı artık değişken, struct alanı veya dizi elemanı olmalı (E027).
8ae879d | int a = 1 ? 2 : 3;, 7 ? 5 ve 5 ! 3 eskiden derlenip 0
basıyordu. Artık açık bir sözdizimi hatası (E901).
eb9937e | EOL adlı bir değişken artık programı sessizce kesmiyor.
835f42e | Her şeyi kapsayan E003 kesin kodlara bölündü. E003 artık
yalnız atama, argüman veya dönüş değerindeki tip uyuşmazlığıdır; gerisi
E020–E027 oldu (literal, operatör, nullable, as, switch, çağrı, metot
alıcısı, yazılabilir konum). Mesajlar değişmedi. Araçların eşleştirebileceği
kodlar docs/compiler-errors.md içinde.
46f6026 | Bir komut artık kabul etmediği seçeneği reddediyor
(saqut tokens a.sqt --jit eskiden 0 ile çıkıyordu). Eski file:, output:
ve ast: önekleri kalktı; düz yol kullanın.
360bad2 | saqut ast tüm modül grafiğini yükler; import içeren
programlar artık sahte E001/E007 vermez ve her birimi basar.
539885f | Tamamlama kapsam bilinçli ve bozuk kodda çalışıyor: a.b.c,
a[i], f(), enum adları ve Pool/List’in gerçek eleman tipini anlar;
yazarken son temiz ayrıştırmaya düşer.
962785e | Proje geneli indeks: referans bulma ve yeniden adlandırma
dosyalar arasında çalışır, workspace/symbol desteklenir, tamamlama henüz
import etmediğin export’ları önerir ve import’u senin yerine ekler.
3687e5c | Katlama, sembol ağacı, soluk gösterilen kullanılmayan kod, kod
eylemleri, kod mercekleri (“Referanslar: N”) ve parametre adı ipuçları.
28f42c8 | 200 dosyalık import zincirinde ilk proje indeksi 2,84 sn’den
38 ms’ye indi.
2ce7a11 | Hata dalgaları artık satırın tamamını değil ilgili token’ı
işaretler; yeniden adlandırma struct tiplerini ve alanlarını kapsar; durma
noktaları sonraki çalıştırılabilir satıra kayar, stepIn çağrıya girer ve
girişte durma main’in ilk satırından başlar.
a5f5b46 | VS Code eklentisi (1.0.1) shared, thread, lock, unlock,
wait, Pool, List ve Thread’i renklendirir ve thread snippet’leri getirir.
835f42e | Komut listesi, seçenek tablosu, tanı kodları, keyword tablosu,
built-in metot kuralları ve opcode sonuç tipleri artık elle senkron tutulan
birkaç kopya yerine tek bir yerde duruyor; yenisini eklemek tek dosyalık iş.
34c22b5 | Eskiden sessizce yanlış sonuçla çalışan programlar artık açık
bir hatayla duruyor: eksik operand (5 +), eksik ;, "\x41" gibi
bilinmeyen kaçışlar ve dilde olmayan >>> operatörü.
34c22b5 | Değer verilmeden bildirilen değişkenler her döngü turunda tipine
uygun sıfırla başlıyor; VM’de ve JIT’te aynı.
34c22b5 | % artık float ve double üzerinde çalışıyor; d *= k gibi
bileşik atamalar int sağ tarafı doğru genişletiyor.
34c22b5 | Sonsuz özyineleme askıda kalmak ya da çökmek yerine
yakalanabilir E_STACK_OVERFLOW veriyor; sınır --max-call-depth=N ile
ayarlanıyor.
34c22b5 | Null bir struct’ın alanına erişmek yakalanabilir E_NULL veriyor.
34c22b5 | Modüllerin kendi ad alanı var: özel adlar dosyalar arasında
çakışmıyor, import { x as y } kaynak dosyalarda çalışıyor ve standart
kütüphane importu yalnız onu yapan dosyada görünüyor.
34c22b5 | Bağlamsız ondalık literal, belgelendiği gibi double.
34c22b5 | CLI bilinmeyen seçenekleri ve fazladan argümanları yok saymak
yerine reddediyor; tüm çalışma zamanı mesajları İngilizce.
87068da | ** üs alma, önek ++x ve her sayısal tipte, dizi elemanında
ve struct alanında ++/--.
100979f | byte aritmetiği 8 bit içinde sarıyor; açık as byte dönüşümü
aralığı hâlâ denetliyor.
1f4a119 | Optimizasyon varsayılan olarak açık; --dont-optimize kapatıyor.
b33d569 | VM ve JIT tek bir çöp toplayıcıyı paylaşıyor.
2862123 | String’ler iki arka uçta da tek bir GC’li gösterim kullanıyor.
4ec9c2e | Çalışma zamanı değerleri 112 bayttan 40 bayta küçüldü.
0a0847d | JIT hata denetimini yalnız hata verebilen komutlardan sonra
yapıyor; saf hesaplama VM’e göre 57 kata kadar hızlandı.
c54b157 | JIT’te dizi okuma ve yazma, her paketli eleman tipinde
doğrudan bellek erişimi.
41efa5e | Yeni standart kütüphane modülleri: path, utf8, process,
stdin/stdout/stderr, os ve terminal.
651b04f | readFile, seek ve size ile dosyanın bir parçasını okuyabiliyor.
b7aa4d5 | Importlar yeniden adlandırılabiliyor: import { readFile as oku } from fs;.
24 Ağustos 2026 · 0.9.4 · Hatalar Artık Yakalanıyor
a08c756 | try / catch / throw artık JIT tarafında da çalışıyor:
VM ile aynı çıktı ve çıkış koduyla; sıfıra bölme, başarısız dönüşüm ve
dizi sınır aşımı gibi yakalanabilir çalışma zamanı hataları dahil.
(Planlanan setjmp/longjmp tasarımının bir JIT’te tanımsız davranış
olduğu ortaya çıktı; yerine talimat başına bekleyen-hata denetimi
getirildi ve try içermeyen fonksiyonlar hâlâ sıfır maliyet ödüyor.)
a68cad7 | JIT çöp toplayıcısında bir hata düzeltildi: tahsis yapan
özyinelemeli çağrılarda canlı bir nesne kullanılmaktayken süpürülüp
yeniden kullanılabiliyordu. Gölge-yığın çerçeveleri artık çağrı başına
düzgün geri sarılıyor.
2095564 | Daha önce “JIT’te bilinçli bozuk” işaretli altı test
programı artık VM ile bayt bayt eşleşmek zorunda; bu alanda parite
yeniden ve istisnasız zorunlu.
4568aac | Capability (izin) sistemi kaldırıldı (ADR-043): host
çağrıları varsayılan olarak açık ve dosya işlemleri JIT’te de aynı
şekilde çalışıyor.
5aeec2b | String indeksleme ve length() artık bayt değil Unicode
code point sayıyor.
1cea6bf | upper() ve lower() artık gerçek Unicode harf
dönüşümü yapıyor.
4bc1b2b | Dosya içerikleri uçtan uca byte[] olarak işlenebiliyor.
b2ed2f8 | 64-bit hex sabitleri longint olarak tam bit desenini
koruyor.
ec4174c | Init’siz string artık 0 yerine "" ile başlıyor; local
değişkenler, struct alanları ve globaller dahil.
b9f5c62 | Dizi tipli struct alanları artık boş diziyle başlıyor:
önce değer atamaya gerek olmadan record.items.push(x) çalışıyor.
690025b | Hiç değer atanmamış modül-düzeyi int?, string? veya
longint? artık gerçekten null okunuyor. Önce x == null slot
sessizce 0 tuttuğu için false yanıtı veriyordu.
2469bbf | Nullable değerle sıralama karşılaştırmaları (<, >,
<=, >=) artık aritmetikteki gibi derleme hatası: önce null kapısından
geçin (if (x != null) { x < 26 }). Eşitlik (==, !=) değişmedi.
74296d6 | Yerleşik metodu çağırmadan kullanmak (parantezsiz
s.length) artık sessizce 0 üretmek yerine derleme hatası.
dd8a493 | Modül kapsamında statement’lar (x = 5; gibi, herhangi
bir fonksiyonun dışında) artık C++’daki gibi net bir hatayla
reddediliyor; en üst düzey yalnızca bildirim kabul ediyor.
030f4bd | Fonksiyonu zorunlu argümanları olmadan çağırmak artık
derleme hatası; dil sunucusu da bu girdiyi zarifçe atlatıyor.
907d904 | JIT sıcak dizi erişimlerini doğrudan bellek işlemine
indiriyor ve derlenmiş kodu yeniden kullanıyor; dizi ağırlıklı
döngüler daha hızlı.
2645978 | Belgeler, dilde hiç var olmamış ?: üçlü operatörünü
artık varmış gibi tanıtmıyor.
2d6395c | --help artık standart bir kılavuz sayfası gibi okunuyor
ve uygulanmayan komutlar CLI’dan tamamen çıkarıldı.
ee102a3 | Kağıt üzerinde var olup hiç koşulmayan on beş hata
fixture’ı test koşucusuna bağlandı; sessiz hata sınıfları artık
yakalanıyor.
1 Ağustos 2026 · 0.9.2 · Kendini Ölçmeyi Öğreniyor
77e9276 | Parser artık eksik kapanış parantezi, köşeli parantez ya da
süslü parantez gibi 25 farklı sözdizimi hatasını açık ve net bir hata
mesajıyla bildiriyor.
a01f46e | run, check ve ir komutlarının hepsi artık aynı türden
bir hata için aynı çıkış kodunu (exit code) veriyor; hangi komutu
kullandığın sonucu değiştirmiyor.
c7d1d94 | exec komutu artık parser hatalarını gösteriyor.
fe90c0c | ast ve symbols komutları da parser hatalarını artık
exec ve run ile aynı şekilde raporluyor.
74e01a5 | saqut ir komutu artık her IR talimat türünü çıktıda
gösteriyor.
c43e830 | Bir fonksiyon açık bir return olmadan sona eriyorsa, saqut ir bu örtük dönüşü de artık gösteriyor.
b48e0cf | saqut ir çıktısındaki renkler artık yalnızca gerçek bir
terminalde basılıyor; çıktı bir dosyaya veya başka bir programa
yönlendirildiğinde renk kodları karışmıyor.
f7a32f9 | Bir switch ifadesinin tüm dalları return ediyorsa,
derleyici bunu artık doğru tespit ediyor.
54881c8 | Dizi olmayan bir değere [index] ile erişmek artık derleme
zamanında hata veriyor.
7f871b7 | VM ile JIT’in her sonuçta aynı şeyi ürettiğini otomatik
olarak doğrulayan bir test altyapısı kuruldu.
2f31cb2 | int32, longint64, float32 ve double64 artık VM’de ve
JIT’te birebir aynı sonucu veriyor.
16 Temmuz 2026 · 0.8.0 🏆 · Deneysel JIT’in İlk Nefesi
c3451f7 | sys modülü geldi: rastgele sayı üretme, ortam
değişkenlerini okuma, bekleme (sleep) ve komut satırı argümanlarına
erişim.
76c9bc6 | date tipi geldi: UTC zaman damgasını milisaniye cinsinden
tutuyor.
35790a2 | math::PI ve math::E sabitleri geldi.
5433cb3 | İzin (capability) sistemi geldi: --allow verilmezse tüm
capability’ler açık; verildiğinde --allow fs,net,sys açık whitelist olur.
1e0fbd3 | caps::drop ve caps::has geldi: çalışan bir program kendi
izinlerinden bilerek vazgeçebiliyor ya da hangi izinlere sahip olduğunu
sorgulayabiliyor.
04d90b5 | Bir blok içinde, dıştaki bir değişkeni aynı isimle
gölgeleyen yeni bir değişken tanımlandığında, derleyici artık doğru
değişkene erişiyor.
7c5d90a | Çöp toplayıcı (GC) artık bellek kullanımı belirli bir eşiği
aştığında kendiliğinden çalışıyor.
587bb57 | Yerleşik (builtin) fonksiyonların çağrılma şekli yenilendi:
artık deger.metod() gibi nokta ile çağrılabiliyor ve ad alanlarına
(namespace) ayrılıyor.
845588d | byte tipi geldi: 8-bit işaretsiz değer, 0-255.
025a667 | Hata ayıklama protokolü (DAP) baştan doğru şekilde yazıldı:
editörler artık bir saQut programını adım adım çalıştırıp
durdurabiliyor, değişkenleri inceleyebiliyor.
e4abc6f | Bir programı hata ayıklarken artık gerçekten
duraklatabiliyorsun; program dondurulmadan (non-blocking) bekletiliyor.
75e3dd1 | Adım adım çalıştırma (step) artık her komutu kapsıyor ve
duraklama tam olarak doğru satırda gerçekleşiyor.
d26575b | Editördeki otomatik tamamlama (code completion) daha
güvenilir hale getirildi.
11af652 | Editörden artık değişken/fonksiyon isimlerini güvenle
değiştirebiliyorsun (rename) ve bir fonksiyonu çağırırken parametre
ipuçlarını görebiliyorsun.
b9ca166 | İki modül birbirini dolaylı olarak import ederse (döngüsel
bağımlılık), derleyici bunu artık E_MODULE_CYCLE hatasıyla
bildiriyor.
11 Temmuz 2026 · 0.4.0 · Editör Artık İçeri Bakabiliyor
ad45bd5 | Editör desteğinin temelleri atıldı: sözdizimi vurgulama
(TextMate grameri), bir dil sunucusu (LSP) ve hata ayıklama protokolü
(DAP) iskeleti geldi.
b66226b | Dil sunucusu (LSP) artık bir dosyayı diske kaydetmeden,
editördeki anlık haliyle derleyebiliyor.
f3a7853 | Dil sunucusu artık dosya içindeki konumları (satır/sütun)
çok daha güvenilir hesaplıyor, çok dosyalı projelerde de doğru
çalışıyor.
934a903 | AST, sembol tablosu ve IR çıktılarına pastel renklendirme
eklendi.
6651a91 | Bir struct başka bir struct’ı alan olarak içeriyorsa,
değişken tanımlanır tanımlanmaz iç içe geçmiş tüm alanlar da otomatik
olarak hazırlanıyor.
d6dd530 | saqut bench komutu geldi.
585b8eb | İkinci bir çalıştırma arka ucu olarak MIR tabanlı bir JIT ve
gömülü çalışma zamanlı bir AOT derleyicisine karar verildi.
24 Haziran 2026 · 0.3.0 · Dil Parçalara Ayrılabiliyor