Sosyal medya hesaplarımdan ara sıra MiniSwift, MiniKotlin ve MiniSharp platformları ve bunların üst çatısı olan Kavak ile multi-platform çözümlerime dair yaptığım çalışmaları parça parça paylaşıyorum ama haliyle bu biraz kafa karıştırıcı oluyor.

O yüzden biraz daha derli toplu anlatmaya, neleri çözdüğümü, neleri çözebileceğimi anlatmaya çalışacağım.

Bilgisayar tarihinin en büyük problemi hangisi desek, herhalde taşınabilirlik problemi diyebiliriz. Yanlış hatırlamıyorsam 1930 larda Zuse'nin Z1 inden evvel, yazılan program, her çalıştırılmak istendiğinde baştan derlenmesi gerekiyordu.

Sonrasında bu problemler sırayla çözüle çözüle bugüne kadar geldik. Java ilk çıktığı zamanda ki sloganlarını hatırlıyorum (ki o zamanlar adı Oak idi ;-) ).

Öyle bir dil geliştirdik ki, Buzdolabınız ile Kahve makineniz haberleşebilecek.

Hmm ilginç bir iddia ama bu iddia aslında, yazılan programın her platformda sorunsuz çalıştırılabileceğine dair motto'nun biraz süslenmiş reklam haliydi. (XML ile haberleşeceklerini kastediyorlardı)

Evet o günlerde bu iddia öylesine etkili oldu ki, Java dili ile hiç alakası olmayan, Javascript bile bu rüzgarı arkasına alıp, VB-Script Visual Basic'in subset dili olması gibi sanki Java'nın subset diliymiş gibi, Java-Script adını aldı.

Brendan Eich'i tebrik ederim. Senelerce yazılımdan anlamayanların "Java-Javascript aynı şey işte" geyiği ile çok dalga geçildi. Reklam'ın iyisi kötüsü olmaz. Çok yakışıklı bir hile olmuş. ;-)

Bu kısa magazinden sonra Kavak'ın iddiasına gelelim. MiniSwift ve diğer platformların 3 senelik bir geçmişi var. İlk başladığım zamanlarda acaba SwiftUI kodlarını Web Canvas'da çizsem, stabil 60FPS yakalayabilir miyim sorusunun cevabını arıyordum. Sonrasın da bu işin böyle olmayacağını anlayarak, 3 senelik geliştirme ve bir çok hedeften sapma sonrasında iş bu noktaya kadar geldi.

MiniSwift hikayesini anlatmayayım hem yazı çok uzar, hem de sıkıcı olabilir. MiniSwift'i geliştirdikten sonra acaba diğer dillerde de aynı yaklaşımı uygulayabilir miyim dedim. MiniKotlin ve MiniSharp'ı denemeye başladım.

Ama iş öyle bir noktaya geldi ki, artık her platform için aynı kodları ayrı ayrı yazmaya başladım. Garip bir şey farkettim. İyi de bu dillerin STD Lib leri yani temel sağladığı fonksiyonlar şaşırtıcı derecede birbirine benziyordu.

Temelde hangi işleri yapıyordum. Öncelikle Frontend.

Temelde MiniSwift, MiniKotlin ve MiniSharp ve bonus olarak Metal. Hepsinde dili önce kendi yazdığım unicode normalizasyon a soktuktan sonra, bunları tokenize edip, sonrasında anlamlandırmak için structlar oluşturdum. Yani AST.

let a = 1

"let, a, =, 1" parse etmesi kolay ama let bir sabit a bir değişken = atama ve sonunda tipi :D zor olan kısmı da bu AST işleri. Çünkü her dilin kendine has özellikleri var. Burada ayrışma başladı ama sorun değil hepsini hallettim ki burası gerçekten basit olan kısım.

IR (Intermediate Representation)

Breh breh breh. Çok havalı bir isim. Uzun seneler LLVM kitapları okumaktan kaçındığımı hatırlıyorum. Ne zaman bu aşkım kabarsa ve LLVM'in web sayfasına girsem, 30 dakka geçirdikten sonra her defasında, "yok ya adamlar fende çok ilerlemiş", "ya bu koca metal uçak havada nasıl uçuyor" tadında UFO gören masum köylü gibi vazgeçtim.

Burada belki LLVM'in web sayfasının da UX açısından göz korkutmasıda vardır ama %99 problem bende. Chris Lattner'ı kızdırmayalım çünkü zaten MiniSwift'i kodlarken onu bir hayli andım ;-)

Aslında olayın o kadar abartılacak bir tarafı yok. Şöyle ki, zaten dili bir kere parçalamayı başardıktan sonra, onu kendi neşenize göre, ara bir dile çevirmeniz gerekiyor. Biraz zahmet uykusuz haftalar, bir dünya problem, determenizmi sağlamak için verilen kavgalar sonrasında rahatlık ;-) işte bu kadar.

Bir dili IR seviyesine indirdiğiniz zaman artık, o dil sizin oluyor. Ne isterseniz yapın. Ve ben kısıtlı olan vaktimi, LLDB gibi araçları geliştirmektense, multi-platform ve taşınabilirlilik sorununu çözmek için ayırdım.

MiniSwift için ara dil MIR. Çok düşünmedim üzerine :D. Bu ara dile indirtikten sonra artık elimde çok güçlü bir silah olduğunu farkettim. Bir dk bunu acaba Android'e çevirebilir miyim. İlk başta safça gidip kotlin diline çevirmeye kalktım ama bu hatamdan hemen vazgeçtim. Çünkü Swift->IR->Kotlin->Java ohooo :D suyunun suyu.

Şu yolu tercih ettim. Swift->IR->C bu kadar.

JNI ile C köprüsünü kurduktan sonra bingo. Swift projesini Android'e sorunsuz derlemeyi başardım.

Peki bunun ispatı nasıl olacaktı. İşte bu çok zor bir konu. Bu yazı yazıldığı tarihten 26 Temmuz 2026'dan yaklaşık 3 ay önce olması lazım Github'dan random yaklaşık 1500 tane Swift ile yazılmış XCode projesi indirdim. Ve onları en başından sonuna MiniSwift ile derledim.

Yaklaşık 800 tanesini saniyeler içinde, Hem Web hem Native (burada Native'den kasıt, Windows ve Linux. Evet saçma oluyor ama Mobile, Web, Desktop derken kafam biraz yanıyor kusura bakmayın) Android'e derlemeyi başardım. Bu benim için çok büyük bir başarıydı. Kalan 700 tanesi ise, henüz benim o günler için desteklemediğim, SwiftData, CoreData, SpriteKit, CoreImage ki şu an bunların tamamı MiniSwift de var frameworklerden kaynaklanıyordu. Testleri tekrar koşmadım çünkü artık daha büyük bir hedefin peşindeyim. Kavak Mutli-Platform Çözümü.

UI-IR (UI Intermediate)

Haddimi bilerek konuya dönüyorum ;-) UI-IR ile yaptığım şey MiniSwift için tam bir dönüm noktası oldu. Hani yazının başında, SwiftUI'ı canvas'a çevirebilir miyim diye basit bir çözüm düşünüyordum demiştim ya. Hah işte onun sonucu bu oldu.

SwiftUI dekleratif bir yapı malum. Dil diyemiyorum. Bu bana biraz HTML benzeri bir yapıyı andırıyor. Evet bir çözümün programlama dili olarak sayılabilmesi için if-else olması lazım. SwiftUI'da var mı?

Her neyse,  SwiftUI declerative yapısını kendi ara UI-IR structuna çevirdim. Ama burada bir problem vardı. Sadece SwiftUI'i ara dile çevirmek, işin sadece bir ayağı idi. Çünkü SwiftUI kendisi Swift dili ile çok sıkı bir şekilde iletişim halinde. O noktada işte, kendi yazdığım MIR (MiniSwift IR) ile UI-IR i haberleştirmem çözüme ulaşmama yetti.

Artık dil farketmeksizin, Combine Framework'ü Swift kodu ile beraber IR ye döndüğü için, UI-IR ile rahatça haberleşebilir hale geldi. Çok tatlı bir çözüm oldu. Çünkü Combine ile yazdığım SwiftUI kodu Android ve diğer platformlarda birebir çalışır hale geldi :D

Hobaa bir anda kendimi şöyle hissettim.

Neşeli bir müzikal kutlama
Neşee, neşeee.

Peki SwiftUI UI-IR diğer platformlarda nasıl çalışır hale geldi. Evet anladık dili bir şekilde çevirdin de kardeş diyebilirsiniz.

Hemen şöyle anlatayım. UI-IR struct'ını çıkardıktan sonra Figma'dan tüm platformların tasarımlarının SVG lerinden tasarımları aldım. Ve istediğim platformdaki arayüz kodu ile değiştirmeye başladım.

Tabi bu noktada ufak bir zorluk var. Mesela SwiftUI'da olan bir component Android ya da diğer platformlarda olmayınca, araya ufak bir kaynak yapıp, o noktada o componenti yazdım. E o kadarda hile kabul edilebilir bence ;-)

Diğer Multi-Platformlar

Genel de biz yazılımcılar bir çözüm ararken eğer daha önce yapılmış bir versiyon varsa, o noktada biraz ümitsizliğe kapılabiliyoruz. Zaten ReactNative, Flutter, hatta artık her platform mesela .NET bile iOS a outuput alabildiğini iddia ediyor.

Bu noktada hiç ümidim kırılmadı. Çünkü bu yaklaşım bana yanlış geliyordu. Sebepleri ise;

  1. Sizin zaten geliştirdiğiniz proje ve dil varken, siz bu platformu tüketecek kişiye diyorsunuz ki, kardeş bildiğin dili, geliştirdiğiniz projeyi unut. Gel Dart ile baştan yaz. Tamam hemen. :D
  2. Çözümler belki de çok klasik. Flutter, .NET vs SKIA gibi hazır motorların üzerine bunu kurup, e al işte, tüm platformlarda çalışıyor diyor. Ama burada bu hoşuma gitmiyor. Çünkü native olmuyor.

Bu biraz da benim kendi yaklaşımımdan kaynaklanıyor. SML (sml.run) kendi geliştirdiğim PQ, MLS ve DoubleRatchet ile, birebir ve grup için uçtan-uca şifreli anonim mesajlaşma uygulaması. Burada da benzer bir yaklaşımı gözettim. Tüm kodların tamaı nerdeyse C de yazıldı. Üst tarafta sadece UI kodları ayrı idi. O yüzden, Web, Android, iOS, ve Desktop'a sadece UI kodu yazmam gerekti.

Yani velhasıl, aslında yaptığım şu; Think Different ;-)

Sonsöz

Artık lafı toparlayayım çünkü uzadıkça hem sıkıcı olabiliyor, hem de derdimi anlatmak da zorlanabiliyorum.

Kavak multi-platform çözümü olma yolunda emin adımlarla ilerliyor. Zamanla arkasındaki mantığı uzun uzun yine anlatırım.

Sağlıcakla kalın ;-)