Bu makale bir eğitim içeriğinden ziyade Rust‘ta asenkronluk mevzusuyla ilgili ulaştığım kanıları ihtiva edecektir. İnternette zibilyon tane eğitim içeriği mevcut olduğundan dolayı bir eğitim serisi başlatmayı planlamıyorum şimdilik ama açıkçası bunu yapmayı düşünmüyor da değilim. Çünkü internetteki eğitim serileri benim mevzuya bakış açıma ve bilgi birikimime uyum sağlamıyorlar genellikle. Birçok yazılımcının da aynı durumda olduğunu düşünüyorum. Bu yüzden belki ilerleyen zamanlarda bir eğitim serisi yapabilirim ama şimdilik sadece kendi gözlemlerimi ve ulaştığın sonuçları açıklayacağım burada.
Öncelikle eğer Javascript veya benzeri bir Garbage Collector içeren bir teknolojiden geliyorsanız şunu büyük bir önemle belirtmeliyim ki Rust kesinlikle öyle bir dil değil. Garbage Collector yani nam-ı diğer çöp toplayıcı altyapısına sahip teknolojiler arkaplanda dönen birçok olayı bizden gizliyorlar. Bu yüzden birçok önemli konu hakkında bilgisiz kalıyoruz. Evet bu tarz dillerde proje geliştirmek kolay oluyor fakat bu kolaylığın tabiki bir karşılığı yani cezası oluyor aslında. Bu cezalar performanssız çalışan bir proje, yazılımcının birçok önemli konu hakkında cahil kalması ve mantığımızın körelmesi. Yazılım geliştirmek gibi önemli bir meziyetimiz var fakat bunu gerçek anlamda değerlendiremiyoruz. Bu şuna benziyor: bir Ferrari Laferrari arabamız var ama 50 KM’den yukarı gitmiyoruz.
Herneyse konumuza dönersek Rust‘ta asenkronluk olayı GC içeren dillerdeki gibi kafamıza göre heryere asenkron fonksiyonlar yazarak ve bunları Promise‘ler ile adeta bir dans ustası gibi kombine ederek yapılabilen bir konu değil. GC olmamasından ve Rust‘ın muhteşem ownership özelliğinden dolayı birçok kuralın ayağına basmadan asenkronluk konusunu halletmemiz gerekiyor. Örneğin Javascript‘te bir asenkron fonksiyonu çağırdığınızda derhal bu fonksiyon çalışmaya başlar ama bunun bitmesini beklemeyiz ve derhal bir sonraki satırdaki fonksiyona geçilir. Rust‘ta iş bu kadar kolay olmuyor. Rust‘taki asenkron fonksiyonlar size bir Future
dönderir. Future
trait ise hemen çalışmaz. Bunları çalıştırmak için bir runtime’a ihtiyaç vardır. Rust‘ın temel seviyede bir runtime’ı var fakat bu productionda tercih edilen bir sebze değil. Gördüğüm kadarıyla şuan piyasada en iyi runtime tokio
isimli kütüphanedir.
tokio
ilk bakışta biraz değişik bir kütüphaneye benziyor. Anlamsız kuralları ve kullanım şekilleri varmış gibi geliyor. Fakat işin derinlerine girdiğinizde bu kütüphanenin ne kadar büyük bir iş başardığını daha net bir şekilde görüyorsunuz. Bu kütüphane baremetal işlemcilerde çalıştığı gibi webassembly gibi ortamlarda da çalışmaktadır. Ayrıca birşeyin asenkron olabilmesi için event loop denilen yapıya sahip olmak gerektiğini ve bunu implement etmenin ne kadar zor ve önemli olduğunu da anladığınızda Rust‘a ve tokio
kütüphanesine bir kez daha hayran kalıyorsunuz. Future
dönderen bir fonksiyonu yani diğer bir deyişle asenkron bir fonksiyonu çalıştırmak için iki yöntem var. Birincisi await
, ikincisi de tokio::join!()
makrosu. Await yöntemiyle sadece bir tane Future
trait (yada diğer ifadeyle asyn fn
) çalıştırabiliriz ve peş peşe async fonksiyonları çalıştırmak için hepsine sırasıyla await
yazmak gerekir ki bu yöntem senkron olarak kod yazdığınız anlamına gelir. Peki birden fazla async fn’i aynı anda nasıl çalıştırabiliriz? Bunu Javascript’te Promise class’ı ile yapıyorduk fakat malesef Rust’ta böyle bir class yok. Onun yerine başka bir yöntem var. Bu yöntemin adı da tokio::spawn(async move { ... })
yöntemi. Örnek kod paylaşmak isterdim ama buradaki amacımı tekrar hatırlatayım. Burada sadece edindiğim anlamsal sonuçlardan bahsedeceğim bu yüzden kod paylaşma gereği hissetmiyorum. GC tabanlı dillerle Rust arasındaki konuya bakış açıları farklarından bahsediyorum yani.
Hiç Javascript‘in arkaplanda bu Promise denen sebzeyi nasıl implement etmiş olabileceğini düşünmüş müydünüz? Düşünmediniz, ben de düşünmemiştim, sadece kullanıp geçtim ama işin derinlerine indiğimizde eskiden programlama yapmadığımızı sadece legolarla oyun oynadığımızı ve gerçek programlamaya Rust sayesinde adım attığımızı hissetmeye başlıyoruz. Ve bu da Rust’a bir kez daha hayran kalmamızı sağlıyor. Adeta buğulu bir perdenin arkasından dünyayı görmeye çalışan beynimizin içindeki gözlerimiz Rust tarafından uyandırılmış ve artık herşeyi daha net görüyormuşuz gibi hissediyorsunuz değil mi? En azından ben öyle hisediyorum.
Tabiki bu konu uzar gider. Anlatılacak ve açıklanacak çok konu var fakat hem hayatın bize dayatmış olduğu bazı sebeplerden dolayı (örn. kısıtlı zaman) hem de insanoğlunun duygusal yapısının aşırı bilgi içeren yazılara uzun süre katlanmasını engellemesinden dolayı biryerde bu konuyu sonlandırmam gerekiyor. Yazıların ve konuşmaların kapanış kısmını yapma konusunda pek başarılı olduğumu söyleyemem. Bu yüzden makaleyi şu cümleyle bitirmek istiyorum. Beynimizin ortasındaki gözün üzerindeki perdelerin kaldırılması dileğiyle, sağlıcakla kalın.
0 yorum