Neden Rust? Rust ile Native ve Güvenli Kodlama. Programlama serüveni. "Adı Rust"

Belki bir çoğumuz hala C/C++ dilleriyle yazılım yapıyor. Python yeni öğrenmeye başladık ve GoLang diye bir şey kulağımıza çalındı.
İlk olarak Üniversitelerde C dili gösterildi ki hafıza nasıl işliyor anlayalım. C dili çok basit ve diğer programlama dillerine nazaran nispeten az anahtar kelime sayısı var ve neredeyse ne isterseniz yapabiliyoruz. Sonra karmaşık veri yapıarı gelince C dilindeki "struct" yapısı yetmedi ve C dilinin genişletilmiş hali olan C11 yada C++11/14/17 seçtik. Ne farkederdi ki Ha varsayılan olarak Public ha Private. C++11 ile gelen "Lambda" yapısı muazzam kolaylık sağladı. C++17 versiyonuyla Lambda ve Template ile bir fonksiyonu sadece bir kere yazmak yetti. Hadi ama sizce de o "auto" ve "template<typename Args ...> class{...};" çok seksi durmuyor mu? Tabi iş bununla bitmedi. Uygulamaları yaparken Hafıza yönetimi meselesi ciddi bir problem olmaya başladı. "Ham işaretçiler" tüm eğitimlerde gösteriliyordu ve başka seçenek olmadığını zannederek kullandık, silmeyi unuttuğumuzda yada başka bir thread verinin işi bitmeden işaretçiyi sildiğinde işletim sistemi hata var diyebildi. Tabi birde threadler vardı. Thread ve hafıza analizi gerekti, üstüne etraftan gelen web ve mobil arayüzü yap artık baskısı eklenince Qt deneyelim dediniz ama QtWidgetler Mobilde saçma çözünürlük ve ekran hataları verdi. Qml, React-Native, Xamarin, vb. adını duyana kadar "Çapraz Native Arayüz Geliştirme" treni kaçtı.
Üstüne Python ML uygulamaları denediniz ama Python ve mobil arasındaki uyuşmazlık beni rahatsız ettiği gibi sizleri rahatsız ediyordur. TensorflowLite çıktı Hadi client tarafı için Javascript öğrenelim ve React-Native ile birkaç client mobil uygulaması yapalım ve üstüne TensorflowLite ile Machine Learning uygulamam çalışsın dediniz. Bir de ne göreyim, istediğim performans gelmiyor.

Hadi internetin derinliklerine inelim. 💭Hmm! beş para etmez gördüğümüz, kimsenin sormadığı, üniversitede öğrendiğimiz Matlab, Coder diye uygulamasıyla artık matlab Makine ve Derin öğrenme uygulamalarında binary bağımlılığı olmadan C/C++/Cuda/HDL kodları üretiyor üstüne utanmadan platforma özel hazırlanmış matematik kütüphanesiyle standart kütüphaneyi değiştirerek dünyanın en hızlı görüntü ve ses işleme kodlarını üretiyormuş. Arsız matlab bu kadar optimizasyonunun üzerine "OpenMP ile parallel işlenecek C/C++ kodları" üretiyor ve üretilen kodların dünya standartları ile uyuşup uyuşmadığının kontrolünü yapıyor💖. Üstüne bu utanmaz arlanmaz bunların bir çoğunu bize en fazla birkaç satır kod yazdırarak yaptırıyor 😮. Bunca zaman boşuna mı uğraştık?😥 Lisans şartları nedir? ücret varsa ne kadardır? DADadAdaaaa! Matlab kodları dağıtılamaz💥. Üstelik tüm paketlerin lisanları ayrı satılıyor ve her biri ayrı bir servete mal olacak. Hikayenin bu kısmında uzun zaman sonra olsa bile tıpış tıpış geri döneceğini bilmeden 💨

"Matlab kod üretmeyi öğrenin. Matlab tek başına işe yaramaz. Matlab temel dışında video ve kitap kaynağı çok az. En çok kaynak Mathworks sitesinde. Matlab iş ilanı yok ama C/C++ ve elektronik ile ilgili işlerde native ML kodları üretmekte üstüne yok. Türkiyede sadece Tübitak, savunma sanayi ve üniversitelerde var. Tek satıcısı ve eğitmeni figes a.ş. Matlab seni etrafta öğrendiğin diğer programlama dillerinden sonra hüsrana uğratabilir. Async ve thread desteği yok. Programlama sitilinde classlar bile çok ilkel. "uniform function call" özelliği yok. Matlab ve Simulink sadece algoritma geliştirme ve test ortamı olarak düşün."

Arafta kaldım. Artık geri dönüş yapamıyorum Python diline çünkü mobil. "Cython --embed" ve "Nuitka" var C/C++ kodu ürettikten sonra "segmentation error" veriyor. PyqtDeploy istediğim sonucu vermiyor ve kaynak bulamıyorum. Kivy anlatılanlar çalışmıyor. React-Native içine GoLang içinde yazdığım kodları gömsem C/C++ kadar hızlı olmuyor ama C/C++ kod yazmak çok zor ve sürüsüyle hafıza hatasına sebep oluyor ve çözmek bir ömre bedel😔. Matlab/Simulink çok pahalı. Go çalışma zamanında yaptığı kontrollerin maliyeti çok yüksek.

O kadar pesimist oldum ki mesleği bırakacaksınız :).

Şimdi Reklamlar... Şok Şok Şok! Hem C/C++ kadar hızlı hem Go kadar kolay ve Pythona yakın zorluk seviyesinde kolay kod yazmak istemez misiniz? İstediğiniz biliyorum aşağıdaki tablodaki özellikler tam size göre;
  • zero-cost abstractions - Sıfır maaliyetli soyutlama
  • move semantics - Hafıza kontrolünü derleme zamanında yapmak.
  • guaranteed memory safety - Hafıza hatalarından korunmak
  • threads without data races - Veri yarışı problemi olmadan Thread kullanmak
  • trait-based generics - Trait tabanlı fonksiyon prototipleri yazmak
  • pattern matching - desen eşleştirmesi
  • type inference - anlamlı tip tanımlama
  • minimal runtime - Küçük yürütülebilir dosya bağımlığı(Python aksine)
  • efficient C bindings - etkili C fonksiyonlarını şekilde çağırmak.
  • Maximum Secure Code Generation - Medium(sadece rust özel durum değil) ve Wikipedia adreslerine bakmanızı tavsiye ederim. 
  • LLVM Code Generation Interface to GCC and MSVC Compliers - Gcc ve Msvc c/c++ derleyicilerine sorunsuz arayüzü olan Llvm kod üretme yeteneği. Böylece wasm ile sorunsuz çalışmayı garanti ediyor. GoLang ile zorlandığımız mesele
  • All That Features Provided at Compile Time - Tüm bu özelliklerin derleme zamanında sağlanması. Böylece GoLang aksine üretilen program içine sürekli çalışan rutin kontroller yapılmıyor ve performans en son düzeye çıkıyor.
  • Debug with existing C/C++ Code base. Var olan C/C++ kodlarıyla birlikte hata ayıkla
"Adı Aşk" yerine "Adı Rust" söylediğinizi duyar gibiyim. Sorunlar iyi analiz edilmiş ve esaslı çözümler bulunmuş.
Rust programlama dili hayatımıza yeni girdi sayılır. "Mozilla Research" ile Mozilla/Firefox tarayıcısı HMTL/CSS render engine yani bu kodları görüntüye dönüştüren program başarıyla tamamlandı. Adı Servo. böylece Rust daha stabil olmadan kendini kanıtlamış oldu. 2015 gibi stabil olarak aramıza katıldı. Hala Go kadar yaygın değil ama saydığım özellikler birçok C/C++ programcılarının rüyası. Cppcheck, Visual Studio Safety Rules and Checks ve C++ GSL olsa da mutlaka hatalar gözden kaçıyor. Ayrıca hata bildirimi hiç hoş değil. Başlık ve Kaynak dosyalarının ayrı ayrı yorumlanması başımızın belası, birde bu kurallar her çok kullanılan derleyicide defalarca değişiyor ya 😤.

Microsoft C++ için Vcpkg denen bir araç getirmişti. Bayıldım 😄! Tabi proje oluşturmaya ve dağıtmaya yardım etmiyor ama dışarıdan paketlerin yüklenmesini kolaylaştırıyor.
Bunların hepsi Rust programlama dili "Cargo" ve "Rustup" araçlarını görene kadardı. Rustup temel rust derleyicilerini ve araçlarını yüklemeye yarıyor. Cargo proje ile ilgili herşey. Tabi projeyi derlemek üzere "rustc <dosya adı>.rs" denebilir ama Cargo ile işlemler daha kolay. Cargo .toml dosyasının içine tüm opsiyonları ve bağımlılıları yazın ve cargo gerisini halletsin. Make, Cmake, Qmake, Yaml, setup.py, manifest.xml  vb. paket manifest dosyalarına nazaran gördüğüm en basit dosya türü. Hele bir bakın anlamadığınız birşey var mı? Cargo.toml
[package]
name = "RustDeneme1"version = "0.1.0"authors = ["Robotik"]

[dependencies]
Yukarıdaki dosyayı "Cargo init --bin" yada "Cargo init --lib" ile exe yada .lib dosyası oluşturabilirsiniz. Oluşturduğunuz .lib yada .so, .dll dosyaları c/c++, golang, python, javascript, dotnet,... ve istediğiniz her yerde kullanabilirsiniz. Hatta "Adı Bindgen" kullanırsak bu işlemeler Native(C/C++,GoLang) kod yazarken otomatikleşiyor ve hala güvenli hale geliyor. Sadece native için değil wasm-bindgen ile Javascript web uygulamalarına gömmek kolaylaşıyor. Web için daha da ileri gidersem yew ile statik web sayfalarını js kullanmadan yapabiliyorum.
Hata mesajları o kadar açık ve yönlendirici ki, bazen hata mesajını kopyalayıp kendi kodlarının arasında kullanabiliyorsun. NICHE!
"Cargo run" komutu proje bağımlılıklarını çözer, eğer bilgisayarda olmayan kütüphane varsa crates.io sitesinden bulur ve indirir, bağımlılıkları derler. Artık proje tipine bağlı olarak ya kütüphane yada yürütülebilir dosya çıkarır. Yürütülebilir .exe dosyası <proje yolu>/target/debug yada <proje yolu>/target/release içindedir. Debug, release versiyonuna göre daha büyük ve yavaştır 😉
Derleme işlemi bazen uzun sürebilir. Sebebi Rust derlemeden önce statik analiz işlemi ve optimizasyonlar çalıştırmasıdır. C/C++ dillerinden daha fazla işlem yapmaktadır. Rust özellikleri bu arada yapığı fazladan işlemlerden gelir👮. Bu komut sonrasında oluşturulan diğer dosya Cargo.lock dosyasıdır.
[[package]]
name = "RustDeneme1"version = "0.1.0"
Eğer sadece derlemek isterseniz "Cargo build" kullanılır.
Eğer sadece hata var mı diye kontrol etmek istiyorsunuz, derleme işlemi çok uzun sürüyor diyenlere "Cargo check" komutunu sunarım. Kapsamlı inceleme yerine yazım yanlışlarını kontrol eder. Benim şu an için en çok kullandığım seçenektir. Ne de olsa hala çömezim👶.

Test yapmak ve döküman üretmek daha kolay. Rust içinde test ve dokümantasyon araçlarıyla geliyor. Bir kütüphane yapın ve otomatik olarak yorumlarınız döküman haline gelsin. Bu döküman oluşturma aracı sayesinde diğer programlama dillerinden daha iyi döküman oluşturacağına inanıyorum. Dokümanların açık ve anlaşılır. İçine resim, gif ve video eklenebiliyor. "Cargo doc" dediğinizde size tüm dokümanları derleyip web üzerinde açıyor. Dokümanlar html/css ile derlenir. Daha sonra kendi sitenizde rahatlıkla paylaşabilirsiniz.
"Adı Rust" değil de nedir? 😍

Güvenli Mutli-Thread örneği. Sadece bir uyarı veriyor. intellij idea  community ile yazdım. Mutluluktan ağlayacağım 😭. Native Multi-Thread güvenli ha!
use std::sync::mpsc;use std::thread;use std::time::Duration;

const NUM_TIMERS: usize = 24;

fn timer(d: usize, tx: mpsc::Sender<usize>) {
    thread::spawn(move || {
        println!("{}: setting timer...", d);        thread::sleep(Duration::from_secs(d as u64));        println!("{}: sent!", d);        tx.send(d).unwrap();    });}


fn main() {
    let (tx, rx) = mpsc::channel();    for i in 0..NUM_TIMERS {
        timer(i, tx.clone());    }

    for v in rx.iter().take(NUM_TIMERS) {
        println!("{}: received!", v);    }
}
Kodların her birinin ne işe yaradığını burada açıklamayacağım. Bir ara kapsamlı bir eğitim çekmek istiyorum.

Rust programlama dilinin Türkiye de yaygınlaşmasını istiyorum. GoLang kadar kolay değil ama çok önemli bir çalışma. Yurt dışında çok hızlı geliştiğini gördüm.
Bu kadar övmeme rağmen bir uyarım var. Unsafe kulanımı programı hızlandırsa da Unsafe kullanırsanız tüm güvenlik ortadan kalkıyor, C/C++ dillerinden farkı kalmıyor, gelmesi gereken uyarı mesajlarla gelmiyor. Unsafe çok nadir kullanılan bir durum.

Medium(sadece rust özel durum değil) durumu sadece Rust özel değildir. Her sene Python içinde uzaktan kod çalıştırmayla ilgili 5 güvenlik açığı bulunmakta. Asıl sorun ana kütüphanelerin iyi kontrol edilmeyen ve çok kullanılan c ile yazılmış kütüphaneler olması. Peki baştan mı yazacağız? Pek zannetmiyorum. Hataların üstü örtülebilir ama teknoloji ilerledikçe açıkların her yerden çıkması korkutmuyor değil. Daha da yeni açık çıkartmaya devam etmek istemiyorsak önlemi program oluşturulmadan derleme zamanında almalıyız.
"...So we know that safe Rust actually works. The really hard theoretical problems are solved. But the inherently unsafe parts of the implementation, such as the language runtime, could use more attention. ..." çeviri
Rust şu anda kullanılmaya hazır. Eğer bulduğunuz bir hata varsa hemen sitesinden yada github üzerinden bildirin. Topluluk çok nazik, olgun ve yardımcı oluyor. Aklınıza n etakılıyorsa sorun, tabi "ekran kartı nasıl indirilir?" gibi sorular değil.

Öğrenmek için rust sitesinde çok iyi bir kitap mevcut. Teşekkürler "Cargo doc". Bu kitap Rust yüklendikten sonra komut satırından "rustup doc" komutuyla açılır.
https://doc.rust-lang.org/book/2018-edition/index.html

C/C++ dili artık birçok insan için okul zorlamasından başka birşey değil. Hocalar suuudoooooo demese hiç değilse etkisiz kalacak. Bu sebeplerde native geliştirme yarım kalıyor.


Not: Burada 11 Aralık 2013 tarihinde çıkan Rust oyunundan bahsetmedim.

Yorumlar

Popüler Yayınlar