Bir Konuda Dalga Geçerken Nasıl Programlama Dili Yazmaya Başladım?

Herkese merhabalar. Ağustos ayının sonuna yaklaşırken “Bir yazı daha yazayım ama bu sefer ne yazacağım?” diye düşünüyordum. Konu yok derken dün gece kendi kendine bir konu çıktı.

Evet, yine yapay zekâyla konuşuyordum.

Veri güvenliği, programlama dilleri ve insanların teknolojiyi zaman zaman olduğundan çok daha gizemli göstermesi üzerine biraz dalga geçiyordum. Konu bir şekilde Terry Davis, HolyC ve TempleOS’a kadar geldi. Oradan sonra da aklıma son derece tehlikeli bir soru geldi:

“Yani bir programlama dili yapmak gerçekten çok mu zor?”

Normal bir insan muhtemelen birkaç sayfa okur, compiler teorisinin derinliklerini görür, “Evet, zormuş.” der ve hayatına devam eder.

Benim verdiğim tepki ise:

“Oyuncak bir dil biz de yapalım.”

oldu.

Tabii ben yapay zekâya “Bana bir programlama dili yap.” deyip kenara çekilecek değildim. Daha ortada tek satır kod yokken saatlerce dilin kurallarını belirlemeye başladım.

“Bu olursa şurası bozulmaz mı?”, “Bunu böyle yaparsak eski davranış ne olacak?”, “Neden adı input olsun, ben buna take demek istiyorum?”, “Try-catch-finally olmak zorunda mı?”, “Null burada ne yapacak?”, “Bu sabitse bunun içindeki nesne de sabit mi olacak?” derken konuşma uzadıkça uzadı.

Daha Kod Yoktu Ama Dilin Kuralları Vardı

Mesela değişken tanımlamak için klasik = kullanmak istemedim. Tanımlama ile sonradan değer değiştirme birbirinden açıkça ayrılsın istedim:

score: Int := 10

Değeri değiştireceksek:

score = 20

Kullanıcıdan veri almak için input yerine take daha hoşuma gitti:

name: String := take("Adınız: ")
write("Merhaba " + name)

Hata yönetimine gelince de klasik isimleri aynen kopyalamak yerine dilin kendi ifadesi olsun istedim:

attempt {
    value: Int := int(take("Bir sayı: "))
}
except error: ValueError {
    write("Bu bir sayı değil.")
}
ultimately {
    write("İşlem tamamlandı.")
}

Başlarda sohbet daha çok “Şöyle yapsak eğlenceli olmaz mı?” şeklindeydi. Bir süre sonra yapay zekâ da her söylediğime “Olur.” demeyi bıraktı.

“Bu şekilde yaparsak şu kısım kırılır.”, “Bunu tavsiye etmiyorum.”, “Burada semantik belirsizlik oluşur.” gibi cevaplar vermeye başladı.

Ben de giderek daha çok:

“Peki eski davranışla uyumlu mu?”

diye sormaya başladım.

Sanırım projenin “oyuncak dil yapalım” seviyesinden çıktığı an da tam olarak buydu.

Bir Anda Gerçek Bir Compiler Ortaya Çıktı

Başlangıçta kafamdaki şey birkaç keyword, basit bir parser ve ekrana bir şeyler yazdıran küçük bir deneydi. Fakat kısa süre sonra elimizde şu yapı vardı:

AhdCode Kaynak Kodu
        ↓
Lexer
        ↓
Parser / AST
        ↓
Semantic Analysis
        ↓
Typed IR
        ↓
Go Backend
        ↓
Native Executable

Yani artık yazdığım .ahd dosyası gerçekten analiz ediliyor, tip kontrolünden geçiyor, arka tarafta Go koduna dönüştürülüyor ve native executable üretiyordu.

İşin ayrıca komik tarafı şu: Go konusunda derin bir tecrübem yok.

Bir tarafta yapay zekâ compiler teorisiyle, semantic analyzer ile, IR ile ve Go backend ile boğuşurken ben de sistemi denetliyor, “Bu böyle olmamalı.”, “Bu kurala aykırı.”, “Burada eski test kırıldı mı?” diye dolaşıyordum.

Hatta bilmediğim kavramlarla dalga geçmek sürecin en eğlenceli taraflarından biriydi.

Bir ara “panic test” gibi bir şeyden söz edince benim ilk tepkim şu oldu:

“Ne o, compiler ‘lan ben bunu nasıl çalıştıracağım’ diye korkuyor mu?”

oldu.

Sonradan Go’daki panic kavramının biraz farklı olduğunu öğrendim. Compiler şimdilik psikolojik olarak iyi durumda.

“İki Haftada Biter” Dediler

Proje biraz şekillenince hedefleri büyütmeye başladım. Komut satırından çalışsın, build alsın, formatter olsun, REPL olsun, GitHub’a koyabilelim derken:

“Bir gün GitHub’dan dosya indirip elle uğraşmayalım; normal program gibi kurulabilsin.”

demeye başladım.

Tahminen iki hafta gibi bir süre konuşuluyordu.

Ben de:

“Öyle mi?”

dedim.

Yaklaşık 24 saat içerisinde gerçekten çalışan bir programlama dili ortaya çıktı.

Elbette Python, Go veya C gibi onlarca yıllık bir ekosistemden bahsetmiyorum. Ama ortada artık gerçekten kaynak kodu analiz eden, hata veren, tip kontrolü yapan ve native executable üreten bir dil vardı.

Mesela basit bir döngü:

i: Int := 0
total: Int := 0
while i < 10 {
    total += i
    i += 1
}
write(total)

Fonksiyonlar:

square: Function := (
    value: Int
) -> Int {
    return value * value
}
write(square(12))

Sınıflar, kalıtım, hata sistemi, List ve Pair koleksiyonları, modüller, sabit değerler, runtime tip kontrolleri derken benim “oyuncak dil” giderek oyuncak olmaktan çıktı.

Sonra Bir de Logo Yaptım

İş biraz fazla ciddileşince fark ettim ki projenin adı var, GitHub deposu var, sürümleri var ama doğru düzgün bir logosu yok.

E tabii oraya kadar gelip logosuz bırakmak olmazdı.

Oturdum, AhdCode logosunu da hazırladım. Böylece “dün gece şaka olsun diye başladığım şeyin” artık logosu bile olmuş oldu.

AhdCode Logo Görseli

Sanırım insan yaptığı şeye logo tasarlamaya başladıysa artık “Sadece deniyorum.” bahanesi biraz zayıflıyor.

Standart Kütüphane Derken İş Yine Büyüdü

Dil çalışmaya başlayınca bu kez şu soru ortaya çıktı:

“Peki bununla ne yapacağız?”

Böylece standart kütüphaneyi büyütmeye başladım.

Önce Time, DateTime, Duration ve Calendar geldi.

bring Time
write(Time.Calendar.isLeapYear(2028))
write(Time.Calendar.daysInMonth(2028, 2))
start: Real := Time.monotonic()
Time.sleep(500)
elapsed: Real := Time.monotonic() - start
write(elapsed)

Modül isimlerini kısaltmak için genel alias yapısını da eklemeye başladık:

bring Time as T
write(T.Calendar.isLeapYear(2028))

Birkaç gün önce “programlama dili yapmak zor mu?” diye konuşuyordum. Şimdi import sisteminin geriye dönük uyumluluğunu tartışıyordum.

Sonra yine durmam gereken yerde durmadım.

Matematikle uğraşan biri olarak:

“LaTeX üretse güzel olmaz mı?”

dedim.

Böylece v0.1.5 için LaTeX desteğine kadar geldik. Hedef yalnızca .tex üretmek de değil; bilgisayarda ayrıca devasa bir LaTeX kurulumu gerektirmeden PDF üretebilmek.

Bunun için hafif bir Tectonic motorunu AhdCode dağıtımının parçası haline getirme çalışmasına başladık.

Kullanımın kabaca şöyle olması hedefleniyor:

bring Latex as L
body: String := ""
body += L.section("Giriş")
body += L.escape("Bu belge AhdCode tarafından üretildi.")
body += L.equation(
    "\\sum_{k=1}^{n} k = \\frac{n(n+1)}{2}"
)
source: String := L.document(
    body: body,
    title: "AhdCode Dokümanı"
)
L.pdf(
    source: source,
    output: "deneme.pdf"
)

Böylece bir gece önce:

“Programlama dili yapmak gerçekten çok mu zor?”

diye başlayan sohbet, kısa süre sonra:

“LaTeX motorunun çevrimdışı dağıtımını 250 MB’ın altında nasıl tutabiliriz?”

tartışmasına dönüştü.

Açık konuşmak gerekirse bu ikinci cümle önceki geceki planımda yoktu.

Yapay Zekâ Yazdı, Ben Ne Yaptım?

Burada önemli bir noktayı özellikle belirtmek istiyorum. AhdCode’un bütün kodunu tek başıma oturup yazdığımı iddia etmiyorum.

Yapay zekâ bu projenin geliştirme sürecinde ciddi biçimde kod üretti. Compiler teorisinin ayrıntılarında, Go backend tarafında, testlerin hazırlanmasında ve çok sayıda teknik noktada ciddi iş yaptı.

Ancak ben de sadece “devam et” butonuna basan biri değildim.

Dilin:

  • nasıl görünmesi gerektiğini,
  • hangi syntax'ın kabul edileceğini,
  • hangi davranışın hata sayılacağını,
  • tip sisteminin nasıl davranacağını,
  • null ve Constant kurallarını,
  • sınıf ve kalıtım yaklaşımını,
  • modül sistemini,
  • geriye dönük uyumluluk sınırlarını,
  • hangi özelliklerin özellikle eklenmemesi gerektiğini

saatlerce tartıştım ve belirledim.

Bazen projeye yaptığım en önemli katkı:

“Hayır, bunu yapmayalım. Dil saçmalaşır.”

demek oldu.

Bu süreç bana yapay zekâyla yazılım geliştirmenin yalnızca prompt yazıp kod beklemek olmadığını da gösterdi. Özellikle proje büyüdükçe üretilen kodu sorgulamak, testleri denetlemek, önceki kararlarla çelişip çelişmediğine bakmak ve bazen sistemi geri çevirmek gerekiyor.

Yapay zekâ kod yazarken sizin de ne istediğinizi gerçekten bilmeniz gerekiyor.

Bu Yıl İki Dil Ortaya Çıktı

Yazıyı hazırlarken fark ettiğim başka bir şey daha oldu.

Aslında bu yıl iki ayrı dil üretmiş oldum.

Birincisi, üzerinde çalıştığım kitabın dünyası için uzun zamandır planladığım yapay AHD dili. O, hikâyenin dünyasına ait ve uzun süredir hayatımdaki hedeflerden biriydi.

İkincisi ise AhdCode.

AhdCode kesinlikle planda yoktu.

Bir konuda dalga geçerken başladı.

“Çok mu zor?” diye devam etti.

Sonra GitHub deposu oldu.

Release’leri oldu.

Native executable üretmeye başladı.

VS Code ve Antigravity için extension'ı oldu.

Standart kütüphanesi büyümeye başladı.

Şimdi LaTeX üzerinden PDF üretmesini konuşuyoruz.

Bir sonraki aşamalarda ise düzgün macOS, Windows ve Linux kurulum paketleri hazırlamak istiyorum.

Bundan Sonra Ne Olacak?

AhdCode’un uzun vadede özellikle web tarafında da kullanılabilecek genel amaçlı bir dile dönüşmesi hâlâ gönlümde.

Fakat bundan sonra biraz daha yavaş ilerlemeye çalışacağım.

En azından bu cümleyi yazarken öyle düşünüyorum.

Yarın tekrar sabırsızlanırsam bu yazıyı delil olarak kullanabilirsiniz.

Öncelikle standart kütüphaneyi biraz daha oturtmak istiyorum. Dosya ve yol işlemleri, Regex, belge ve Excel üretimi, JSON gibi temel yapıların zaman içerisinde eklenmesi planımda.

Ardından AhdCode'u kullanıcıların GitHub'dan dosya indirip terminalde elle uğraşmak zorunda kalmayacağı bir hale getirmek istiyorum.

Planım:

macOS   → DMG
Windows → Setup.exe
Linux   → uygun kurulum paketi

Daha sonra kod tamamlama, hata gösterme, Go to Definition gibi özellikleri sağlayacak bir language server (LSP); ardından debugger ve sonrasında web tarafındaki kütüphaneler gelebilir.

Dil yeterince oturduğunda da AhdCode'u doğrudan ahdakademi.com üzerinden indirilebilir hâle getirmek istiyorum.

Sonuç

Bu projenin bana şimdiden öğrettiği en güzel şeylerden biri şu oldu:

Programlama dili geliştirmek gibi belirlenmiş bir hedefim yoktu. Sadece bazı şeylerin neden bu kadar karmaşık yapıldığına söyleniyordum.

Sonra:

“Ben olsam nasıl yapardım?”

sorusunun cevabını biraz fazla ciddiye aldım.

Belki AhdCode'u üç kişi kullanır. Belki yalnızca ben kullanırım. Belki birkaç ay sonra dönüp “Biz bunu niye yaptık?” diye tekrar gülerim.

Ama planda olmayan bir fikirden çalışan bir programlama dilinin çıkması benim için zaten başlı başına güzel bir deneyim oldu.

Bir sonraki yazıda ne anlatacağımı şu an bilmiyorum.

Sanırım bu yazının konusu da tam olarak bunu gösteriyor:

Hayat bazen plansız da güzel.

AhdCode'u merak edenler ve denemek isteyenler için proje bağlantısını aşağıya bırakıyorum. İleride kurulum paketleri hazır olduğunda çok daha kolay bir şekilde ahdakademi.com üzerinden de paylaşacağım.

AhdCode GitHub:
https://github.com/aliharundaldalli/AhdCode