Tonyukuk Belgeleri

Türkçe sözdizimi ile derlenen programlama dili — tam referans.

Kurulum

Tonyukuk derleyicisini kurmak için aşağıdaki adımları izleyin.

Gereksinimler

Linux’ta Derleme

# Gerekli paketleri yükleyin (Debian/Ubuntu)
$ sudo apt update
$ sudo apt install gcc make llvm-17-dev lld-17 wabt

# Kaynak kodu indirin
$ git clone https://github.com/tonyukuk/tonyukuk.git
$ cd tonyukuk

# Derleyin
$ make

# Sisteme kurun (isteğe bağlı)
$ sudo make install

Kurulumdan sonra tonyukuk-derle komutu terminalde kullanılabilir olacaktır.

VS Code Eklentisi

Tonyukuk, VS Code için bir eklenti sunar. Eklenti sözdizimi renklendirme, otomatik tamamlama ve hata gösterimi sağlar.

  1. VS Code’u açın ve Eklentiler (Extensions) panelini açın (Ctrl+Shift+X)
  2. “Tonyukuk” aratın ve eklentiyi yükleyin
  3. Eklenti otomatik olarak .tr dosyalarını tanıyacak ve renklendirme yapacaktır
İpucu: Eklenti, arka planda Tonyukuk LSP sunucusunu (tonyukuk-lsp) kullanır. LSP sunucusu kuruluysa otomatik tamamlama ve anlık hata tespiti de etkinleşir.

İlk Program

Her programlama dilinin geleneği olduğu gibi, ilk programımız ekrana “Merhaba Dünya!” yazdıracak.

1. Dosya Oluşturma

Favori metin düzenleyicinizi açın ve merhaba.tr adında yeni bir dosya oluşturun:

# merhaba.tr
yazdır("Merhaba Dünya!")

2. Derleme ve Çalıştırma

# Kaynak kodu derle
$ tonyukuk-derle merhaba.tr -o merhaba

# Çalıştır
$ ./merhaba
Merhaba Dünya!

3. Ne Oldu?

İpucu: LLVM backend ile derlemek için --backend=llvm bayrağını ekleyin. JIT modu ile dosya üretmeden doğrudan çalıştırmak için --jit kullanın:
tonyukuk-derle --backend=llvm --jit merhaba.tr

Temel Kavramlar

Bu bölümde Tonyukuk programlama dilinin temel yapı taşlarını öğreneceksiniz.

Değişkenler ve Veri Tipleri

Tonyukuk’ta beş temel veri tipi vardır:

# Tamsayı (tam)
tam yas = 25

# Ondalık sayı (ondalık)
ondalık sicaklik = 36.6

# Metin (metin)
metin isim = "Tonyukuk"

# Mantıksal (mantık)
mantık aktif = doğru

# Tip çıkarımlı değişken
değişken sayi = 42        # derleyici tipi otomatik çıkarır
sabit PI = 3.14159        # değiştirilemez sabit

Fonksiyonlar (İşlevler)

Fonksiyonlar işlev anahtar kelimesi ile tanımlanır ve son ile biter:

işlev selamla(isim: metin) -> metin
    döndür "Merhaba, " + isim + "!"
son

yazdır(selamla("Dünya"))  # Merhaba, Dünya!

# Birden fazla parametre ve tamsayı dönüşü
işlev topla(a: tam, b: tam) -> tam
    döndür a + b
son

yazdır(topla(3, 5))  # 8

Kontrol Akışı

Koşullar eğer/yoksa, döngüler döngü ve iken anahtar kelimeleri ile yazılır:

# Koşullu ifade
tam puan = 85

eğer puan >= 90 ise
    yazdır("Pekiyi")
yoksa eğer puan >= 70 ise
    yazdır("İyi")
yoksa
    yazdır("Geliştirmeli")
son

# Sayma döngüsü
döngü i = 1, 5 ise
    yazdır(i)
son

# Koşullu döngü
tam sayac = 10
iken sayac > 0 ise
    yazdır(sayac)
    sayac -= 1
son

Mini Proje: Basit Hesap Makinesi

Öğrendiğimiz kavramları birleştirerek basit bir hesap makinesi yazalım. Bu program kullanıcıdan iki sayı ve bir işlem alarak sonuç hesaplar.

# hesap_makinesi.tr — Basit hesap makinesi
kullan sistem

işlev hesapla(a: tam, b: tam, islem: metin) -> tam
    eğer islem == "topla" ise
        döndür a + b
    son
    eğer islem == "cikar" ise
        döndür a - b
    son
    eğer islem == "carp" ise
        döndür a * b
    son
    eğer islem == "bol" ise
        eğer b == 0 ise
            yazdır("Hata: Sıfıra bölünemez!")
            döndür 0
        son
        döndür a / b
    son
    yazdır("Bilinmeyen işlem!")
    döndür 0
son

# Kullanım örnekleri
yazdır(hesapla(10, 5, "topla"))   # 15
yazdır(hesapla(10, 5, "cikar"))   # 5
yazdır(hesapla(10, 5, "carp"))    # 50
yazdır(hesapla(10, 5, "bol"))     # 2
# Derleme ve çalıştırma
$ tonyukuk-derle hesap_makinesi.tr -o hesap
$ ./hesap
15
5
50
2
Sonraki Adımlar: Temel kavramları öğrendiniz. Şimdi aşağıdaki bölümlerde sınıflar, modüller, hata yönetimi ve daha fazlasını keşfedebilirsiniz. Ayrıca çevrimiçi playground’da kod yazarak pratik yapabilirsiniz.

Giriş

Tonyukuk, tamamen Türkçe anahtar kelimeler ve fonksiyon isimleri kullanan, x86-64, ARM64 ve WebAssembly hedeflerine derlenen bir programlama dilidir.

Derleyici C11 ile yazılmıştır. Dört backend sunar:

Ayrıca çevrimiçi playground sayesinde tarayıcınızdan kod yazıp anında çalıştırabilirsiniz. WASM modu ile derlenen kod tarayıcınızda yerel olarak çalışır.

İlk Program

# merhaba.tr
yazdır("Merhaba Dünya!")

Derleme ve çalıştırma:

$ tonyukuk-derle merhaba.tr -o merhaba
$ ./merhaba
Merhaba Dünya!

Veri Tipleri

TipAçıklamaÖrnek
tam64-bit işaretli tamsayı42, -7
ondalık64-bit kayan nokta (double)3.14, -0.5
metinUTF-8 karakter dizisi"Merhaba"
mantıkBooleandoğru, yanlış
diziDinamik dizi[1, 2, 3]
kümeKüme (set)küme_yeni()
boşBoş/null değerboş

Değişkenler

# Tip belirterek
tam sayi = 42
ondalık pi = 3.14
metin ad = "Tonyukuk"
mantık aktif = doğru

# Tip çıkarımlı
değişken x = 10
sabit PI = 3.14159

Operatörler

Aritmetik

+ - * / % — Toplama, çıkarma, çarpma, bölme, mod

Karşılaştırma

== != < > <= >=

Mantıksal

ve veya değil

Bit Düzeyi

& | ^ ~ << >>

Atama

= += -= *= /= %= := (walrus)

Özel

|> pipe, .. aralık, ... spread/rest, ?? null birleşim

Koşul: eğer / yoksa

eğer x > 0 ise
    yazdır("Pozitif")
yoksa
    yazdır("Negatif veya sıfır")
son

Döngü

Sayma döngüsü

döngü i = 0, 10 ise
    yazdır(i)
son

Koşullu döngü (iken)

iken x > 0 ise
    x -= 1
son

Her/için (foreach)

her eleman için dizi ise
    yazdır(eleman)
son

kır ile döngüden çıkılır, devam ile sonraki iterasyona geçilir.

Eşle / Durum (Switch)

eşle puan / 10 ise
    durum 9:
        yazdır("Pekiyi")
    durum 8:
        yazdır("İyi")
    varsayılan:
        yazdır("Diğer")
son

İşlev Tanımı

işlev topla(a: tam, b: tam) -> tam
    döndür a + b
son

# Rekürsif
işlev faktöriyel(n: tam) -> tam
    eğer n <= 1 ise
        döndür 1
    son
    döndür n * faktöriyel(n - 1)
son

Lambda ve Closure

# Lambda ifadesi
değişken kare = işlev(x: tam) -> tam
    döndür x * x
son

yazdır(kare(5))  # 25

Sınıflar

sınıf Nokta
    tam x
    tam y

    işlev mesafe() -> tam
        döndür bu.x * bu.x + bu.y * bu.y
    son
son

Nokta p = Nokta(3, 4)
yazdır(p.mesafe())  # 25

Kalıtım

sınıf Hayvan
    metin isim
    işlev tanıt() -> metin
        döndür bu.isim
    son
son

sınıf Kedi : Hayvan
    işlev miyavla() -> metin
        döndür "Miyav!"
    son
son

Arayüz

arayüz Cizim
    çiz() -> tam
son

sınıf Kare uygula Cizim
    işlev çiz() -> tam
        döndür 1
    son
son

Hata Yönetimi

dene
    fırlat "Bir hata oluştu!"
yakala hata
    yazdır(hata)
son

fırlat ile hata fırlatılır, dene/yakala ile yakalanır. sonunda bloğu isteğe bağlıdır.

Modüller

Modüller kullan anahtar kelimesi ile içe aktarılır:

kullan matematik
kullan zaman

yazdır(sin(pi() / 2))
yazdır(yıl())

matematik

Trigonometri, logaritma, matris, istatistik ve sayı teorisi fonksiyonları.

Temel

FonksiyonDönüşAçıklama
mutlak(x: tam)tamMutlak değer
kuvvet(x: tam, y: tam)tamÜs alma (tamsayı)
karekök(x: ondalık)ondalıkKarekök
min(x: tam, y: tam)tamMinimum
maks(x: tam, y: tam)tamMaksimum
mod(x: tam, y: tam)tamModülo
işaret(x: tam)tamİşaret (-1, 0, 1)
rastgele(maks: tam)tam0..maks arası rastgele
pi()ondalıkPi sabiti
e()ondalıkEuler sabiti

Trigonometri

FonksiyonDönüşAçıklama
sin(x), cos(x), tan(x)ondalıkTemel trig.
asin(x), acos(x), atan(x)ondalıkTers trig.
atan2(y, x)ondalık2 argümanlı atan
sinh(x), cosh(x), tanh(x)ondalıkHiperbolik

Logaritma ve Üstel

FonksiyonDönüşAçıklama
log(x)ondalıkDoğal logaritma
log10(x), log2(x)ondalıkLog tabanı 10/2
üstel(x)ondalıke^x
üst(x, y)ondalıkx^y (ondalık)
küpkök(x)ondalıkKüpkök
hipot(x, y)ondalıkHipotanüs

Yuvarlama

FonksiyonAçıklama
taban(x)Aşağı yuvarlama (floor)
tavan(x)Yukarı yuvarlama (ceiling)
yuvarla(x)En yakına yuvarlama (round)
buda(x)Kesme (truncate)

Tamsayı Fonksiyonları

FonksiyonAçıklama
faktöriyel(n)n!
obeb(a, b)OBEB (GCD)
okek(a, b)OKEK (LCM)
kombinasyon(n, k)C(n, k)
permütasyon(n, k)P(n, k)

İstatistik

FonksiyonAçıklama
toplam(d: dizi)Toplam
ortalama(d: dizi)Aritmetik ortalama
medyan(d: dizi)Medyan
varyans(d: dizi)Varyans
std_sapma(d: dizi)Standart sapma
en_küçük(d: dizi)Minimum eleman
en_büyük(d: dizi)Maksimum eleman
korelasyon(x, y)Korelasyon katsayısı

Matris

FonksiyonAçıklama
matris(satır, sütun)Sıfır matris oluştur
matris_birim(n)Birim matris
matris_topla(a, b)Matris toplama
matris_çıkar(a, b)Matris çıkarma
matris_çarp(a, b)Matris çarpma
matris_skaler(a, k)Skaler çarpım
matris_transpoz(a)Transpoz
matris_determinant(a)Determinant
matris_ters(a)Ters matris
matris_oku(m, i, j)Eleman oku
matris_yaz(m, i, j, v)Eleman yaz
matris_iz(a)İz (trace)

Polinom ve Nümerik

FonksiyonAçıklama
polinom_hesapla(k, x)Polinom değer hesapla
polinom_türev(k)Türev katsayıları
polinom_integral(k)İntegral katsayıları
sayısal_integral(x, y)Trapez yöntemi
lineer_regresyon(x, y)Doğrusal regresyon

Doğrulama

FonksiyonAçıklama
sonsuz_mu(x)Sonsuz mu?
sayidegil_mi(x)NaN mı?

metin

Metin (string) işleme fonksiyonları.

FonksiyonDönüşAçıklama
büyük_harf(m)metinTümünü büyük harfe çevir
küçük_harf(m)metinTümünü küçük harfe çevir
harf_buyut(m)metinBüyük harfe çevir (inline)
harf_kucult(m)metinKüçük harfe çevir (inline)
kes(m, baş, uzunluk)metinAlt metin çıkar
bul(m, aranan)tamİlk indeks (-1 = bulunamadı)
içerir(m, aranan)mantıkİçeriyor mu?
kırp(m)metinBaş/son boşlukları sil
tersle(m)metinMetni ters çevir
tekrarla(m, kez)metinMetin tekrarlama
başlar_mi(m, önek)mantıkÖnekle mi başlıyor?
biter_mi(m, sonek)mantıkSonekle mi bitiyor?
değiştir(m, eski, yeni)metinDeğiştir
böl(m, ayırıcı)diziBöl
birleştir_metin(d, ayırıcı)metinBirleştir (join)
dosya_satırlar(dosya)diziDosya satırlarını oku
dosya_ekle(dosya, içerik)tamDosyaya ekle (append)

Sözlük fonksiyonları da bu modülle gelir:

FonksiyonAçıklama
sözlük_yeni()Yeni sözlük oluştur
sözlük_ekle(s, anahtar, değer)Eleman ekle
sözlük_oku(s, anahtar)Eleman oku
sözlük_uzunluk(s)Uzunluk
sözlük_var_mı(s, anahtar)Anahtar var mı?
sözlük_sil(s, anahtar)Anahtar sil

dizi

Dizi (array) işlemleri.

FonksiyonAçıklama
sırala(d)Küçükten büyüğe sırala
ekle(d, eleman)Sona eleman ekle
çıkar(d)Son elemanı çıkar
birleştir(d1, d2)İki diziyi birleştir

sistem

Dosya I/O ve tip dönüşüm fonksiyonları.

FonksiyonDönüşAçıklama
satiroku()metinKonsoldan satır oku
dosya_oku(yol)metinDosya içeriği oku
dosya_yaz(yol, içerik)tamDosyaya yaz
tam_metin(s)metinTamsayıyı metne çevir
ondalık_metin(s)metinOndalığı metne çevir
metin_tam(m)tamMetni tamsayıya çevir
metin_ondalık(m)ondalıkMetni ondalığa çevir

zaman

FonksiyonDönüşAçıklama
şimdi()tamUnix zaman damgası
yıl()tamYıl
ay()tamAy (1-12)
gün()tamGün (1-31)
saat()tamSaat (0-23)
dakika()tamDakika (0-59)
saniye()tamSaniye (0-59)
tarih_metin()metinTarih/saat dizisi

json

FonksiyonDönüşAçıklama
json_çözümle(m)tamJSON metnini sözlüğe çözümle
json_oluştur(s)metinSözlüğü JSON metnine dönüştür

kripto

FonksiyonDönüşAçıklama
md5(m)metinMD5 özütü
sha256(m)metinSHA-256 özütü
base64_kodla(m)metinBase64 kodla
base64_çöz(m)metinBase64 çöz

FonksiyonDönüşAçıklama
http_al(url)metinHTTP GET isteği
http_gönder(url, veri)metinHTTP POST isteği

düzeni (regex)

FonksiyonDönüşAçıklama
eşleşir_mi(metin, desen)mantıkRegex eşleşiyor mu?
eşleşme_bul(metin, desen)metinİlk eşleşme
tüm_eşleşmeler(metin, desen)diziTüm eşleşmeler

paralel

FonksiyonDönüşAçıklama
iş_oluştur(fn)tamYeni iş parçacığı oluştur
iş_bekle(handle)tamİş parçacığını bekle
kilit_oluştur()tamMutex oluştur
kilitle(kilit)Kilitle
kilit_bırak(kilit)Kilidi bırak

soket

FonksiyonDönüşAçıklama
soket_oluştur()tamTCP soket oluştur
soket_bağlan(fd, adres, port)mantıkSunucuya bağlan
soket_dinle(port)tamPortta dinle
soket_kabul(fd)tamBağlantı kabul et
soket_gönder(fd, veri)tamVeri gönder
soket_al(fd)metinVeri al
soket_kapat(fd)Soketi kapat

küme

FonksiyonDönüşAçıklama
küme_yeni()tamBoş küme oluştur
küme_ekle(kume, değer)Eleman ekle
küme_sil(kume, değer)Eleman sil
küme_var_mı(kume, değer)mantıkEleman var mı?
küme_uzunluk(kume)tamEleman sayısı
küme_birleşim(a, b)tamBirleşim kümesi
küme_kesişim(a, b)tamKesişim kümesi
küme_fark(a, b)tamFark kümesi
küme_yazdır(kume)Kümeyi yazdır

veritabanı

FonksiyonDönüşAçıklama
vt_aç(yol)tamSQLite veritabanı aç
vt_çalıştır(db, sql)tamSQL komutu çalıştır
vt_sorgula(db, sql)metinSQL sorgusu çalıştır
vt_kapat(db)Veritabanını kapat

ortam

FonksiyonDönüşAçıklama
ortam_al(anahtar)metinÇevre değişkeni oku
ortam_koy(anahtar, değer)Çevre değişkeni yaz
ortam_sil(anahtar)Çevre değişkeni sil
ortam_hepsi()diziTüm çevre değişkenleri

argüman

FonksiyonDönüşAçıklama
argüman_sayısı()tamArgüman sayısı
argüman_al(indeks)metinArgümanı al
argüman_hepsi()diziTüm argümanlar

tekrarlayıcı

FonksiyonDönüşAçıklama
zincir(d1, d2)diziİki diziyi zincirle
tekrarla_dizi(d, kez)diziDiziyi kez kere tekrarla
parçala(d, boyut)diziDiziyi parçalara böl
permütasyonlar(d)diziPermütasyonlar
kombinasyonlar(d, r)diziKombinasyonlar
düz(d)diziİç içe diziyi düzleştir

çekirdek (otomatik yüklü)

Bu fonksiyonlar kullan gerektirmeden her zaman kullanılabilir.

FonksiyonDönüşAçıklama
yazdır(değer)Konsola yazdır
uzunluk(d: dizi)tamDizi uzunluğu
metin_uzunluk(m: metin)tamMetin uzunluğu
eşlem(d, fn)diziMap: her elemana uygula
filtre(d, fn)diziKoşula uyanları tut
indirge(d, fn, başlangıç)tamSola katlama (reduce)
biçimle(format, değer)metinBiçimlendirilmiş metin
numarala(d)diziEnumerate: [indeks, değer]
eşleştir(d1, d2)diziZip: [a, b] çiftleri
ters(d)diziDiziyi ters çevir
dilimle(d, baş, bitiş)diziDilim (slice)
doğrula(koşul)Test assertion

donanım

Gömülü sistemler (Arduino, ESP32, Raspberry Pi Pico) için donanım soyutlama modülü. GPIO, PWM, ADC, I2C, SPI, UART ve zamanlama fonksiyonları sunar.

kullan donanım

GPIO (Genel Amaçlı Giriş/Çıkış)

FonksiyonDönüşAçıklama
pin_modu(pin: tam, mod: tam)Pin modunu ayarla: GIRIS=0, CIKIS=1, GIRIS_PULLUP=2
dijital_yaz(pin: tam, deger: tam)Pin’e dijital değer yaz: DUSUK=0, YUKSEK=1
dijital_oku(pin: tam)tamPin’den dijital değer oku (0 veya 1)
analog_oku(pin: tam)tamAnalog değer oku (0-1023 arası, 10-bit ADC)

PWM (Darbe Genişlik Modülasyonu)

FonksiyonDönüşAçıklama
pwm_baslat(pin: tam)PWM kanalını başlat
pwm_yaz(pin: tam, deger: tam)PWM duty cycle yaz (0-255)

I2C / SPI

FonksiyonDönüşAçıklama
i2c_baslat(hiz: tam)I2C başlat (100=100kHz, 400=400kHz)
i2c_yaz(adres: tam, veri: tam)tamI2C cihazına veri yaz, başarı için 0 döndürür
i2c_oku(adres: tam)tamI2C cihazından veri oku
spi_baslat(hiz: tam)SPI başlat (hız kHz cinsinden)
spi_aktar(veri: tam)tamSPI üzerinden veri gönder ve al (full-duplex)

UART (Seri Port)

FonksiyonDönüşAçıklama
seri_baslat(baud: tam)Seri portu başlat (örn: 9600, 115200)
seri_yaz(metin: metin)Seri porta metin yaz
seri_oku()tamSeri porttan bir byte oku (bloke eder)
seri_hazir_mi()tamOkunacak veri var mı kontrol et

Zamanlama ve Kesme

FonksiyonDönüşAçıklama
bekle_ms(ms: tam)Belirtilen milisaniye kadar bekle
bekle_us(us: tam)Belirtilen mikrosaniye kadar bekle
milis()tamProgram başlangıcından bu yana geçen milisaniye
mikros()tamProgram başlangıcından bu yana geçen mikrosaniye
kesme_ac()Global kesmeleri etkinleştir
kesme_kapat()Global kesmeleri devre dışı bırak

Örnek: LED Yakıp Söndürme

kullan donanım

# LED pin 13’e bağlı
pin_modu(13, 1)  # CIKIS modu

iken doğru ise
    dijital_yaz(13, 1)  # LED aç
    bekle_ms(1000)
    dijital_yaz(13, 0)  # LED kapat
    bekle_ms(1000)
son

dosya

Kapsamlı dosya sistemi işlemleri: okuma, yazma, dizin yönetimi, yol işlemleri ve daha fazlası.

kullan dosya

Okuma / Yazma

FonksiyonDönüşAçıklama
dosya.oku(yol: metin)metinDosyanın tüm içeriğini okur
dosya.yaz(yol: metin, icerik: metin)tamDosyaya yazar (üzerine yazar), başarıda 0 döndürür
dosya.ekle(yol: metin, icerik: metin)tamDosya sonuna ekler
dosya.satirlar(yol: metin)diziDosyayı satır satır okur

Varlık Kontrolleri

FonksiyonDönüşAçıklama
dosya.var_mi(yol: metin)mantıkDosya/dizin var mı kontrol eder
dosya.dizin_mi(yol: metin)mantıkYolun bir dizin olup olmadığını kontrol eder
dosya.dosya_mi(yol: metin)mantıkYolun bir dosya olup olmadığını kontrol eder
dosya.okunabilir_mi(yol: metin)mantıkDosya okunabilir mi?
dosya.yazilabilir_mi(yol: metin)mantıkDosya yazılabilir mi?

Dizin İşlemleri

FonksiyonDönüşAçıklama
dosya.klasör_oluştur(yol: metin)tamTek seviye dizin oluşturur
dosya.klasör_oluştur_hepsi(yol: metin)tamTüm ara dizinleri oluşturur (mkdir -p gibi)
dosya.listele(yol: metin)diziDizindeki dosya ve klasörleri listeler
dosya.alt_dizinler(yol: metin)diziSadece alt dizinleri listeler
dosya.dosyalar(yol: metin)diziSadece dosyaları listeler

Silme / Taşıma / Kopyalama

FonksiyonDönüşAçıklama
dosya.sil(yol: metin)tamDosya veya boş dizin siler
dosya.sil_özyineli(yol: metin)tamDizini içeriğiyle birlikte siler
dosya.taşı(kaynak: metin, hedef: metin)tamDosya/dizin taşır
dosya.kopyala(kaynak: metin, hedef: metin)tamDosya kopyalar
dosya.yeniden_adlandır(eski: metin, yeni: metin)tamYeniden adlandırır

Meta Veri

FonksiyonDönüşAçıklama
dosya.boyut(yol: metin)tamDosya boyutunu bayt olarak döndürür
dosya.değiştirilme_zamanı(yol: metin)tamUnix timestamp olarak değiştirilme zamanı
dosya.oluşturulma_zamanı(yol: metin)tamUnix timestamp olarak oluşturulma zamanı
dosya.izinler(yol: metin)tamUnix izin bitlerini döndürür (örn: 0644)
dosya.izin_ayarla(yol: metin, mod: tam)tamDosya izinlerini ayarlar

Yol İşlemleri

FonksiyonDönüşAçıklama
dosya.mutlak_yol(yol: metin)metinGöreceli yolu mutlak yola çevirir
dosya.üst_dizin(yol: metin)metinÜst dizini döndürür: /a/b/c → /a/b
dosya.temel_ad(yol: metin)metinDosya adını döndürür: /a/b/dosya.txt → dosya.txt
dosya.uzantı(yol: metin)metinUzantıyı döndürür: dosya.txt → .txt
dosya.yol_birleştir(yol1: metin, yol2: metin)metinİki yolu birleştirir: /a + b/c → /a/b/c

Glob Desenleri ve Geçici Dosyalar

FonksiyonDönüşAçıklama
dosya.glob(desen: metin)dizi*.txt, *.tr gibi desenleri arar
dosya.glob_özyineli(desen: metin)diziÖzyinelemeli glob arama
dosya.geçici_dosya()metinBenzersiz geçici dosya yolu oluşturur
dosya.geçici_dizin()metinBenzersiz geçici dizin oluşturur

Sembolik Bağlantılar ve Çalışma Dizini

FonksiyonDönüşAçıklama
dosya.sembolik_bağ_oluştur(hedef: metin, bağ: metin)tamSembolik bağlantı oluşturur
dosya.sembolik_bağ_mı(yol: metin)mantıkSembolik bağlantı mı?
dosya.sembolik_bağ_oku(yol: metin)metinBağlantının hedefini döndürür
dosya.mevcut_dizin()metinÇalışma dizinini döndürür
dosya.dizin_değiştir(yol: metin)tamÇalışma dizinini değiştirir
dosya.ev_dizini()metinKullanıcı ev dizinini döndürür

Örnek: Dosya Okuma ve Yazma

kullan dosya

# Dosyaya yaz
dosya.yaz("notlar.txt", "Merhaba Dünya!")

# Dosyadan oku
metin icerik = dosya.oku("notlar.txt")
yazdır(icerik)  # Merhaba Dünya!

# Dosya var mı kontrol et
eğer dosya.var_mi("notlar.txt") ise
    yazdır("Dosya mevcut, boyutu: ")
    yazdır(dosya.boyut("notlar.txt"))
son

tarih

Tarih ve saat bilgilerine erişim sağlayan modül.

kullan tarih
FonksiyonDönüşAçıklama
tarih_şimdi()metinŞu anki tarih/saat: “2026-02-27 13:45:30” formatında
tarih_gün()tamGün numarası (1-31)
tarih_ay()tamAy numarası (1-12)
tarih_yıl()tamYıl (örn: 2026)
tarih_saat()tamSaat (0-23)
tarih_dakika()tamDakika (0-59)
tarih_saniye()tamSaniye (0-59)
tarih_damga()tamUnix timestamp (epoch saniye)
tarih_gün_adı()metinTürkçe gün adı (örn: “Pazartesi”)
tarih_ay_adı()metinTürkçe ay adı (örn: “Şubat”)

Örnek: Tarih Bilgisi Gösterme

kullan tarih

yazdır(tarih_şimdi())      # 2026-02-27 14:30:00
yazdır(tarih_gün_adı())  # Cuma
yazdır(tarih_ay_adı())   # Şubat
yazdır(tarih_yıl())      # 2026
yazdır(tarih_damga())    # 1772150200 (Unix timestamp)

biçimlendirme

Sayı ve metin biçimlendirme modülü. Sıfır doldurma, para formatı, binlik ayırıcı ve metin hizalama fonksiyonları sağlar.

kullan biçimlendirme
FonksiyonDönüşAçıklama
sıfır_doldur(sayı: tam, genişlik: tam)metinSayıyı belirtilen genişlikte sıfırla doldurur: sıfır_doldur(42, 5)"00042"
ondalık_biçimle(sayı: ondalık, basamak: tam)metinOndalık sayıyı formatlar: ondalık_biçimle(3.14159, 2)"3.14"
para_biçimle(sayı: ondalık)metinTürkçe para formatı: para_biçimle(1234567.89)"1.234.567,89"
para_biçimle_sembol(sayı: ondalık, sembol: metin)metinSembol ekleyerek formatlar: "1.234,56 TL"
binlik_ayır(sayı: tam)metinBinlik ayırıcı ekler: binlik_ayır(1234567)"1.234.567"
sağa_hizala(metin: metin, genişlik: tam)metinMetni sağa hizalar (boşlukla doldurur)
sola_hizala(metin: metin, genişlik: tam)metinMetni sola hizalar (boşlukla doldurur)
ortala(metin: metin, genişlik: tam)metinMetni ortalar
ondalık_binlik(sayı: ondalık, basamak: tam)metinBinlik ayırıcılı ondalık: "1.234,56"

Örnek: Sayı Biçimlendirme

kullan biçimlendirme

yazdır(sıfır_doldur(42, 5))          # 00042
yazdır(para_biçimle(1234567.89))    # 1.234.567,89
yazdır(binlik_ayır(1000000))       # 1.000.000
yazdır(sağa_hizala("test", 10))    #       test
yazdır(ortala("başlık", 20))       #        başlık

csv

CSV (Comma-Separated Values) dosya okuma, yazma ve ayrıştırma modülü. Dosya tabanlı ve metin tabanlı işlemler desteklenir.

kullan csv
FonksiyonDönüşAçıklama
csv_oku(dosya: metin)diziCSV dosyasını okur, 2 boyutlu dizi döndürür
csv_ayır(satır: metin)diziTek CSV satırını alanlarına ayırır
csv_ayır_özel(satır: metin, ayırıcı: tam)diziÖzel ayırıcı karakterle ayırır (ASCII kodu)
csv_satır_oluştur(alanlar: dizi)metinDiziden CSV satırı oluşturur
csv_yaz(dosya: metin, veri: dizi)tam2 boyutlu diziyi CSV dosyasına yazar
csv_oku_özel(dosya: metin, ayırıcı: tam)diziÖzel ayırıcıyla CSV okur
csv_satır_al(veri: dizi, satır: tam)diziBelirli satırı dizi olarak döndürür
csv_alan_al(veri: dizi, satır: tam, alan: tam)metinBelirli hücredeki değeri döndürür
csv_satır_sayısı(veri: dizi)tamToplam satır sayısı
csv_alan_sayısı(veri: dizi, satır: tam)tamBelirli satırdaki alan sayısı

Örnek: CSV Dosya İşlemleri

kullan csv

# Tek satır ayrıştırma
dizi alanlar = csv_ayır("Ali,25,İstanbul")
yazdır(alanlar[0])  # Ali
yazdır(alanlar[2])  # İstanbul

# Satır oluşturma
metin satir = csv_satır_oluştur(alanlar)
yazdır(satir)        # Ali,25,İstanbul

sözlük

Anahtar-değer çiftleri saklayan sözlük (hash map) veri yapısı. Anahtarlar metin, değerler tam sayıdır.

kullan sözlük
FonksiyonDönüşAçıklama
yeni()tamYeni boş sözlük oluşturur, tanıtıcı döndürür
ekle(sözlük: tam, anahtar: metin, değer: tam)tamAnahtar-değer çifti ekler/günceller
oku(sözlük: tam, anahtar: metin)tamAnahtarın değerini döndürür
uzunluk(sözlük: tam)tamSözlükteki öğe sayısı
var_mı(sözlük: tam, anahtar: metin)tamAnahtar mevcut mu? 1=evet, 0=hayır
anahtarlar(sözlük: tam)diziTüm anahtarları dizi olarak döndürür

Örnek: Sözlük Kullanımı

kullan sözlük

tam puan = yeni()
ekle(puan, "Ali", 95)
ekle(puan, "Veli", 87)
ekle(puan, "Ayşe", 100)

yazdır(oku(puan, "Ali"))      # 95
yazdır(uzunluk(puan))         # 3
yazdır(var_mı(puan, "Veli"))  # 1

Masaüstü GUI (GTK3)

Tonyukuk, GTK3 kütüphanesi üzerine inşa edilmiş tam teşekküllü bir masaüstü GUI sistemi sunar. Pencere yönetimi, 15+ widget çeşidi, callback tabanlı olay sistemi, menü çubuğu, diyalog pencereleri, sistem panosu ve WebView entegrasyonu içerir.

Gereksinimler

# GTK3 geliştirme kütüphaneleri
$ sudo apt install libgtk-3-dev

# WebView modülü için (isteğe bağlı)
$ sudo apt install libwebkit2gtk-4.0-dev

Minimal Örnek

kullan pencere
kullan grafik

baslat()
tam p = olustur("Merhaba", 400, 300)

tam etiket1 = etiket("Merhaba Dünya!")
icerik_ayarla(p, etiket1)
goster(p)

iken kapatildi_mi(p) == 0 ise
    olaylari_isle()
son

Derleme

# GTK modülleri otomatik algılanır
$ ./tonyukuk-derle program.tr -o program
$ ./program

pencere

GTK3 pencere oluşturma, yönetme ve olay döngüsü modülü. Tüm GUI uygulamaları bu modülle başlar.

kullan pencere

Başlatma ve Oluşturma

FonksiyonDönüşAçıklama
baslat()tamGTK'yı başlatır. Program başında bir kez çağrılmalı
olustur(baslik: metin, genislik: tam, yukseklik: tam)tamYeni pencere oluşturur, pencere ID döndürür

Pencere Özellikleri

FonksiyonDönüşAçıklama
baslik_ayarla(pencere_id: tam, baslik: metin)tamPencere başlığını değiştirir
boyut_ayarla(pencere_id: tam, genislik: tam, yukseklik: tam)tamPencere boyutunu değiştirir
simge_ayarla(pencere_id: tam, dosya_yolu: metin)tamPencere simgesini ayarlar
icerik_ayarla(pencere_id: tam, widget_id: tam)tamPencereye ana içerik widget’ını ekler

Görünürlük ve Kontrol

FonksiyonDönüşAçıklama
goster(pencere_id: tam)tamPencereyi gösterir
gizle(pencere_id: tam)tamPencereyi gizler
kapat(pencere_id: tam)tamPencereyi kapatır
tam_ekran(pencere_id: tam)tamTam ekran moduna geçer
tam_ekrandan_cik(pencere_id: tam)tamTam ekrandan çıkar

Olay Döngüsü

FonksiyonDönüşAçıklama
olaylari_isle()tamGTK olaylarını işler (bloklamayan). Ana döngüde her adımda çağrılmalı
calistir()tamGTK ana döngüsünü çalıştırır (bloklayan — tüm pencereler kapanana kadar)
kapatildi_mi(pencere_id: tam)tamPencere kapatıldı mı? 1=evet, 0=hayır

grafik

GTK3 widget kütüphanesi. Düğme, etiket, giriş alanı, metin alanı, sekmeler, onay kutusu, açılır liste, kaydırıcı, ızgara, araç çubuğu, liste görünümü ve daha fazlasını içerir. kullan grafik ile yüklenir.

kullan grafik

Konteynerler ve Yerleşim

FonksiyonDönüşAçıklama
kutu_yatay()tamYatay kutu konteyneri (GtkBox)
kutu_dikey()tamDikey kutu konteyneri (GtkBox)
kaydirma()tamKaydırma penceresi (GtkScrolledWindow)
ekle(konteyner_id: tam, widget_id: tam)tamWidget’ı konteynere ekler
pakle(kutu_id: tam, widget_id: tam, genisle: tam, doldur: tam, bosluk: tam)tamWidget’ı kutuya paketler (genişle/doldur/boşluk)
goster_tumu(widget_id: tam)tamWidget ve tüm çocuklarını gösterir

Temel Widget’lar

FonksiyonDönüşAçıklama
dugme(etiket: metin)tamDüğme oluşturur
etiket(metin: metin)tamEtiket oluşturur
giris()tamTek satırlı metin girişi
ayirici()tamGörsel ayırıcı çizgi
resim_dosyadan(yol: metin)tamDosyadan resim yükler

Giriş Alanı İşlemleri

FonksiyonDönüşAçıklama
giris_metni_al(giris_id: tam)metinGiriş alanındaki metni döndürür
giris_metni_ayarla(giris_id: tam, metin: metin)tamGiriş alanı metnini ayarlar
giris_ipucu_ayarla(giris_id: tam, ipucu: metin)tamPlaceholder metin ayarlar

Etiket İşlemleri

FonksiyonDönüşAçıklama
etiket_metni_ayarla(etiket_id: tam, metin: metin)tamEtiket metnini değiştirir
etiket_metni_al(etiket_id: tam)metinEtiket metnini döndürür

Düğme İşlemleri

FonksiyonDönüşAçıklama
dugme_etiket_ayarla(dugme_id: tam, metin: metin)tamDüğme etiketini değiştirir
dugme_basildi_mi(dugme_id: tam)tamDüğmeye basıldı mı? (yoklama modu)

Metin Alanı (Çok Satırlı)

FonksiyonDönüşAçıklama
metin_alani()tamÇok satırlı metin alanı (GtkTextView)
metin_alani_icerik_al(id: tam)metinMetin alanı içeriğini döndürür
metin_alani_icerik_ayarla(id: tam, metin: metin)tamMetin alanı içeriğini ayarlar
metin_alani_salt_oku(id: tam, deger: tam)tamSalt okunur ayarı (1=evet, 0=hayır)

Sekme Yönetimi (GtkNotebook)

FonksiyonDönüşAçıklama
sekmeler()tamSekme paneli oluşturur
sekme_ekle(notebook_id: tam, icerik_id: tam, baslik: metin)tamYeni sekme ekler
sekme_kapatmali_ekle(notebook_id: tam, icerik_id: tam, baslik: metin)tamKapatılabilir sekme ekler
sekme_kaldir(notebook_id: tam, indeks: tam)tamSekmeyi kaldırır
sekme_secili(notebook_id: tam)tamSeçili sekme indeksi
sekme_sec(notebook_id: tam, indeks: tam)tamSekme seçer
sekme_baslik_ayarla(notebook_id: tam, indeks: tam, baslik: metin)tamSekme başlığını değiştirir
sekme_sayisi(notebook_id: tam)tamToplam sekme sayısı
sekme_kapandi_mi(notebook_id: tam)tamKapatılan sekme indeksi veya -1
sekme_degisti_mi(notebook_id: tam)tamSekme değişti mi? (yoklama)

Onay Kutusu (GtkCheckButton)

FonksiyonDönüşAçıklama
onay_kutusu(etiket: metin)tamOnay kutusu oluşturur
onay_durumu(id: tam)tamDurum: 0=kapalı, 1=açık
onay_ayarla(id: tam, deger: tam)tamOnay durumunu ayarlar

Seçim Düğmesi (GtkRadioButton)

FonksiyonDönüşAçıklama
secim_dugmesi(grup_id: tam, etiket: metin)tamRadyo düğmesi (-1=yeni grup, ≥0=mevcut gruba ekle)
secim_durumu(id: tam)tamSeçili mi? 0=hayır, 1=evet

Açılır Liste (GtkComboBox)

FonksiyonDönüşAçıklama
acilir_liste()tamAçılır liste oluşturur
acilir_ekle(id: tam, metin: metin)tamÖğe ekler
acilir_secili(id: tam)tamSeçili öğe indeksi (-1=seçili değil)
acilir_sec(id: tam, indeks: tam)tamÖğe seçer
acilir_metni_al(id: tam)metinSeçili öğenin metnini döndürür

Kaydırıcı (GtkScale)

FonksiyonDönüşAçıklama
kaydirici(min: tam, maks: tam)tamKaydırıcı oluşturur
kaydirici_degeri(id: tam)tamGeçerli değeri döndürür
kaydirici_ayarla(id: tam, deger: tam)tamDeğeri ayarlar

Sayı Girişi (GtkSpinButton)

FonksiyonDönüşAçıklama
sayi_girisi(min: tam, maks: tam)tamSayı girişi oluşturur
sayi_degeri(id: tam)tamGeçerli değeri döndürür
sayi_ayarla(id: tam, deger: tam)tamDeğeri ayarlar

İlerleme Çubuğu

FonksiyonDönüşAçıklama
ilerleme_cubugu()tamİlerleme çubuğu oluşturur
ilerleme_ayarla(id: tam, deger: tam)tamİlerleme yüzdesi (0-100)

Izgara (GtkGrid)

FonksiyonDönüşAçıklama
izgara(satir: tam, sutun: tam)tamIzgara konteyneri oluşturur
izgara_ekle(izgara_id: tam, widget_id: tam, satir: tam, sutun: tam)tamWidget’ı hücreye ekler
izgara_ekle_genislikli(izgara_id: tam, widget_id: tam, satir: tam, sutun: tam, genislik: tam, yukseklik: tam)tamBirden fazla hücreyi kaplayan widget ekler
izgara_satir_bosluk(izgara_id: tam, bosluk: tam)tamSatır arasındaki boşluk (piksel)
izgara_sutun_bosluk(izgara_id: tam, bosluk: tam)tamSütun arasındaki boşluk (piksel)

Araç Çubuğu (GtkToolbar)

FonksiyonDönüşAçıklama
arac_cubugu()tamAraç çubuğu oluşturur
arac_dugme_ekle(cubuk_id: tam, etiket: metin)tamAraç düğmesi ekler, ID döndürür
arac_ayirici_ekle(cubuk_id: tam)tamAyırıcı ekler
arac_dugme_basildi_mi(dugme_id: tam)tamDüğmeye basıldı mı? (yoklama)

Liste Görünümü (GtkListBox)

FonksiyonDönüşAçıklama
liste_gorunumu()tamListe görünümü oluşturur
liste_oge_ekle(liste_id: tam, metin: metin)tamÖğe ekler
liste_secili(liste_id: tam)tamSeçili öğe indeksi (-1=seçim yok)
liste_oge_kaldir(liste_id: tam, indeks: tam)tamÖğeyi kaldırır
liste_temizle(liste_id: tam)tamTüm öğeleri temizler
liste_oge_sayisi(liste_id: tam)tamÖğe sayısını döndürür

CSS Tema ve Widget Özellikleri

FonksiyonDönüşAçıklama
css_yukle(css: metin)tamCSS metnini uygulamaya yükler
css_sinif_ekle(widget_id: tam, sinif: metin)tamWidget’a CSS sınıfı ekler
css_sinif_kaldir(widget_id: tam, sinif: metin)tamCSS sınıfını kaldırır
widget_genislik_ayarla(widget_id: tam, genislik: tam)tamWidget genişliğini ayarlar
widget_yukseklik_ayarla(widget_id: tam, yukseklik: tam)tamWidget yüksekliğini ayarlar
widget_gizle(widget_id: tam)tamWidget’ı gizler
widget_goster(widget_id: tam)tamWidget’ı gösterir
ipucu_ayarla(widget_id: tam, metin: metin)tamTooltip ayarlar
giris_enter_mi(giris_id: tam)tamGiriş alanında Enter basıldı mı?

Örnek: Form Kontrolleri

kullan pencere
kullan grafik

baslat()
tam p = olustur("Form Örneği", 400, 300)

tam kutu = kutu_dikey()
tam g = giris()
giris_ipucu_ayarla(g, "Adınızı girin...")

tam onay = onay_kutusu("Kabul ediyorum")
tam kaydir = kaydirici(0, 100)
tam btn = dugme("Gönder")

pakle(kutu, g, 0, 0, 5)
pakle(kutu, onay, 0, 0, 5)
pakle(kutu, kaydir, 0, 0, 5)
pakle(kutu, btn, 0, 0, 5)

icerik_ayarla(p, kutu)
goster(p)

iken kapatildi_mi(p) == 0 ise
    olaylari_isle()
    eğer dugme_basildi_mi(btn) == 1 ise
        yazdır(giris_metni_al(g))
    son
son

olay

Callback tabanlı olay sistemi. Yoklama (polling) yerine widget olaylarına fonksiyon bağlayarak olaya dayalı programlama yapmanızı sağlar.

kullan olay

Olay Dinleme

FonksiyonDönüşAçıklama
olay_dinle(widget_id: tam, olay_adi: metin, fonksiyon: işlev)tamWidget’a olay dinleyici bağlar. Kayıt ID döndürür
olay_kaldir(kayit_id: tam)tamOlay kaydını devre dışı bırakır

Desteklenen olaylar: "tikla", "degisti", "enter", "sekme_degisti", "kapatildi", "deger_degisti", "tus_basildi", "fare_tiklandi"

Olay İşleme

FonksiyonDönüşAçıklama
olaylari_isle_ve_cagir()tamBekleyen callback kuyruğunu boşaltır, her birini çağırır. İşlenen olay sayısını döndürür
olay_sayisi()tamKuyrukta bekleyen olay sayısı

Klavye ve Fare Sorguları

FonksiyonDönüşAçıklama
son_tus_kodu()tamSon basılan tuşun kodu (GDK keyval)
son_fare_x()tamSon fare olayının X koordinatı
son_fare_y()tamSon fare olayının Y koordinatı
son_fare_dugme()tamSon fare düğmesi (1=sol, 2=orta, 3=sağ)

Örnek: Callback Tabanlı Olaylar

kullan pencere
kullan grafik
kullan olay

işlev tikla_cb(widget_id: tam) -> tam
    yazdır("Düğmeye tıklandı!")
    döndür 0
son

baslat()
tam p = olustur("Olay Testi", 300, 200)
tam btn = dugme("Tıkla!")
olay_dinle(btn, "tikla", tikla_cb)

icerik_ayarla(p, btn)
goster(p)

iken kapatildi_mi(p) == 0 ise
    olaylari_isle()
    olaylari_isle_ve_cagir()
son

menü

Menü çubuğu, alt menüler ve menü öğeleri modülü. Standart uygulama menüleri oluşturmanızı sağlar.

kullan menu
FonksiyonDönüşAçıklama
menu_cubugu()tamMenü çubuğu oluşturur
menu_pencereye_ekle(pencere_id: tam, cubuk_id: tam)tamMenü çubuğunu pencereye ekler
menu_olustur(etiket: metin)tamAlt menü oluşturur (örn: “Dosya”)
menu_cubuga_ekle(cubuk_id: tam, menu_id: tam)tamAlt menüyü çubuğa ekler
menu_oge_ekle(menu_id: tam, etiket: metin)tamMenü öğesi ekler, ID döndürür
menu_ayirici_ekle(menu_id: tam)tamMenüye ayırıcı ekler
menu_onay_oge_ekle(menu_id: tam, etiket: metin)tamOnay kutulu menü öğesi
menu_oge_secildi_mi(oge_id: tam)tamMenü öğesi seçildi mi? (yoklama)
menu_onay_durumu(oge_id: tam)tamOnay kutulu öğe durumu (0/1)

Örnek: Menü Çubuğu

kullan pencere
kullan grafik
kullan menu

baslat()
tam p = olustur("Menü Örneği", 500, 400)

tam mc = menu_cubugu()

# Dosya menüsü
tam dosya_m = menu_olustur("Dosya")
tam m_yeni = menu_oge_ekle(dosya_m, "Yeni")
tam m_ac = menu_oge_ekle(dosya_m, "Aç...")
menu_ayirici_ekle(dosya_m)
tam m_cik = menu_oge_ekle(dosya_m, "Çıkış")
menu_cubuga_ekle(mc, dosya_m)

menu_pencereye_ekle(p, mc)

diyalog

Mesaj kutuları, dosya aç/kaydet diyalogları ve renk seçici diyalog penceresi modülü.

kullan diyalog
FonksiyonDönüşAçıklama
mesaj_kutusu(baslik: metin, mesaj: metin, tip: tam)tamMesaj kutusu gösterir. tip: 0=bilgi, 1=uyarı, 2=hata, 3=soru. Dönüş: 1=Tamam/Evet, 0=İptal/Hayır
dosya_ac(baslik: metin, filtre: metin)metinDosya açma diyaloğu. Filtre: "Metin (*.txt)|Tümü (*)". Seçilen yol veya "" döndürür
dosya_kaydet(baslik: metin, filtre: metin)metinDosya kaydetme diyaloğu
renk_sec(baslik: metin)tamRenk seçici. RGB değeri (0xRRGGBB) veya -1 (iptal) döndürür

Örnek: Diyalog Pencereleri

kullan pencere
kullan diyalog

# Bilgi mesajı
mesaj_kutusu("Bilgi", "İşlem tamamlandı!", 0)

# Soru sor
tam cevap = mesaj_kutusu("Onay", "Devam etmek istiyor musunuz?", 3)

# Dosya aç
metin yol = dosya_ac("Dosya Aç", "Tonyukuk (*.tr)|Metin (*.txt)|Tümü (*)")

# Renk seç
tam renk = renk_sec("Renk Seçin")

pano

Sistem panosuna (clipboard) metin kopyalama ve yapıştırma modülü.

kullan pano
FonksiyonDönüşAçıklama
pano_yaz(metin: metin)tamPanoya metin yazar (kopyala)
pano_oku()metinPanodan metin okur (yapıştır)
pano_boş_mu()tamPanoda metin var mı? 1=boş, 0=dolu
pano_temizle()tamPano içeriğini temizler

Örnek: Pano Kullanımı

kullan pano

pano_yaz("Kopyalanan metin")
metin icerik = pano_oku()
yazdır(icerik)  # Kopyalanan metin

eğer pano_boş_mu() == 0 ise
    yazdır("Panoda veri var")
son

web

WebKit2GTK tabanlı web görünümü (WebView) modülü. Tarayıcı gömülmesi, JavaScript çalıştırma ve JS↔Tonyukuk mesaj köprüsü sağlar. libwebkit2gtk-4.0-dev gerektirir.

kullan web

Oluşturma ve Gezinti

FonksiyonDönüşAçıklama
wg_olustur()tamWeb görünümü widget’ı oluşturur
wg_yukle(wv_id: tam, url: metin)tamURL yükler
wg_html_yukle(wv_id: tam, html: metin)tamHTML içerike doğrudan yükler
wg_geri(wv_id: tam)tamGeri gider
wg_ileri(wv_id: tam)tamİleri gider
wg_yenile(wv_id: tam)tamSayfayı yeniler
wg_durdur(wv_id: tam)tamYüklemeyi durdurur

Bilgi Sorgulama ve Durum

FonksiyonDönüşAçıklama
wg_baslik_al(wv_id: tam)metinSayfa başlığını döndürür
wg_adres_al(wv_id: tam)metinGeçerli URL’yi döndürür
wg_geri_gidebilir_mi(wv_id: tam)tamGeçmişte geri gidilebilir mi?
wg_ileri_gidebilir_mi(wv_id: tam)tamGeçmişte ileri gidilebilir mi?
wg_yukleniyor_mu(wv_id: tam)tamSayfa yükleniyor mu?
wg_yuklenme_yuzdesi(wv_id: tam)tamYüklenme yüzdesi (0-100)
wg_widget_id(wv_id: tam)tamArayüz widget kimliği (yerleşim için)

Olay Yoklama

FonksiyonDönüşAçıklama
wg_baslik_degisti_mi(wv_id: tam)tamBaşlık değişti mi?
wg_adres_degisti_mi(wv_id: tam)tamAdres değişti mi?
wg_yuklenme_bitti_mi(wv_id: tam)tamYüklenme tamamlandı mı?

Yakınlaştırma

FonksiyonDönüşAçıklama
wg_yakinlastir(wv_id: tam)tamYakınlaştırır
wg_uzaklastir(wv_id: tam)tamUzaklaştırır
wg_yakinlik_sifirla(wv_id: tam)tamYakınlaştırmayı sıfırlar

JavaScript ve Köprü

FonksiyonDönüşAçıklama
wg_js_calistir(wv_id: tam, kod: metin)tamJavaScript kodu çalıştırır
wg_kopru_kur(wv_id: tam)tamJS↔Tonyukuk mesaj köprüsünü başlatır
wg_mesaj_gonder(wv_id: tam, mesaj: metin)tamTonyukuk→JS mesaj gönderir
wg_mesaj_al(wv_id: tam)metinJS→Tonyukuk mesaj alır (kuyruktan)
wg_mesaj_var_mi(wv_id: tam)tamBekleyen mesaj var mı?

Örnek: Basit Tarayıcı

kullan pencere
kullan grafik
kullan web

baslat()
tam p = olustur("Tarayıcı", 800, 600)

tam wv = wg_olustur()
wg_yukle(wv, "https://tonyukuktr.com")

tam wid = wg_widget_id(wv)
icerik_ayarla(p, wid)
goster(p)

iken kapatildi_mi(p) == 0 ise
    olaylari_isle()
    eğer wg_baslik_degisti_mi(wv) == 1 ise
        baslik_ayarla(p, wg_baslik_al(wv))
    son
son

Örnek: JS↔Tonyukuk Köprüsü

kullan pencere
kullan grafik
kullan web

baslat()
tam p = olustur("Köprü", 600, 400)
tam wv = wg_olustur()
wg_kopru_kur(wv)

metin html = "<button onclick='tonyukuk.gonder(\"merhaba\")'>Gönder</button>"
wg_html_yukle(wv, html)

tam wid = wg_widget_id(wv)
icerik_ayarla(p, wid)
goster(p)

iken kapatildi_mi(p) == 0 ise
    olaylari_isle()
    eğer wg_mesaj_var_mi(wv) == 1 ise
        metin msj = wg_mesaj_al(wv)
        yazdır(msj)  # JS'den gelen mesaj
        wg_mesaj_gonder(wv, "selam JS!")
    son
son

Biçimleyici (bicimle)

Tonyukuk biçimleyicisi, kaynak kodunuzu tutarlı bir stile otomatik olarak düzenler. Girinti, boşluklar ve satır sonları standart formata getirilir.

Kullanım

# Dosyayı biçimle ve sonucu göster
$ bicimle dosya.tr

# Dosyayı yerinde biçimle (üzerine yaz)
$ bicimle -y dosya.tr

# Dizindeki tüm .tr dosyalarını biçimle
$ bicimle -y *.tr

Seçenekler

SeçenekAçıklama
-yDosyayı yerinde düzenle (üzerine yaz)
-gGirinti boyutu (varsayılan: 4 boşluk)
-tTab karakteri kullan (boşluk yerine)
--kontrolSadece kontrol et, değişiklik yapma (CI için)

Biçimleme Kuralları

Denetleyici (denetle)

Tonyukuk denetleyicisi (linter), kodunuzda olası hataları, kötü alışkanlıkları ve performans sorunlarını tespit eder.

Kullanım

# Dosyayı denetle
$ denetle dosya.tr

# Dizindeki tüm dosyaları denetle
$ denetle *.tr

# Belirli kuralları devre dışı bırak
$ denetle --kural-kapat=kullanilmayan dosya.tr

Kontrol Edilen Kurallar

KuralAçıklama
kullanilmayanKullanılmayan değişkenler ve fonksiyonlar
golgelemeDış kapsamdaki değişkeni gölgeleyen tanımlamalar
tip_uyusmazligiTip uyumsuzluğu uyarıları
sonsuz_donguOlası sonsuz döngü tespiti
bos_blokBoş eğer/döngü/fonksiyon blokları
isimlendirmeİsimlendirme kuralları (yılan_durum önerisi)
karmasiklikYüksek siklomatik karmaşıklık uyarısı

Paket Yöneticisi (ton)

ton, Tonyukuk projelerini oluşturmak, bağımlılıkları yönetmek ve paketleri paylaşmak için kullanılan paket yöneticisidir.

Temel Komutlar

# Yeni proje oluştur
$ ton yeni projem
$ cd projem

# Mevcut dizinde proje başlat
$ ton baslat

# Bağımlılıkları yükle
$ ton yukle

# Projeyi derle
$ ton derle

# Projeyi çalıştır
$ ton calistir

# Testleri çalıştır
$ ton test

Proje Yapısı

ton yeni projem komutu aşağıdaki yapıyı oluşturur:

projem/
├── ton.toml          # Proje yapılandırması
├── kaynak/
│   └── ana.tr        # Ana kaynak dosyası
├── test/
│   └── test_ana.tr   # Test dosyası
└── .gitignore

ton.toml Dosya Formatı

[proje]
ad = "projem"
surum = "0.1.0"
yazar = "Ad Soyad"
aciklama = "Proje açıklaması"

[bagimliliklar]
json_isle = "1.2.0"
ag_yardimci = "0.5.0"

[derleme]
backend = "llvm"
optimizasyon = "O2"
hedef = "x86_64"

Komut Referansı

KomutAçıklama
ton yeni <ad>Yeni proje iskelesi oluştur
ton baslatMevcut dizinde proje başlat
ton yukleBağımlılıkları indir ve yükle
ton derleProjeyi derle
ton calistirProjeyi derle ve çalıştır
ton testTestleri çalıştır
ton yayinlaPaketi kayıt defterine yayınla

LSP Sunucu (tonyukuk-lsp)

Tonyukuk LSP (Language Server Protocol) sunucusu, kod düzenleyicilere akıllı özellikler sağlar.

VS Code Entegrasyonu

Tonyukuk VS Code eklentisi LSP sunucusunu otomatik olarak başlatır. Manuel kurulum için:

# LSP sunucusunu kur
$ sudo make install-lsp

# VS Code ayarlarına ekle (settings.json)
{
    "tonyukuk.lsp.yol": "/usr/local/bin/tonyukuk-lsp",
    "tonyukuk.lsp.etkin": true
}

Desteklenen Özellikler

ÖzellikAçıklama
Sözdizimi RenklendirmeAnahtar kelimeler, tipler, fonksiyonlar, metinler ve yorumlar renklendirmesi
Otomatik TamamlamaDeğişken, fonksiyon ve modül isimleri önerileri
Anlık Hata TespitiSözdizimi ve tip hataları yazarken gösterilir
Tanıma GitFonksiyon veya değişken tanımına atlama (F12)
Fare ile Bilgiİmleç üzerine gelindiğinde tip ve belge bilgisi
Sembol AramaProjedeki tüm sembolleri arayabilme (Ctrl+T)
BiçimlemeBelge biçimleme desteği (Shift+Alt+F)

Hata Ayıklayıcı (tonyukuk-ha)

tonyukuk-ha, Tonyukuk programlarını adım adım çalıştırmanıza, değişkenleri incelemenize ve kesme noktaları koymanıza olanak tanıyan Türkçe hata ayıklayıcıdır.

Başlangıç

# Debug bilgisi ile derle
$ tonyukuk-derle --backend=llvm -g program.tr -o program

# Hata ayıklayıcıyı başlat
$ tonyukuk-ha ./program

Komutlar

KomutKısaltmaAçıklama
kes <satır>kBelirtilen satıra kesme noktası koy
kes <fonksiyon>kFonksiyon başına kesme noktası koy
devamdBir sonraki kesme noktasına kadar çalıştır
adımaBir satır ilerle (fonksiyonun içine gir)
atlaatBir satır ilerle (fonksiyonun içine girme)
göster <değişken>gDeğişkenin değerini göster
göster *g *Tüm yerel değişkenleri göster
yığınyÇağrı yığınını (backtrace) göster
listelelŞu anki konumdaki kaynak kodu göster
sil <numara>sKesme noktasını kaldır
çıkcHata ayıklayıcıdan çık

Örnek Oturum

$ tonyukuk-ha ./program
Tonyukuk Hata Ayıklayıcı v1.0
Kaynak: program.tr (12 satır)

(ha) kes 5
Kesme noktası #1: satır 5

(ha) devam
Kesme noktası #1, satır 5: tam sonuc = topla(a, b)

(ha) göster a
a = 10 (tam)

(ha) göster b
b = 20 (tam)

(ha) adım
satır 2: döndür a + b

(ha) göster *
a = 10 (tam)
b = 20 (tam)

(ha) devam
Sonuç: 30
Program tamamlandı.

(ha) çık

Generator (Üreteç)

üreteç işlev sayilar() -> tam
    üret 1
    üret 2
    üret 3
son

Desen Eşleme

eşle ifadesi ile değer-bazlı desen eşleme yapılır:

eşle komut ise
    durum "ekle":
        yazdır("Eklendi")
    durum "sil":
        yazdır("Silindi")
    varsayılan:
        yazdır("Bilinmeyen komut")
son

Pipe Operatörü

# |> ile fonksiyon zincirleme
sonuc = deger |> fonk1 |> fonk2

Test Çerçevesi

test "toplama testi"
    doğrula(2 + 2 == 4)
    doğrula(3 * 3 == 9)
son

Test sonrasında otomatik rapor üretilir: başarılı/başarısız test sayıları görüntülenir.

Derleme Seçenekleri

Tonyukuk derleyicisi çeşitli seçenekler sunar:

$ tonyukuk-derle [seçenekler] <kaynak.tr>
SeçenekAçıklama
-o <dosya>Çıktı dosya adı
-sAssembly dosyasını sakla
-gHata ayıklama bilgisi ekle (DWARF)
-hedef <tür>Hedef platform: x86_64, arm64, wasm, windows
-OOptimizasyon (sabit katlama, ölü kod eleme)
-O0/-O1/-O2/-O3LLVM optimizasyon seviyesi
--backend=llvmLLVM IR backend kullan
--emit-llvmLLVM IR dosyası (.ll) üret
--emit-bcLLVM bitcode dosyası (.bc) üret
--emit-asmAssembly dosyası (.s) üret
--emit-objNesne dosyası (.o) üret
--verify-irIR doğrulamasını etkinleştir
--jitJIT modunda çalıştır (derleme yapmadan)
--sınaTest modunda derle
--etkileşimliEtkileşimli REPL modunu başlat

Örnekler

# Temel derleme
$ tonyukuk-derle merhaba.tr -o merhaba

# LLVM backend ile O2 optimizasyonu
$ tonyukuk-derle --backend=llvm -O2 merhaba.tr

# Debug bilgisi ile derleme
$ tonyukuk-derle --backend=llvm -g merhaba.tr -o debug_test

# LLVM IR dosyası üret
$ tonyukuk-derle --backend=llvm --emit-llvm merhaba.tr

# JIT ile direkt çalıştır
$ tonyukuk-derle --backend=llvm --jit merhaba.tr

# WebAssembly hedefi
$ tonyukuk-derle --backend=llvm -hedef wasm merhaba.tr -o merhaba.wasm

LLVM Backend

Tonyukuk, LLVM 17 altyapısını kullanarak çoklu platform desteği, gelişmiş optimizasyonlar, JIT derleme ve WebAssembly üretimi sunar. LLVM backend, kaynak kodu önce LLVM IR'e (Intermediate Representation) dönüştürür, ardından hedef platforma uygun makine kodu üretir.

Çoklu Platform Desteği

LLVM backend, tek kaynak koddan birden fazla hedef platform için derleme yapabilir. -hedef parametresi ile hedef seçilir:

PlatformTarget TripleKomutAçıklama
Linux x86_64x86_64-pc-linux-gnu--backend=llvmVarsayılan hedef
Linux ARM64aarch64-unknown-linux-gnu--backend=llvm -hedef arm64ARM64 işlemciler (Raspberry Pi, M1 vb.)
WebAssemblywasm32-unknown-unknown--backend=llvm -hedef wasmTarayıcı ve WASM runtime'lar
Windowsx86_64-pc-windows-msvc--backend=llvm -hedef windowsWindows (cross-compile)
# x86_64 (varsayılan)
$ tonyukuk-derle --backend=llvm program.tr -o program

# ARM64 cross-compile
$ tonyukuk-derle --backend=llvm -hedef arm64 program.tr -o program_arm

# WebAssembly binary
$ tonyukuk-derle --backend=llvm -hedef wasm program.tr -o program.wasm

Optimizasyon Seviyeleri

LLVM, kaynak kodunuzu analiz ederek otomatik optimizasyon uygular. Farklı seviyelerde performans/derleme süresi dengesini ayarlayabilirsiniz:

SeviyeAçıklamaKullanım Alanı
-O0Optimizasyon yok — hızlı derlemeGeliştirme, debug
-O1Temel optimizasyonlar (sabit katlama, basit inline)Geliştirme, hızlı testler
-O2Önerilen: sabit katlama, ölü kod eleme, fonksiyon inline, döngü optimizasyonuÜretim, genel kullanım
-O3Agresif: loop unrolling, vektörizasyon, tail call optimizasyonuHesaplama yoğun uygulamalar
# Optimizasyonsuz derleme (debug için)
$ tonyukuk-derle --backend=llvm program.tr

# O2 optimizasyonu ile (önerilen)
$ tonyukuk-derle --backend=llvm -O2 program.tr -o program

# Agresif optimizasyon
$ tonyukuk-derle --backend=llvm -O3 program.tr -o program
Öneri: Üretim için -O2 kullanın. -O3 bazen kod boyutunu artırabilir ve beklenmeyen davranışlara yol açabilir. -O0 ise debug bilgisi ile birlikte (-g) en iyi sonuçları verir.

JIT Derleme

LLVM JIT (Just-In-Time) ile kodu dosya oluşturmadan bellekte derleyip doğrudan çalıştırabilirsiniz. Bu mod, herhangi bir çıktı dosyası oluşturmaz — kod anında çalışır ve sonuç terminale yazılır:

# JIT ile anında çalıştır
$ tonyukuk-derle --backend=llvm --jit program.tr

# JIT + optimizasyon birlikte kullanılabilir
$ tonyukuk-derle --backend=llvm --jit -O2 program.tr

JIT modunun kullanım alanları:

IR Üretimi ve İnceleme

LLVM IR (Intermediate Representation), kaynak kodunuzun derlenmiş ancak henüz makine koduna dönüştürülmemiş halidir. IR dosyasını incelemek, derleyicinin kodunuzu nasıl anladığını görmenizi sağlar:

# IR dosyası üret
$ tonyukuk-derle --backend=llvm --emit-llvm program.tr -o program.ll
$ cat program.ll

# IR + optimizasyon birlikte: optimizasyonların etkisini görün
$ tonyukuk-derle --backend=llvm --emit-llvm -O2 program.tr -o program_opt.ll

Örnek: Basit bir toplama fonksiyonu:

# Tonyukuk kaynak kodu
işlev topla(a: tam, b: tam) -> tam
    döndür a + b
son

Üretilen LLVM IR:

; ModuleID = 'tonyukuk_modul'

define i64 @topla(i64 %a, i64 %b) {
giris:
  %toplam = add i64 %a, %b
  ret i64 %toplam
}

Örnek: Fibonacci fonksiyonu (O2 optimizasyonu ile tail call uygulanmış):

# Tonyukuk kaynak kodu
işlev fib(n: tam) -> tam
    eğer n <= 1 ise
        döndür n
    son
    döndür fib(n - 1) + fib(n - 2)
son

Oluşan IR'de rekürsif çağrılar, koşullu dallanmalar ve tamsayı aritmetiği görülebilir:

define i64 @fib(i64 %n) {
giris:
  %kosul = icmp sle i64 %n, 1
  br i1 %kosul, label %temel, label %rekursif

temel:
  ret i64 %n

rekursif:
  %n1 = sub i64 %n, 1
  %fib1 = call i64 @fib(i64 %n1)
  %n2 = sub i64 %n, 2
  %fib2 = call i64 @fib(i64 %n2)
  %sonuc = add i64 %fib1, %fib2
  ret i64 %sonuc
}
Playground'da IR: Çevrimiçi playground'da backend olarak “LLVM” seçip “IR Göster” kutusunu işaretleyerek kodunuzun LLVM IR çıktısını doğrudan tarayıcıda görebilirsiniz.

Döngü ve Kontrol Akışı (LLVM)

LLVM backend, Tonyukuk'un tüm döngü yapılarını destekler: döngü (sayma), iken (koşullu) ve her...için (foreach). Döngüler LLVM IR'de dört temel blok (basic block) olarak üretilir:

BlokLLVM AdıGörevi
Koşuldongu_kosulSayaç ≤ bitiş mi kontrol et
Gövdedongu_govdeDöngü içindeki kodları çalıştır
Artırmadongu_artirSayacı 1 artır, koşula geri dön
Sondongu_sonDöngü bittiğinde devam noktası

Örnek: 1'den 5'e kadar sayıları yazdırma:

döngü i = 1, 5 ise
    yazdır(i)
son

Bu kodun LLVM IR karşılığı (sadeleştirilmiş):

define i64 @main() {
giris:
  %i = alloca i64
  store i64 1, ptr %i          ; i = 1
  br label %dongu_kosul

dongu_kosul:
  %val = load i64, ptr %i
  %cmp = icmp sle i64 %val, 5   ; i <= 5 ?
  br i1 %cmp, label %dongu_govde, label %dongu_son

dongu_govde:
  call void @_yazdir_tam(i64 %val)
  br label %dongu_artir

dongu_artir:
  %yeni = add i64 %val, 1        ; i += 1
  store i64 %yeni, ptr %i
  br label %dongu_kosul

dongu_son:
  ret i64 0
}

kır anahtar kelimesi dongu_son bloğuna, devam ise dongu_artir bloğuna dallanır. Bu mekanizma iç içe döngülerde de doğru çalışır — her döngü kendi çıkış ve devam bloklarını tutar.

Optimizasyon: -O2 seviyesinde LLVM, döngülere otomatik olarak loop-invariant code motion (döngü dışına taşıma), strength reduction (güç azaltma) ve loop unrolling (döngü açma) optimizasyonlarını uygulayabilir.

WebAssembly

Tonyukuk, LLVM backend üzerinden kodunuzu WebAssembly'e (WASM) derleyerek doğrudan tarayıcıda çalıştırmanıza olanak tanır. Sunucu tarafında derlenen .wasm binary dosyası, istemci tarafında JavaScript runtime ile yüklenir ve çalıştırılır — hiçbir eklenti veya kurulum gerekmez.

WASM desteği, aşağıdaki seçenekleri sunar:

Mimari

Tonyukuk WASM derleme süreci şu adımlardan oluşur:

  Tonyukuk        LLVM IR         LLVM            wasm-ld-17        Tarayıcı
  Kaynak Kodu  ──▶  (.ll)    ──▶  Object   ──▶    (.wasm)     ──▶  WebAssembly
  (program.tr)                    (.o)             Binary           .instantiate()
  1. Ayrıştırma: Tonyukuk kaynak kodu sözdizimsel olarak ayrıştırılır (parse) ve AST oluşturulur
  2. LLVM IR Üretimi: AST, wasm32-unknown-unknown hedef üçlüsü ile LLVM IR'e dönüştürülür
  3. Import Tanımları: JavaScript'ten sağlanacak fonksiyonlar (yazdırma, bellek yönetimi vb.) extern olarak tanımlanır
  4. Nesne Dosyası: LLVM, IR'i .o (WebAssembly nesne) formatına derler
  5. Bağlama: wasm-ld-17 ile nesne dosyası .wasm binary'ye bağlanır. Bellek düzeni, stack ve data segment'leri ayarlanır
  6. Çalıştırma: Tarayıcıda WebAssembly.instantiate() ile yüklenir, import nesnesi sağlanır ve main() çağrılır

Bağlama aşamasında kullanılan wasm-ld-17 parametreleri:

ParametreAçıklama
--no-entry_start yerine main() export edilir
--export-allTüm fonksiyonlar dışa aktarılır
--allow-undefinedImport fonksiyonları (yazdırma vb.) tanımsız kalabilir
--import-memoryBellek JavaScript tarafından sağlanır
--initial-memory=1048576Başlangıç bellek: 1 MB (16 sayfa)
--max-memory=16777216Maksimum bellek: 16 MB (256 sayfa)
--stack-firstStack, belleğin başına yerleştirilir

WASM Derleme (Komut Satırı)

Komut satırından WASM binary üretmek için:

# LLVM backend ile .wasm binary üret
$ tonyukuk-derle --backend=llvm -hedef wasm program.tr -o program.wasm

# Üretilen WASM'ı WAT formatında incele
$ wasm2wat program.wasm -o program.wat
$ cat program.wat

# WAT'tan WASM'a geri dönüştür
$ wat2wasm program.wat -o program2.wasm

Native WASM backend ile doğrudan WAT (WebAssembly Text Format) de üretebilirsiniz:

# Native backend ile WAT üret
$ tonyukuk-derle -hedef wasm program.tr -o program.wat
Fark: LLVM backend binary .wasm dosyası üretir (tarayıcıda doğrudan çalışır). Native backend ise metin formatlı .wat dosyası üretir (debug/inceleme için faydalıdır).

Gerekli araçlar:

AraçPaketKurulum
wasm-ld-17lld-17sudo apt install lld-17
wasm2watwabtsudo apt install wabt
wat2wasmwabtsudo apt install wabt

JavaScript Runtime (TonyukukWasm)

Tonyukuk, tarayıcıda WASM çalıştırmak için hazır bir JavaScript runtime sağlar: TonyukukWasm sınıfı. Bu sınıf derleme, yükleme ve çalıştırma işlemlerini tek bir API altında birleştirir.

<!-- Sayfanıza ekleyin -->
<script src="/wasm/tonyukuk.js"></script>

Temel Kullanım

// TonyukukWasm örneği oluştur
const tonyukuk = new TonyukukWasm();

// Çıktı callback'i — her yazdır() çağrısında tetiklenir
tonyukuk.ciktiCallback = function(metin) {
    document.getElementById('cikti').textContent += metin;
};

// Kod yaz ve çalıştır
const kod = 'yazdır("Merhaba WASM!")';
const sonuc = await tonyukuk.calistir(kod);
console.log(sonuc);  // "Merhaba WASM!\n"

API Referansı

MetotParametrelerDönüşAçıklama
calistir(kod)kod: stringPromise<string>Kodu derle + yükle + çalıştır. Tüm çıktıyı string olarak döndürür.
derle(kod)kod: stringPromise<ArrayBuffer>Kodu sunucuda WASM'a derle, binary'yi döndür. Çalıştırmaz.
yukle(wasm_ikili)wasm_ikili: ArrayBufferPromise<void>WASM binary'yi WebAssembly.instantiate() ile yükle.
metin_oku(ptr, len)ptr: number, len: numberstringWASM belleğinden UTF-8 string oku (offset + uzunluk).
metin_oku_c(ptr)ptr: numberstringWASM belleğinden C-style null-terminated string oku.
bellek_bilgisi(){bayt, kb, mb}WASM bellek kullanım bilgisi.

Özellikler

ÖzellikTipAçıklama
ciktiCallbackfunction(metin)Her yazdır() çağrısında tetiklenen callback. null ise çıktı tamponlanır.
ornekWebAssembly.InstanceYüklenen WASM örneği (yüklemeden sonra erişilebilir).
bellekWebAssembly.MemoryPaylaşılan WASM belleği (16 sayfa başlangıç, 256 sayfa max).
disa_aktarimlarobjectWASM'ın dışa aktardığı fonksiyonlar (main, memory vb.).

İleri Kullanım: Adım Adım Derleme ve Çalıştırma

const tonyukuk = new TonyukukWasm();

// 1. Adım: Sadece derle (henüz çalıştırma)
const wasmBinary = await tonyukuk.derle(`
işlev topla(a: tam, b: tam) -> tam
    döndür a + b
son
yazdır(topla(3, 4))
`);

console.log('WASM boyutu:', wasmBinary.byteLength, 'bayt');

// 2. Adım: Yükle
await tonyukuk.yukle(wasmBinary);

// 3. Adım: Export'ları incele
console.log('Export edilen fonksiyonlar:',
    Object.keys(tonyukuk.disa_aktarimlar));

// 4. Adım: Çalıştır
tonyukuk.disa_aktarimlar.main();

// 5. Adım: Bellek bilgisi
const bellek = tonyukuk.bellek_bilgisi();
console.log(`Bellek: ${bellek.kb} KB / ${bellek.mb} MB`);

Import Fonksiyonları

WASM modülü, bazı fonksiyonları JavaScript tarafından sağlanan import'lardan çağırır. Tonyukuk derleyicisi aşağıdaki import'ları kullanır:

Yazdırma Fonksiyonları

Import AdıİmzaTonyukuk KarşılığıAçıklama
_yazdir_tam(i64) → voidyazdır(42)Tamsayı yazdır + yeni satır
_yazdir_metin(i32 ptr, i32 len) → voidyazdır("metin")UTF-8 metin yazdır (işaretçi + uzunluk)
_yazdir_ondalik(f64) → voidyazdır(3.14)Ondalık sayı yazdır + yeni satır
puts(i32 ptr) → i32C uyumluluğu: null-terminated string yazdır

Bellek Yönetimi

Import AdıİmzaAçıklama
memoryWebAssembly.MemoryJavaScript'ten sağlanan paylaşılan bellek (16-256 sayfa)
__bellek_buyut(i32 sayfa) → i32Belleği belirtilen sayfa kadar büyüt

Matematik Fonksiyonları

Import AdıJavaScript Karşılığı
Math_sin, Math_cos, Math_tanMath.sin(), Math.cos(), Math.tan()
Math_sqrt, Math_pow, Math_absMath.sqrt(), Math.pow(), Math.abs()
Math_floor, Math_ceil, Math_roundMath.floor(), Math.ceil(), Math.round()
Math_log, Math_expMath.log(), Math.exp()

Yardımcı Fonksiyonlar

Import AdıİmzaAçıklama
rastgele() → f640.0-1.0 arası rastgele sayı (Math.random())
zaman_damgasi() → i64Unix zaman damgası milisaniye cinsinden (Date.now())
exit(i32 kod) → voidProgramı sonlandır. Sıfır dışı kodlar çıktıya yazılır.

Kendi Import Nesnenizi Yazma

TonyukukWasm sınıfını kullanmadan, kendi import nesnenizi yazarak WASM'ı doğrudan yükleyebilirsiniz:

const bellek = new WebAssembly.Memory({ initial: 16, maximum: 256 });
const cozucu = new TextDecoder('utf-8');

const ice_aktarimlar = {
    env: {
        memory: bellek,

        // Tamsayı yazdır
        _yazdir_tam: function(deger) {
            console.log(String(deger));
        },

        // Metin yazdır (işaretçi + uzunluk)
        _yazdir_metin: function(ptr, len) {
            const buf = new Uint8Array(bellek.buffer);
            console.log(cozucu.decode(buf.subarray(ptr, ptr + len)));
        },

        // Ondalık sayı yazdır
        _yazdir_ondalik: function(deger) {
            console.log(String(deger));
        },

        // C string yazdır (puts uyumluluğu)
        puts: function(ptr) {
            const buf = new Uint8Array(bellek.buffer);
            let len = 0;
            while (buf[ptr + len] !== 0) len++;
            console.log(cozucu.decode(buf.subarray(ptr, ptr + len)));
            return 0;
        }
    }
};

// WASM dosyasını yükle ve çalıştır
const yanit = await fetch('program.wasm');
const ikili = await yanit.arrayBuffer();
const { instance } = await WebAssembly.instantiate(ikili, ice_aktarimlar);

instance.exports.main();
Önemli: WASM i64 değerleri JavaScript'te BigInt olarak gelir. BigInt + "metin" hata verir! Yazdırırken mutlaka String(deger) kullanın.

Playground ile WASM Çalıştırma

Tonyukuk'un çevrimiçi playground'u, kod yazmak için en hızlı yoldur. WASM modu ile derlenen kod sunucuya gönderilir, .wasm binary olarak derlenir ve tarayıcınızda çalıştırılır.

Kullanım:

  1. tonyukuktr.com adresine gidin veya playground sayfasını açın
  2. “Backend” seçicisinden WASM (Tarayıcıda) seçin
  3. Kodunuzu yazın ve Çalıştır butonuna tıklayın
  4. Çıktı, çıktı panelinde görünecektir

WASM modunun farkları:

İpucu: Playground'da “LLVM” backend seçip “IR Göster” kutusunu işaretleyerek kodunuzun LLVM IR çıktısını da görebilirsiniz. Bu, derleyicinin kodunuzu nasıl dönüştürdüğünü anlamak için faydalıdır.

WASM Derleme API'si

Tonyukuk, programatik WASM derleme için bir HTTP API sunar. Bu API'yi kendi uygulamalarınıza entegre edebilirsiniz.

POST /api/compile-wasm

ParametreTipAçıklama
kodstringTonyukuk kaynak kodu (URL-encoded)

Başarılı yanıt:

HeaderDeğer
Content-Typeapplication/wasm
Content-LengthBinary boyutu (bayt)
GövdeWASM binary verisi

Hata yanıtı: HTTP 400 + düz metin hata mesajı

# curl ile WASM derleme
$ curl -X POST https://tonyukuktr.com/api/compile-wasm \
    -d 'kod=yazdır("Merhaba!")' \
    --output program.wasm

# Sonucu doğrula
$ file program.wasm
program.wasm: WebAssembly (wasm) binary module version 0x1

$ wasm2wat program.wasm | head -5
// JavaScript ile API kullanımı
const yanit = await fetch('/api/compile-wasm', {
    method: 'POST',
    headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
    body: 'kod=' + encodeURIComponent('yazdır(42)')
});

if (yanit.ok) {
    const wasm = await yanit.arrayBuffer();
    console.log('WASM boyutu:', wasm.byteLength, 'bayt');
} else {
    const hata = await yanit.text();
    console.error('Derleme hatası:', hata);
}

Sınırlamalar:

ParametreLimit
Kaynak kod boyutuMaksimum 8 KB
WASM çıktı boyutuMaksimum 512 KB
Derleme zaman aşımı15 saniye

Kapsamlı WASM Örnekleri

1. Merhaba Dünya

En basit WASM programı:

# merhaba_wasm.tr
yazdır("Merhaba Dünya!")
yazdır("Bu kod tarayıcıda çalışıyor!")
# Derleme
$ tonyukuk-derle --backend=llvm -hedef wasm merhaba_wasm.tr -o merhaba.wasm

# Boyut kontrolü
$ ls -la merhaba.wasm
-rw-r--r-- 1 user user 847 ... merhaba.wasm

Beklenen çıktı:

Merhaba Dünya!
Bu kod tarayıcıda çalışıyor!

2. Döngü ile Fibonacci Serisi

Döngü yapısının WASM'da nasıl çalıştığını gösteren örnek:

# fibonacci.tr — Fibonacci serisinin ilk 11 elemanı
işlev fib(n: tam) -> tam
    eğer n <= 1 ise
        döndür n
    son
    döndür fib(n - 1) + fib(n - 2)
son

döngü i = 0, 10 ise
    yazdır(fib(i))
son

Beklenen çıktı:

0
1
1
2
3
5
8
13
21
34
55

3. Faktöriyel Hesaplama

Rekürsif fonksiyon ve döngü birlikte:

# faktoriyel.tr
işlev fakt(n: tam) -> tam
    eğer n <= 1 ise
        döndür 1
    son
    döndür n * fakt(n - 1)
son

döngü i = 1, 10 ise
    yazdır(fakt(i))
son

Beklenen çıktı:

1
2
6
24
120
720
5040
40320
362880
3628800

4. Kareleri Yazdırma

Döngü içinde aritmetik işlem:

# kareler.tr — 1'den 8'e kadar kareleri yazdır
döngü i = 1, 8 ise
    yazdır(i * i)
son

Beklenen çıktı:

1
4
9
16
25
36
49
64

5. Koşullu Mantık

Eğer/değilse yapısının WASM'da çalışması:

# kosullu.tr
işlev mutlak(x: tam) -> tam
    eğer x < 0 ise
        döndür 0 - x
    son
    döndür x
son

yazdır(mutlak(5))
yazdır(mutlak(-3))
yazdır(mutlak(0))

Beklenen çıktı:

5
3
0

6. İç İçe Döngüler

# ic_ice.tr — Çarpım tablosu (1-5)
döngü i = 1, 5 ise
    döngü j = 1, 5 ise
        yazdır(i * j)
    son
son

JavaScript ile Tam Entegrasyon Örneği

Bir web sayfasında Tonyukuk WASM'ı kullanma:

<!DOCTYPE html>
<html>
<head>
    <title>Tonyukuk WASM Örneği</title>
</head>
<body>
    <textarea id="kod" rows="10" cols="50">
yazdır("Merhaba WASM!")
döngü i = 1, 5 ise
    yazdır(i * i)
son
    </textarea>
    <button onclick="calistir()">Çalıştır</button>
    <pre id="cikti"></pre>

    <script src="https://tonyukuktr.com/wasm/tonyukuk.js"></script>
    <script>
    async function calistir() {
        const ciktiEl = document.getElementById('cikti');
        const kod = document.getElementById('kod').value;
        ciktiEl.textContent = 'Derleniyor...';

        const tw = new TonyukukWasm();
        tw.ciktiCallback = function(metin) {
            if (ciktiEl.textContent === 'Derleniyor...') {
                ciktiEl.textContent = '';
            }
            ciktiEl.textContent += metin;
        };

        try {
            await tw.calistir(kod);
            const bellek = tw.bellek_bilgisi();
            ciktiEl.textContent += `\n[Bellek: ${bellek.kb} KB]`;
        } catch(e) {
            ciktiEl.textContent = 'Hata: ' + e.message;
        }
    }
    </script>
</body>
</html>

Bellek Yönetimi

WASM modülleri doğrusal (linear) bir bellek modeli kullanır. Tonyukuk WASM runtime'ı şu bellek yapılandırmasını kullanır:

ParametreDeğerAçıklama
Başlangıç boyut16 sayfa (1 MB)Program başlatıldığında ayrılan bellek
Maksimum boyut256 sayfa (16 MB)Büyüyebileceği üst sınır
Sayfa boyutu64 KBWebAssembly standart sayfa boyutu
Stack konumuBelleğin başı--stack-first ile ayarlanır

Bellek düzeni:

  0x00000    ┌──────────────────┐
             │    Stack          │  ← Fonksiyon çağrı yığını
  0x10000    ├──────────────────┤
             │    Data Segment   │  ← String sabitleri, global değişkenler
             ├──────────────────┤
             │    Heap           │  ← Dinamik bellek ayırma
             ├──────────────────┤
             │    (Boş)          │  ← Büyüme alanı
  max        └──────────────────┘

JavaScript'ten bellek durumunu sorgulayabilirsiniz:

const tw = new TonyukukWasm();
await tw.calistir(kod);

const bilgi = tw.bellek_bilgisi();
console.log(`Bellek: ${bilgi.bayt} bayt (${bilgi.kb} KB / ${bilgi.mb} MB)`);

// Ham bellekten veri okuma
const gorunum = new Uint8Array(tw.bellek.buffer);
console.log('İlk 16 bayt:', gorunum.slice(0, 16));
Not: WASM sandbox ortamında çalıştığı için, programlar dosya sistemi, ağ veya sistem çağrılarına erişemez. Yalnızca saf hesaplama ve yazdırma desteklenir.

Hata Ayıklama (Debug)

LLVM backend, DWARF format debug bilgisi üretir. Bu sayede GDB, LLDB gibi hata ayıklayıcılarla kodunuzu adım adım izleyebilirsiniz.

Debug Bilgisi ile Derleme

$ tonyukuk-derle --backend=llvm -g program.tr -o program

GDB ile Hata Ayıklama

$ gdb ./program
(gdb) break main
(gdb) run
(gdb) list              # Kaynak kodu göster
(gdb) print degisken    # Değişken değeri
(gdb) next              # Sonraki satır
(gdb) step              # Fonksiyona gir
(gdb) bt                # Çağrı yığını

LLDB ile Hata Ayıklama

$ lldb ./program
(lldb) breakpoint set --name main
(lldb) run
(lldb) source list
(lldb) frame variable

Debug Bilgisi Doğrulama

# DWARF bilgisini görüntüle
$ objdump --dwarf=info program | head -50

# Fonksiyon/satır eşlemesi
$ llvm-dwarfdump --name=main program

Üretilen Debug Metadata

Debug bilgisi şunları içerir:

Örnek IR debug metadata:

!0 = distinct !DICompileUnit(language: DW_LANG_C,
       file: !1, producer: "Tonyukuk Derleyici")
!1 = !DIFile(filename: "program.tr", directory: ".")
!4 = distinct !DISubprogram(name: "topla",
       file: !1, line: 4, type: !5)