Notlara dön

Proje

MiniSwift Hikayesi

· Proje · 9 dk okuma · Uğur Toprakdeviren

Bu yazıyı olabildiğince sade ve kafa şişirmeden tutmak istiyorum. Öncelikle kısaca kendimden bahsedeyim.

Uğur Toprakdeviren kimdir?

1986'da Türkiye'de, İzmir'de doğdum. 6-7 yaşlarında bilgisayar denen alete inanılmaz bir merak duymaya başladım.

1997 yılında bilgisayarlarla tanıştım ve 2000 yılında kod yazmaya başladım. 25 senedir sektörün içindeyim.

Asıl uzmanlık alanım JavaScript ve Apple ekosistemi.

Son 11 senemi de uygulamalı kriptografi ve uçtan uca mesajlaşma uygulamaları geliştirmekle geçirdim.

2009 senesinden bu yana iOS uygulaması geliştiriyorum; iOS 3.0'dan bu yana ekosistemin içindeyim.

2015 senesinden bu yana — Swift 1.1'di sanırım — Swift diliyle geliştirme yapıyorum. Tabii dil zaman içinde çok fazla evrim geçirdi. Merak edenler hikâyeyi şu linkten görebilir:

https://github.com/swiftlang/swift-evolution/tree/main/proposals

MiniSwift fikri

Bu fikir aslında yaklaşık 3 sene evvel, ilk başta, geliştirdiğim mesajlaşma uygulamasının WebView'de neden FPS stabil değil diye başladı. Özellikle son sohbetler ekranında scroll ederken neden FPS düşüyor diye düşünürken, "Acaba bunu canvas ile çizsem, stabil (bu önemli bir kelime) 60 FPS ve/veya 120 FPS yakalayabilir miyim?" diye düşündüm.

Bir deneme yaptım ve bingo: 60 stabil FPS sağlandı.

Daha sonra, mesajlaşma uygulamamın son sohbetler ekranını iOS'taki gibi çizebilir miyim diye uğraşırken, "O zaman SwiftUI elemanlarını canvasa birebir çizdirebilir miyim?" diye başladığım macera, sonunda çok basit, regex tabanlı SwiftUI elemanlarını canvasta çizen bir playground'a döndü. Ama hiçbir zaman içime sinmedi. Çünkü regex'i sevmiyordum ve doğru yol bu değil gibi hissediyordum.

Hedeften sapma

Ve burada basit olan hedefimden ciddi şekilde sapmaya başladım. O sıralar Metal dilini öğrenmeye ve denemeler yapmaya çalışırken, "Acaba Swift dilinin AST, lexer, parser, semantik analizini regex ile değil de GPU üzerinde ışık hızında yaptırabilir miyim?" dedim.

Çünkü Xcode öyle hantal ve yavaş çalışıyordu ki, sıfırdan açtığım proje iyi bir MacBook Pro M serisi cihazda bile preview'i açarken can çekişiyordu.

Ve bu Metal, GPU, lexer, parser meselesinde çok fazla vakit kaybettim; ama o günler kafamda bir sürü fikrin oturmasına yaradı.

O zamanlar Swift dosyalarında sadece parser ve AST işini o kadar ileri götürdüm ki, MacBook Air M3 8 GB RAM'li cihazda saniyede 800 milyon token'a kadar parse ettiğini görünce şok oldum.

Çeşitli projelerden topladığım yüz binlerce Swift dosyası vardı — ki bunların arasında Telegram, Mozilla vb. en büyük repolar da bulunuyordu — ve sadece parser, lexer, AST'yi 1 saniyenin altında yapabiliyordum.

Ama burada bir hata yaptığımı fark ettim: aslında benim GPU'da yapmam gereken iş, Unicode normalize işiydi.

Ve buradan https://decoder.run/ projesi doğdu.

Tekrar odak kaybı yaşadım. Kendimi sıfırdan Unicode 17.0 kütüphanesi yazarken buldum. Ama bu da yine çok işime yaradı, çünkü birçok projemde kullandım. Tamamen kendi işim için geliştirdiğim, GPU tabanlı ve SIMD CPU fallback destekli muazzam bir kütüphane elde etmiş oldum — ki bunu da açık kaynak ettim.

https://github.com/toprakdeviren/decoder

Decoder projesi arkasından BPE Tokenizer'ı ve en nihayetinde WebGPU tabanlı, sıfırdan yazdığım bir LLM projesi olan https://llm.istanbul'u getirdi.

Hedefe girme

Bu süreçte yavaş yavaş MiniSwift projesini bir yandan geliştiriyor, hem de fikri pişirmeye çalışıyordum.

Aslında ilk başta yapmak istediğim bir Swift Playground'du; çünkü artık elimde parser, lexer, semantik ve LSP algoritmaları vardı.

Ama bir problem vardı: stdlib. Evet, Apple'ın resmî kütüphanesinin tam kapsamını ne swift.org'da ne repoda ne de başka bir yerde çıkarabildim. swift.org'dan edindiğim, dilin lexer structure'ından başka bir şey olmadı desem yanlış olmaz.

Bu çok sinir bozucuydu, çünkü "stdlib ne zaman tamam olur?" sorusunu bir türlü cevaplayamıyordum.

Ama bu beni yavaşlatsa da engellemedi. En büyük problem, bu dili web'de offline olacak şekilde nasıl çalıştırabileceğimdi. IRGen mekanizmalarını öğrendim.

İlk başta LLVM ile denedim; ama araya ek bir katman koymak, LLVM toolchain'i zorlamak hoşuma gitmedi. O yüzden Swift stdlib'i WAT diline yakın bir seviyede çevirmeyi başardım.

Bu çok hoşuma gitti, çünkü artık Swift dilini bir ara dile çevirebilmiştim.

Bu şu demekti: artık bu ara dili istediğim yerde istediğim gibi tekrar çevirebileceğimi fark ettim.

Bir sonraki sorun ise SwiftUI kısmıydı. Bunun için de UI-IR adında (tamamen kendi uydurduğum) bir ara dile çevirdim. Bu ara dil, SwiftUI kodu ile Swift'in IRGen'den üretilmiş IR kodunu harmanlıyor ve bir liste hâlinde çıkarıyordu.

Bunu ilk yaptığımda yine şunu fark ettim: o zaman bunu sadece HTML5 Canvas'a değil, Compose'a, Windows Forms'a, Linux GTK'ya, Qt'ye çevirebileceğimi fark ettim.

Ama hâlâ bir problem vardı. Apple ekosistemi sadece stdlib ve SwiftUI değildi ki.

stdlib kütüphanesini bile doğru düzgün açıklamayan Apple'dan tüm framework'lerin bilgisini almak tam bir işkence oldu.

Bunun için ilk başlarda tüm Apple Developer dokümanlarını tek tek gezmeye başladım. Tam bir çile oldu. Sonra basit bir scraper yazdım. İstediğimi bir türlü elde edemiyordum.

İşin ilginç tarafı, Metal dili için Apple'ın RFC tarzında yayınladığı bir PDF (400 küsur sayfa) varken, Swift dili hakkında böyle bir dokümana denk gelmedim.

xcrun swift-synthesize-interface --include-submodules ile Apple'ın resmî olarak 305 tane public interface'ini aldım. Ve artık stdlib ve diğerleri için en azından elimde bir referans vardı.

Peki ya sonra?

Bundan sonra MiniSwift'in hedefi muhtemelen şu olacak: MiniSwift.run üzerinde Swift Playground dosyalarını hem açıp hem de görüntüleyebilecek light bir versiyonu olacak.

macOS, Linux ve Windows için de bir IDE olacak. Bu IDE'yi yine bir macOS uygulaması olarak Swift'te geliştiriyorum ve kendini ispatlaması için MiniSwift ile diğer platformlara derleyeceğim. Böylelikle insanları Electron zırvasıyla uğraştırmayacağım, umarım ;-)

Bir sonraki hedef, Apple platformları için yazdığınız kodların Android, Linux, Windows ve diğer platformlara derlenmesi; aynı zamanda diğer platformlarda — mesela Windows'ta — yazılan bir uygulamanın Linux ve macOS'ta çalıştırılabilmesi.

Ama bu hiçbir zaman emülasyon ya da simülasyon değil, native olacak şekilde yapabileceğime inanıyorum.

UT Yazan Uğur Toprakdeviren · 30 May 2026