2021 Rust Dilinin Yılı Olabilir Mi?

Son 2 senedir bir dil dikkatimi çekiyor. Ve bu dilin benim dikkatimi çekmesi sadece benimle alakalı da değil. Pek çok kişinin de dikkatini çekmiş olmalı ki StackOverflow anketlerine göre bu dil, arka arkaya son dört yıldır en sevilen programlama dili oldu. Hatta Github Octoverse dil kullanım istatistiklerinde de son 2 senede en çok topluluğu gelişen dil oldu. Bu dil Rust.

Rust’u deneyen çoğu insan onu kullanmaya devam etmek istiyor. Ancak kullanmadıysanız merak edebilirsiniz. Rust nedir, neden bu kadar özel ve geliştiriciler arasında onu bu kadar popüler yapan nedir?

Bu yazıda, Rust hakkında aklınıza takılan tüm soruları hızlı bir şekilde anlatmaya ve yanıtlamaya çalışacağım.

Rust nedir?

Rust, güvenlik ve performansa odaklanan, düşük düzeyli, statik olarak yazılmış, çok paradigmalı bir programlama dilidir.

Rust, bellek hataları ve eşzamanlı programlar oluşturma gibi C/C ++ ‘nın uzun süredir uğraştığı sorunları çözer. Bu sorun aslında dile ait sorunlardan ziyade derleyiciye ait sorunlardır. İşte Rust tam bu noktada çıkmıştır. Mozilla Geliştiricilerinin C ve C++ üzerine yayılmış projelerinde sıkça yaşanan bellek hatalarına çözüm ararken yeni bir derleyici geliştirmeye başlamışlar ve bu derleyici zamanla Rust dilinin iskeletini oluşturmuştur. Ve bugün bu derleyici Rust’a evrilmiştir.

Rust’ın üç ana faydası vardır:

Şimdi bunların her birini sırayla inceleyelim.

Rust Derleyici

Sistem programlaması yapmak istiyorsanız, bellek yönetiminin sağladığı düşük seviyeli kontrole ihtiyacınız vardır. Maalesef, manuel yönetim C gibi dillerde birçok sorunla birlikte gelir. Valgrind gibi araçların varlığına rağmen, bellek yönetimi sorunlarını yakalamak zordur.

Rust bu sorunları önler. Rust’un sahiplik sistemi, programın bellek yönetimini derleme zamanında analiz ederek zayıf bellek yönetiminden kaynaklanan hataların olmayacağından ve çöp toplamanın gereksiz olduğundan emin olur.

Ayrıca, süper optimize edilmiş uygulamaları C benzeri bir şekilde yapmak istiyorsanız, bunu güvenli olmayan anahtar kelimeyle kodun geri kalanından açıkça ayırarak yapabilirsiniz.

Bunlar önemli mi? Evet. Örneğin, son 12 yılda Microsoft tarafından ele alınan sorunların yaklaşık %70’i bellek hatalarıdır. Google Chrome üzerinde en fazla uğraşılan yanı bellek optimizasyonlarıdır.

Daha kolay eşzamanlılık

Rust ödünç alma denetleyicisi sayesinde derleme sırasında veri yarışlarını önleyebilir.

Veri yarışları, iki iş parçacığı aynı belleğe aynı anda eriştiğinde meydana gelir ve bazı kötü, öngörülemeyen davranışlara yol açabilir. Neyse ki, Rust’un amacı tanımlanmamış davranışları önlemek. Derleme esnasında bu tip öngörülemeyen davranışları düzenleyecek bir eşzamanlılık sistemine sahip.

Sıfır maliyetli soyutlamalar

Soyutlama, nesneye yalnızca ilgili ayrıntıları göstermek için daha büyük bir havuzdan veri seçmektir. Programlama karmaşıklığını ve çabayı azaltmaya yardımcı olur. Ancak OOP (nesne tabanlı programalama) dillerinin çoğunda bu soyutlama belli bir maliyete sahiptir.

Sıfır maliyetli soyutlamalar, kullandığınız soyutlamalar için neredeyse hiç çalışma zamanı yükü olmadığından emin olun. Daha basit bir deyişle: Düşük seviyeli kod ile soyutlarla yazılmış kod arasında hız farkı yoktur.

Rust ne işe yarar?

Rust oldukça düşük seviyeli bir dil olduğundan, sahip olduğunuz kaynaklardan daha fazla yararlanmanız gerektiğinde kullanışlıdır. Rust dili derleyicileri programlarınızı hem statik hem de paylaşımlı kütüphanelere ayırarak yazabilmenize imkan verir.

Statik olarak yazıldığından, tür sistemi derleme sırasında belirli hata sınıflarını engellemenize yardımcı olur. Bu nedenle, kaynaklarınız sınırlı olduğunda ve yazılımınızın başarısız olmaması önemli olduğunda Rust’ı kullanma eğiliminde olacaksınız.

Kütüphaneler konusunda kendi bağımlılık ağacına sahiptir ve C dilinde olduu gibi farklı bağımlılık yönetimi araçlarına ihtiyaç duymazsınız.

Rust düşük seviyeli bir dil olduğu için oldukça optimizedir ancak prototipleme işlemleri için çileli olabilir. Buna karşılık, Python ve JavaScript gibi üst düzey dinamik olarak yazılmış diller, hızlı prototipler gibi şeyler için daha iyidir.

Rust’un kullanım örneklerinden bazıları şunlardır:

Örneğin, Rust’ta yazılmış birkaç işletim sistemi: Redox, intermezzOS, QuiltOS, Rux, Tock.

Rust nesne odaklı mı?

Günümüzde nesne odaklılığın ne anlama geldiğini kim bilebilir? Sonuçta bazı diller bile gerçekten nesne tabanlı olmasa bile nesne tabanlı olduğunu iddia ediyor.

Gel gelelim sorumuzun cevabına. Rust tam manası ile nesne odaklı değil. Rust’un bazı nesneye yönelik özellikleri vardır: Yapılar oluşturabilirsiniz ve bunlar, kalıtımdan çıkarılmış sınıflara benzer şekilde, bu veriler üzerinde hem verileri hem de ilişkili yöntemleri içerebilir. Ancak Java gibi dillerin aksine Rust, mirasa sahip değildir ve bunun yerine çok biçimlilik elde etmek için özellikleri kullanır.

Yani aslında C’de eksik olan ve OOP’ye ait bazı özellikleri içerisinde barındırırken Java veya C++ gibi tam bir nesne tabanlı programlama altyapısına sahiptir.

Rust işlevsel bir programlama dili midir?

Rust, yüzeysel olarak C’ye oldukça benzese de, ML ailesinden büyük ölçüde etkilenmiştir. (Bu aile OCaml, F# ve Haskell gibi dilleri içerir.) Örneğin, Rust’ın bazı özellikleri temelde Haskell’in tip sınıflarına çok benzer ve Rust Haskell’in sahip olduğu çok güçlü kalıp eşleştirme yeteneklerine sahiptir.

Rust, işlevsel programcıların genellikle alışkın olabileceğinden daha fazla değişkenlik özelliğine sahiptir. Şöyle düşünebiliriz: Hem Rust hem de F# paylaşılan değişken durumdan kaçınmaya çalışır. F# değişken durumdan kaçınmaya odaklanırken, Rust tehlikenin paylaşılan kısmından kaçınmaya çalışır. Rust ayrıca, kuyruk arama (tail call) optimizasyonu ve işlevsel veri yapıları için iyi destek gibi işlevsel programlamayı kendi içinde yapılabilir kılacak pek çok şeyi de kaçırıyor.

Sonuç olarak, Rust’ta birisinin onun hakkında bir kitap yazması için yeterli işlevsel programlama desteği var. Ve hatta zaten topluluk tarafından yazılmış bu tip kitaplar da var.

Rust ile Neler Yapılabilir

Rust halihazırda Linux programcıları tarafından sıklıkla kullanılmakta. GNOME içerisindeki bazı parçaçıklar Rust ile yeniden yazdıldı. Yakın zamanda Linux çekirdeği için de Rust ile modül yazabilme desteği geldi. Buna ek olarak topluluk tarafında da pek çok proje var. Sistem programlayanlardan (bkz. Redox) güvenlik araçları yapanlara kadar (bkz. lethe) ve hatta oyun geliştirmeye kadar (bkz. Kiss3D) pek çok alanda kullanılıyor.

Rust oyun geliştirme için iyi mi?

Teorik olarak evet. Rust performansa odaklandığından ve çöp toplayıcı kullanmadığından, içinde yazılan oyunlar performanslı ve tahmin edilebileceği gibi hızlı olmalıdır.

Ne yazık ki ekosistem hala genç ve örneğin Rust’ta Unreal Engine ile karşılaştırılabilecek hiçbir şey yazılmıyor. Yine de parçalar orada ve Rust’un canlı bir topluluğu var. Rust’ta yazılmış oyun örneklerini görmek istiyorsanız, Rust oyun geliştirici alt dizini “Are We Game Yet?” sayfasına gidebilirsiniz.

Rust web geliştirme için iyi mi?

Rust, Actix Web ve Rocket gibi web geliştirme için çok kullanışlı ve iyi oluşturulmuş birden fazla geliştirme ortamına sahiptir. Özellikle, saf hız arıyorsanız, Actix Web, en hızlı web geliştirme ortamı olarak gösterilmekte

Yine de Rust, Django ve Rails gibi ekosistemlerle rekabet edebilecek hiçbir şeye sahip değil. Rust oldukça genç bir dil olduğundan, pek çok kullanışlı yardımcı kitaplık eksiktir, bu da geliştirme sürecinin o kadar basit ve kolay olmadığı anlamına gelir.

Rust’ta web geliştirme hakkında da oyun geliştirme ile benzer bir sayfa var. “Are We Game Yet” sayfası üzerinden web geliştirme araçlarına bakabilirsiniz.

Rust’u Özel Yapan Şeyler

Rust’un pek çok düzgün araç ve model tasarım ile gelir. Örneğin TL;DR Rust, hızlı tutarken bellek güvenli ve iş parçacığı güvenli uygulamalar yazmak için güçlü bir araçtır. Büyük bir potansiyele sahip olsa da, şu anda hatırı sayılır kütüphane desteğine ihtiyaç duyulan alanlarda Rust seçiminin garanti edilip edilmediği belirsizdir. Ayrıca Rust’un öngördüğü dil modelleri de oldukça güçlüdür.

Veri sahipliği modeli

Rust’u özel kılan şeylerden biri olan ödünç alma kontrolüne geçelim.

Rust’ta veri sahipliğini açıklamaya başlamak için, sizi düşük seviyeli programlamada iki tür bellekle tanıştırmam gerekiyor: yığın ve yığın.

Yığın (Stack), statik bellek ayırma için kullanılırken, öbek (Heap) dinamik bellek ayırma için kullanılır. Daha basit bir deyişle: yığın, bellek boyutunu bildiğimiz şeyler için (Rust’ta bellekte dizgi olan tamsayılar veya str gibi), öbek ise boyutu önemli ölçüde değişebilen şeyler içindir (normal bir String). Buradaki olay aslında Java’nın durumuna benzer: int char gibi veriler primitive veri tipleri için Rust’ta yığın, String gibi türetilmiş veri tipleri de öbek olarak adlandırılır Bu değiştirilebilir şeylerle çalışmak için, yığın üzerinde onlar için alan ayırırız ve yığın üzerindeki bu alana bir işaretçi koyarız.

Veri Hareketliliği (Moving)

Ancak bir sorun var: İki değişkene yığın üzerindeki aynı veriye bir işaretçi atanmışsa ne yapmalı?

Örnek vermek gerekirse iki değişkene aynı verilere bir işaretçi atandığı durum, değişkenlerden birini alttaki veriyi değiştirerek değiştirmeye çalışırsak, diğeri de değişecektir ki bu genellikle istediğimiz bir şey değildir.

Aynı verilerle çalışan iki iş parçacığı varsa aynı (ve daha da kötüsü) durum olur. Aynı verilerle çalışan iki iş parçacığı, bu iş parçacıklarından birinin diğerinin ondan okurken öbekteki veriyi değiştirip değiştirmediğini hayal edin. Bu durumdaki belirsizliğe veri yarışı diyoruz. Her dil kendince bu belirsizliği belirli bir şarta bağlamayı benimser.

Rust’ta yalnızca bir değişken belirli bir veri parçasına sahip olabilir. Bu verileri başka bir değişkene atadığınızda, ya taşınması ya da kopyalanmasını gerektirir.

Bir örnek vermek gerekirse:

let mut s1 = String::from ("Shakespeare'den bir repliği tekrarlayan tüm erkekler William Shakespeare'dir.");
let mut s2 = s1;
s1.push_str("- Jorge Luis Borges");

Bu, verilerin sahipliği s2‘ye taşındığı ve s1‘e artık taşıma sonrasında erişilemediği için derlenmez.

Veri Borçlanması (Borrowing)

Şimdi, sahipliğin manuel olarak taşınması oldukça zahmetli çünkü her zaman geri verdiğinizden emin olmanız gerekiyor.

Bunu çözmek için değişkenlere referans oluşturarak ödünç alabiliriz. Bu referansların kullanılması sahipliği aktarmaz, ancak değişkeni okumamıza (değişmez referans veya &) veya hatta değiştirmemize (değişebilir referans veya mut &) izin verir. Bu olaya biz veri borçlanması diyoruz.

Ancak, birden fazla değişken referansa sahip olmak, birden fazla sahibin olmasıyla aynı anlama geleceği için referanslarda sınırlamalar vardır.

Bu nedenle derleyici, verilere referans vermek için bir kural uygular.

Borçlanma ve referens verme işlemi için her bir veri için aşağıdaki işlemlerden yalnız birini yapabilirsiniz:

Bu metaforu açıklamak gerekirse: Powerpoint sunumu olarak belirtilen verileri düşünün. Sunuyu düzenleyebilir (değişebilir referans) veya istediğiniz sayıda kişiye sunabilirsiniz (değişmez referenas), ancak eğer düzenlenirken sunulursa, ilgili bölümde başlıklar yuvarlanabilir (salt okunur referans).

Rust ve C ++

Rust’u özel yapan şeyin ne olduğunu artık bildiğimize göre, onu diğer ana sistem programlama dili olan C ++ ile karşılaştırabiliriz.

Rust ve C ++ karşılaştırması

Neden Rust’u C ++ yerine seçmelisiniz?

C++ ‘da, geliştiricilerin tanımsız davranışlardan kaçınmaya çalışırken pek çok hatayla karşılaşır. Rust’ta ödünç alma denetleyicisi, tasarım gereği güvenli olmayan davranışlardan kaçınmanızı sağlar ve bu tip durumları derleme esnasında kullanıcıya dönderir. Bu, bütün bir böceği (bug) ortadan kaldırır ve bu oldukça önemlidir.

Ayrıca Rust, çok daha modern ve bazı yönlerden daha iyi tasarlanmış bir dildir. Özellikle, güçlü tip sistemi, ana amacı bellek hatalarını yakalamak olmadığında bile size yardımcı olacaktır ve yeni olduğu için, eski kod tabanları hakkında endişelenmeden en iyi uygulamaları göz önünde bulundurarak araçlarını oluşturabilir.

Eski C kodunuzu bırakmak istemiyorsanız, Rust’un bir çözümü var. İşlevlerinizi FFI (Yabancı İşlev Arabirimi) aracılığıyla kolayca çağırabilirsiniz. Elbette derleyici bu kodun güvenliğini garanti edemez, ancak yeniden yazmanın uzun süreceği kütüphaneler için bu iyi bir son çare olabilir.

Neden Rust yerine C ++ seçmelisiniz?

C ve C++ onlarca yıldır kullanılıyor ve hatta C, Unix sistemlerinin temelini oluşturuyor. Bu diller için tonlarca farklı derleyici var. Çözmek istediğiniz sorun ne olursa olsun,muhtemelen aynı sorunu yaşayan insanlar tarafından yazılmış bir ton kütüphane var. Çok sayıda örnek kod var. Hepsinden de önce bugün üzerinde konuştuğumuz pek çok algoritma C üzerinde geliştirildi.

Bazen bu, Rust’u kullanmanın imkansız olduğu anlamına gelir çünkü ekosistem desteğini kopyalamak neredeyse imkansızdır. Özellikle, C++, Rust’ta uzun süredir görmeyeceğimiz oyun motorlarına, web kütüphanelerine, sistem kütüphanelerine ve köklü bir topluluk desteğine sahiptir.

Rust’un çözdüğü sorunların aynısı, modern C++’larda (C++17, C++19) (bazen dolambaçlı yollarla bile olsa) zaten çözülmüştür, bu nedenle Rust’ta girişim yapmak istemiyorsanız, programlarınızı C/C++ üzerinde yazmak ve kendinizi bu yönde geliştirmek oldukça mantıklı.

Ve tabii ki Rust yazmak için bazen derleyiciyle güreşmeniz gerekir. Kimi özellikler için nightly (kararsız) derleyici gerekmekte.

Bir diğer yandan, Rust’un sloganı “Herkesi güvenilir ve verimli yazılım geliştirmeye teşvik eden bir dil” dir.

Rust başlangıçta C++ yerine geçmeye başlasa da, daha ileriyi hedefledikleri aşikar ve belki de C++ ile başa çıkamayacak daha fazla sayıda insan için daha düşük seviyeli programlamayı erişilebilir hale getirmeye çalışıyorlar.

Bu, karşılaştırmayı biraz tartışmalı hale getirir. Rust bir ikame değil, yeni olasılık alanları açan bir dildir ve bunlardan birini sonraki bölümde tartışacağız.

Rust ve Web Assembly

Henüz duymadıysanız, WebAssembly… Web için Meclis gibidir.

Tarihsel olarak, tarayıcılar genel yapı için HTML, görünüm için CSS ve etkileşimler için JavaScript olacak şekilde HTML, CSS ve JavaScript üçlüsü ile çalıştırabiliyordu. Düz JavaScript yazmaktan hoşlanmadıysanız, JavaSript kodlarını, Haskell veya OCaml benzeri kodlar ve başka şeyler ekleyen çeşitli diğer dillerden aktarabilirsiniz.

Ancak JavaScript, oyunlar gibi yoğun hesaplama gerektiren uygulamaları çalıştırmak için gerekli olan öngörülebilir hızlı performansa sahip değildir. (Bunun nedeni çöp toplayıcı sorunları ve dinamik yazmadır.)

WebAssembly bununla başa çıkmaya yardımcı olur. Rust, Python, C++ gibi herhangi bir dil için bir derleme hedefi görevi görebilen tarayıcı dilidir. Bu, temelde herhangi bir modern programlama dilinde kodu alabileceğiniz ve tarayıcıya koyabileceğiniz anlamına gelir.

Diğer dillere kıyasla Rust, WebAssembly ile derlemek üzere kod yazmak için idealdir.

Rust minimum çalışma süresini hedef alır. WebAssembly kendi çalışma zamanına sahip olmadığından kodla birlikte gönderilmesi gerekir. Çalışma süresi ne kadar küçükse, kullanıcının indirmesi gereken şey o kadar az olur.

Rust daha öncesinde belirttiğim gibi statik olarak yazılmıştır. Rust statik olarak yazıldığından, derleyici kodu optimize etmek için türleri kullanabildiğinden daha verimli bir WebAssembly ile derlenebilir.

Rust dilinin bir avantajı daha var. En önemlisi, Rust WebAssembly’ı gönülden benimsemiştir. Rust halihazırda harika bir topluluğa ve WebAssembly için derleme araçlarına sahip, bu üçü arasında en önemli avantajı bu.

Rust ve WebAssembly hakkında daha fazla bilgi için rustwasm kitabına bakın.

Rust’a başlarken

Rust kodunu kullanmaya başlamak için, kolayca rustup aracını indirebilir ve lokal olarak programları derleyebilir veya bazı Rust kodunu çalıştırmanıza veya sonuçlarına tanık olmanıza olanak tanıyan çevrimiçi bir araç olan Rust Playground‘u kullanabilirsiniz.

Rust ortamınızı hazırladıktan sonra, tek yapmanız gerek biraz kod yazmak. Çok sayıda örnek içeren Rust’a başlangıç kitabını inceleyebilirsiniz.

Daha fazla öğrenme

Rust’un topluluğu harika. Gittiğiniz her yerde, öğrenmeye yönelik açık bir şekilde açıklanmış, başlangıç ​​odaklı birçok materyal ve size yardım etmeye hazır insanlar bulacaksınız.

Umarım bu makale, Rust’un şu anda neden bu kadar popüler ve sevildiğini anlamanıza yardımcı olmuştur. Ayrıca sizi Rust’ı bir araç veya yan proje için öğrenmeye ve denemeye giden bir yola koyduğumu umuyorum.

İyi geliştirmeler.