UPLOAD

    Emre Ramazanoğlu

    Istanbul, Turkey

    1.1K

    Rust Programlama Dili - Rust Programing Language

    Published: October 02, 2019

    Rust açık kaynak kodlu, çoklu paradigmalı, Mozilla tarafından geliştirilmekte olan programlama dili. Rust, tasarlanırken "güvenli, pratik, nesne tabanlı" bir dil olması hedeflenmiştir.

    Comments

    Rust Programlama Dili - Rust Programing Language

    • 1. Rust Programlama Dili Rust Programlama Dili
    • 2. Rust Nedir? Rust Nedir? •Rust dili, asenkron işlemler ağırlıklı, oldukça güvenilir ve büyük ölçekli sistemlerin geliştirimi için tasarlanmıştır. Bu nedenle güvenilirlik, bellek düzeninin kontrolü ve eşzamanlılık gibi birçok özelliği barındıran bir işlem kümesine sahiptir. •Rust dilinin söz dizimi, C ve C++ ile benzerlikler gösterecek şekilde, kod bloklarının birbirinden ayrıldığı süslü parantezleri ve if-else-while-for gibi kontrol akışlarını içerir. C ve C++’a özgü tüm anahtar kelimelerin bulunmasının yanında match gibi regex kontrolü sağlayan bazı özel kontrol ifadelerini içerir. Söz dizimi C ve C++’a benziyor gibi görünse de, derinlemesine ele alındığında Haskell gibi fonksiyonel dillere daha yakın niteliktedir. Kontrol akışı operatörleri de dahil olmak üzere her bir fonksiyon gövdesi çalıştırılabilir bir kod ifadesidir. Örneğin, Rust’taki sıradan bir if koşulu, C’deki 3’lü koşul operatörünün (a?x:y) yerini alabilir. Ayrıca fonksiyonların return ifadesi ile bitmeleri gerekmez, return ifadesi olmadığı durumda fonksiyon içerisindeki son ifade geri döndürülür.
    • 3. Bellek Güvenliği Bellek Güvenliği Rust dili bellek güvenli (memory-safe) olarak tasarlandığı için; null işaretçileri, silinen belleği gösteren işaretçiler (dangling pointers), ve birden fazla thread’in veriyi isteme durumu (data races) gibi özellikler içermez. Bu nedenle değişkenler, sadece sabitlenmiş form kümeleri (struct, enum, vb.) aracılığıyla atanabilirler. Bu form kümeleri, girdi değerlerinin halihazırda forma verilmiş olmasını şart koşmaktadır. Diğer dillerde bulunan linked list ve binary tree gibi veri yapılarındaki işlevin sağlanması için NULL ifadesi yerine Rust’ta option türü yer almaktadır. Bu tür içerisinde Some veya None olan test edilebilir iki adet veriyi barındırmaktadır. Ayrıca Rust’ta nesne yaşam döngüsünü yönetmek için borrow checker adında bir ödünç alma denetimi de mevcuttur.
    • 4. Bellek Yönetimi Bellek Yönetimi Rust’ın belki de en büyük özelliklerinden biri Java ve .NET’teki gibi ölü nesnelerin işaretçilerinin otomatik olarak kaldırıldığı bir garbage collection sisteminin bulunmamasıdır. Bunun yerine bellek ve diğer kaynaklar, isteğe bağlı atomik referans sayımı ile birlikte, RAII (resource acquisition is initialization) ilkesi ile yönetilirler. Bu sayede Rust, çok küçük bir iş gücü ile kaynakların yönetimini sağlar. Ayrıca Rust, stack üzerinde değişkenlerin tahsis edilmesini kolaylaştırır ve Java gibi diğer dillerde bulunan int’ten Integer’a otomatik dönüştürme (boxing) işlemine de izin vermez. Ayrıca & (ampersand) sembolünün kullanıldığı referans kavramı da mevcuttur. Bu referanslar çalışma zamanındaki referans sayımına dahil edilmezler. Bunun yerine derleme zamanında borrow checker tarafından doğrulanırlar. Bu sayede dangling pointer veya diğer beklenmedik davranışlar engellenmiş hale gelmektedir.
    • 5. Bellek Sahipliği Bellek Sahipliği Rust’ta her verinin benzersiz bir sahibinin olduğu bir sahiplenme (ownership) mekanizması mevcuttur. Bu sistemde verinin scope’u (çalışma alanı), sahibinin scope’u ile aynıdır. Böylece verinin scope’u tamamlandığında, sahibi de boşa çıkmış olur. Değerler, &T operatörü kullanılarak, immutable (değiştirilmez) referanslar tarafından değişkenlere atanabilirler. Değiştirilebilen (mutable) refarans operatörü olarak, &mutT veya sadece T kullanılabilir. Uygulama içerisinde her zaman ya birden çok immutable referans vardır, ya da yalnızca bir adet mutable referans bulunmaktadır. Rust derleyicisi derleme anında referansların doğru olarak atanıp- atanmadığını kontrol ederek bu kuralları uygular.
    • 6. Veri Tipleri ve Polimorfizim Veri Tipleri ve Polimorfizim Rust’taki tip sistemi, Haskell’e benzer şekilde çalışan traits adı verilen bir mekanizmadan oluşur. Bu mekanizma interface/abstract class gibi çalışır. Değişken tanımlamalarına tip vererek polimorfizmin oluşmasını sağlar. higher kinded polymorphism gibi Haskell’de bulunan diğer özellikler henüz desteklenmemiştir. JavaScript ve C#’taki tip belirlemesiz otomatik değişken oluşturma var ile sağlanırken, Rust’ta bunun için let anahtar kelimesi kullanılır. Rust’ta let ile tanımlanan değişkenler, değer atama yapmadan oluşturulabilir ve daha sonra atama yapılabilir. Örn: let a; a = 42;. Değişkenler varsayılan olarak immutable oldukları için birden fazla atama yapmak istendiğinde let mut a; şeklinde mut kelimesi kullanarak yapılmalıdır.
    • 7. Veri Tipleri ve Polimorfizim Veri Tipleri ve Polimorfizim Generic parametre alan fonksiyonlar, genellikle belirli trait‘leri implement eden generic tiplere ihtiyaç duyar. Bu tür bir fonksiyonda, generic değer yalnızca o trait’ler vasıtasıyla kullanılabilir. Bu bağlamda, generic fonksiyon tanımlandığı anda artık tip kontrolü yapılabilir durumda olur. C++’taki template’lerde ise böyle bir durum yoktur ve somut tipler ile değişken oluşturulana dek duck-typed olarak kalırlar. C++’taki bu sorunun C++20 versiyonu ile birlikte giderileceği öngörülmektedir. Rust generic’leri C++ template’leri ile benzerlik gösterirler. Her bir değişken oluşturma sonrasında kodun ayrı bir kopyası oluşturulur. Buna monomorphization denir ve C# ve Java’da kullanılan type erasure şemasının tam tersidir. Monomorphization’ın yararı, her bir kullanım durumu için optimize edilmiş bir kodun üretilmesidir. Dezavantajı ise derleme zamanının uzaması ve oluşturulan binary dosyaların boyutunun artmasıdır. C++’da yaşanan diamond problemi Rust’ta görülmez. Rust içerisindeki nesne sistemi; implementasyonlar, trait’ler ve yapısal tipler (structured types) üzerine kurulmuştur. Implementasyonlar diğer dillerdeki class yapılarına benzerlik gösterirler ve impl kelimesi ile oluşturulurlar. Nesne yönelimli diğer dillerde gördüğümüz miras ve çok biçimlilik ise trait’ler tarafından sağlanmıştır. Trait’ler, Java’daki abstract class’lar gibi metodların tanımlanmasını ve implementasyonlar içerisinde kullanılmasını sağlar. Yapısal tipler ise C’deki struct gibi değişken alanlarının tanımlanması için kullanılırlar. Implementasyonlar ve trait’ler struct gibi değildir ve kendi bünyesinde değişken barındırmazlar. Bunun yanında sadece trait’lerde miras olayı mevcuttur. Bu sayede C++ gibi çoklu miras destekleyen dillerde oluşan diamond problemi engellenmiş olur. Başka bir deyişle Rust, sadece interface üzerinden mirasın yapılmasını sağlar ve bu interface’lerin kompozisyonu sayesinde miras işlevini gerçekleştirir. Burada görülen Composition over inheritance yani miras yerine kompozisyon yapılması React gibi framework’lerde de oldukça popülerdir.
    • 8. Kod Örnekleri Kod Örnekleri •Merhaba Dünya •Her programlama dilinin olmazsa olmazı olan “Merhaba Dünya!” örneği, Rust dilinde println!fonksiyonu kullanılarak yazılır. •Faktöriyel Alma •Bir sayının, sürekli kendisinin bir eksiği ile çarpılarak oluşan faktör kavramı Rust’ta birçok şekilde yapılabilir. •Öz yinelemeli (recursive) faktöriyel alma
    • 9. Rust Geliştirim Araçları Rust Geliştirim Araçları •Rust ile uygulama geliştirimi sürecini kolaylaştıran birçok araç bulunmaktadır: •Cargo: Rust paket yöneticisi •RLS: Rust, VSCode gibi birçok IDE ile entegre çalışmak için RLS’i kullanır. Linting, kod tamamlama, syntax kontrolü ve kod formatlama gibi özellikleri sunar. •Cargo: Rust için paket yöneticisi ve kod derleme sistemidir. Eğer Rust’ı denediyseniz büyük ihtimalle Cargo’yu da görmüşsünüzdür. Bünyesinde, code coverage gibi birçok ek özellik sunan eklentiler mevcuttur. Ayrıca Cargo, birim ve entegrasyon testleri için kullanılabilir. Derleme ve program bağımlılıkları TOML syntax’ı ile ifade edilir. •crates.io: Açık kaynaklı Cargo paketlerinin yer aldığı paket kayıt sistemidir. Bütün Rust paketlerine buradan ulaşılabilir. •rustup Rust yüklemelerinin yönetimi için kullanılır. Kurulum için stabil, beta veya nightly sürümler seçilebilir ve önceki sürümlerden herhangi biri yüklenebilir. •clippy: Rust için bir linter aracıdır. Yaygın olarak yapılan birçok yazım yanlışını tespit ederek düzgün bir biçimde Rust kodu yazmanızı sağlar. •rustfmt Rust dili için kod formatlama aracıdır. •sccache: Derleme sürelerini azaltarak hızlı şekilde aksiyon almayı sağlayan bir compiler cache’idir. RLS ile birlikte çalışmadığı için IDE’nizde kullanamayabilirsiniz.
    • 10. Rust Kurulumu Rust Kurulumu •Rust Kurulumu •Rust kurulumu, rustup aracı ile kolay bir şekilde tamamlanabilmektedir. Eğer macOS, Linux veya Unix temelli bir işletim sisteminiz varsa aşağıdaki komut ile Rustup’ı indirebilir ve Rust’ın kurulumunu gerçekleştirebilirsiniz: •curl https://sh.rustup.rs -sSf | sh •Windows işletim sistemi için chocolatey yardımıyla kurulabilir: •choco install rustup.install •Rust Projesi Oluşturma •cargo new komutu kullanılarak yeni bir Rust projesi oluşturulabilir ve run komutu ile çalıştırılabilir: •$ cargo new myRust
    • 11. Rust Kurulumu Rust Kurulumu •Created binary (application) `myRust` package $ cd myRust/ $ cargo run Compiling myRust v0.1.0 (/users/myRust) Finished dev [unoptimized + debuginfo] target(s) in 0.70s Running `target/debug/myRust` Hello, world! •Rust için REST servis framework’ü olan Rocket •Komut satırı uygulamaları ile ilgili daha fazla bilgi için rust-lang-nursery sitesini ziyaret edebilirsiniz. •Masaüstü uygulama geliştirimi için azul, web servis geliştirimi için ise rocket framework’ünü kullanabilirsiniz. Rust ile ilgili birçok aracın yer aldığı Awesome Rust listesine buradan ulaşabilirsiniz