- Rust, çöp toplamayı kullanmadan, derleme sırasında sahiplik, ödünç alma ve kullanım ömürleri yoluyla bellek güvenliğini sağlar.
- Tip sistemi ve takma ad kuralları, karşılıklı dışlamalar, kanallar ve akıllı işaretçiler kullanılarak veri yarışları olmadan eşzamanlılığa izin verir.
- Cargo, crates.io ve aktif bir ekosistem, bağımlılık yönetimini, derlemeyi, test etmeyi ve dağıtımı basitleştirir.
- Yapıları, enumları, Option'ı ve Result'u anlamak, eşzamanlı uygulamalarda hataları ele almanın ve güvenli verileri modellemenin anahtarıdır.
Rust, şu dillerden biri haline geldi: Her sistem geliştiricisi bunu tekrar tekrar duyar.C ve C++ kadar hızlı, ancak bellek güvenliğine ve iyi yürütülen eşzamanlılığa neredeyse takıntılı bir şekilde odaklanıyor. Bu sadece boş bir pazarlama değil: tasarımı, derleyicinin derleme zamanında hataları tespit etmesi etrafında dönüyor; diğer dillerde bu hataları yalnızca sistem üretim aşamasındayken veya çöktüğünde görürsünüz.
Anlamakla ilgileniyorsanız Rust, veri çalıştırma korkusu olmadan çöp toplama ve eşzamanlılık olmadan güvenli belleğe nasıl ulaşır?Bu eğitim tam size göre. Dilin temellerinden ve ekosisteminden, sahiplik, ödünç alma, bileşik türler, Cargo gibi araçlar gibi temel kavramlara kadar her şeyi ele alacağız ve hatta eşzamanlılığa yeni başlayanlar için daha erişilebilir bir bakış açısıyla atomik türlere ve kilitlemeye bile bakacağız; tüm bunları yaparken de güvenlik ve performansa odaklanacağız.
Rust Eğitimi: Performans, Bellek Güvenliği ve Eşzamanlılık
Rust bir programlama dilidir programación genel amaçlı ve çok paradigmalı, tasarlanmış düşük seviyeli sistem programlamanın yanı sıra yüksek seviyeli projeler içindan OSOyun motorlarından tarayıcılara, yüksek performanslı web servislerine kadar, özellikle tarayıcı motoru gibi hassas bileşenlerde yazılım güvenliğini artırma amacıyla Mozilla'da ortaya çıkmıştır.
Onun belirleyici özelliği şudur ki; derleme zamanında bellek güvenliğini garanti eder Çöp toplayıcı kullanmadan. Rust, bunun yerine her değerin ve referanslarının yaşam süresini izleyen bir sahiplik sistemi ve bir ödünç alma denetleyicisi kullanır. Bu, otomatik referans sayımı veya çöp toplama gerektirmeden, asılı işaretçiler, arabellek taşmaları veya bellek sızıntıları gibi klasik sorunları önler.
Ayrıca Rust, bunu kolaylaştırmak için tasarlanmıştır güvenli katılımTürü ve sahiplik modeli, en azından güvenli Rust kodunda kalırken, iş parçacıkları arasında veri yarışlarını önler. Bu, derleme zamanında, tek bir satır bile çalıştırılmadan önce birçok tehlikeli durumun tespit edilebileceği anlamına gelir.
Tüm bu nedenlerden dolayı, büyük şirketler Dropbox, Microsoft, Amazon veya Google Altyapılarının kritik bölümlerinde Rust'ı benimsediler. Ve geliştiriciler tarafından "en sevilen" dillerden biri olarak Stack Overflow anketlerinde yıllardır zirvede yer alması tesadüf değil: C++ tarzı performansı, modern bir araç seti (Cargo, crates.io) ve Rustacean adı verilen oldukça aktif bir toplulukla birleştiriyor.
Temel kavramlar: programlama dili, türler ve bellek
Bellek güvenliği ve eşzamanlılığın ayrıntılarına dalmadan önce, genel olarak görülen bazı kavramları açıklığa kavuşturmakta fayda var. El tiempo Rust ile çalışırken, özellikle başka dillerden geliyorsanız veya programlamaya yeni başlıyorsanız.
Bir programlama dili, nihayetinde, algoritmaları tanımlamanıza olanak tanıyan bir dizi kural ve yapı ve bunları çalıştırılabilir programlara dönüştürür. Rust, derleyicisini kullanarak yerel makine koduna derler rustcDolayısıyla alacağınız performans genellikle C ve C++ ile aynı seviyede olur.
Bellek yönetimi, bir programın bellekte depolanması ve saklanması işlemidir. çalışırken bellek bloklarını ayırır ve serbest bırakırBu alandaki hatalar genellikle ölümcül olabilir: bellek sızıntıları (kullanılmayan belleği serbest bırakmama), sınır dışı yazma nedeniyle veri bozulması veya serbest bırakıldıktan sonra belleğin kullanılması. Rust, bu sorunu çok güçlü bir tür sistemi ve sahiplik, ödünç alma ve kullanım ömürleri için resmi kurallarla çözer.
Rust ayrıca şu terimleri de içerir: akıllı tipler ve işaretçilerBir tür, bir değişkenin ne tür verileri depoladığını (tam sayılar, ondalık sayılar, dizeler, yapılar vb.) ve bunların nasıl işlenebileceğini tanımlar. Akıllı işaretçiler (örneğin, Box, Rc y Arc) bellek adreslerini kapsülleyen ve paylaşılan referansları saymak veya değerleri yığına taşımak gibi kaynakları güvenli bir şekilde yönetmek için ekstra mantık ekleyen yapılardır.
Rekabet alanında, aşağıdaki gibi kavramlar yarış koşulları, karşılıklı dışlamalar ve kanallar Bunlar vazgeçilmez hale gelir: birden fazla iş parçacığının uygun koordinasyon olmadan aynı anda paylaşılan bir kaynağa erişmesi ve onu değiştirmesi durumunda bir yarış durumu oluşur; bir mutex (karşılıklı dışlama), kritik bölüme aynı anda yalnızca bir iş parçacığının girmesini sağlar; ve kanallar, doğrudan bellek paylaşımı olmadan iş parçacıkları arasında mesajların gönderilmesine olanak tanır.
Neden Rust öğrenmelisiniz: Bellek güvenliği ve korkusuz eşzamanlılık
Rust, sunduğu özellikler nedeniyle ününü kazandı modern programlama için üç çok değerli sütunPerformans, güvenlik ve güncel araçlar. Bu noktaların neden bu kadar önemli olduğuna bakalım.
Performans açısından Rust doğrudan yerel ikili dosyalara derlenir Sanal makine veya yorumlayıcıya ihtiyaç duymadan. Sıfır maliyetli soyutlama modeli, üst düzey soyutlamaların çalışma zamanında ek yük oluşturmamasını sağlamayı amaçlar. Bu nedenle, sistem geliştirme için idealdir. oyun, tarayıcı bileşenleri veya düşük gecikmeli mikro hizmetler.
Bellek güvenliği şu temele dayanmaktadır: mülkiyet ve kredi sistemiÇöp toplayıcı yoktur, ancak derleyici her kaynağın kime ait olduğunu, ne zaman ihtiyaç duyulmayacağını ve ne zaman serbest bırakılabileceğini tam olarak bilir. Bu, sızıntıları, asılı kalan işaretçileri ve geleneksel olarak C ve C++ programlamasını bu kadar tehlikeli hale getiren birçok hatayı önler.
Rekabet alanında Rust, genellikle şu şekilde adlandırılan şeyi takip ediyor: "korkusuz eşzamanlılık"Tür sistemi, veri köklerinin güvenli kodda var olmasını engeller. İş parçacıkları arasında değiştirilebilir verileri paylaşmak istiyorsanız, aşağıdaki gibi uygun ilkel öğeleri kullanmanız gerekir: Mutex, RwLock o Arcve derleyici takma ad ve değişebilirlik kurallarına uyulmasını sağlayacaktır.
Geliştirme deneyimi, aşağıdaki gibi modern araçlarla zenginleştirilmiştir: KargoEntegre bir paket yöneticisi ve derleme altyapısının yanı sıra, asenkron ağlardan (Tokyo) web çerçevelerine (Actix, Rocket, Axum) kadar her şeyi kapsayan geniş bir kütüphane (sandık) ekosistemine sahiptir. Tüm bunlar, özellikle yeni başlayanlar için açık, üretken ve oldukça sabırlı bir topluluk tarafından desteklenmektedir.
Kurulum ve temel araçlar: rustup, rustc ve Cargo
Rust'ta ilk programlarınızı yazmak ve çalıştırmak için, başlamanın olağan yolu resmi araç zincirini kullanarak yüklemektir. Rustup (bkz. Rust'a tam giriş), tüm büyük işletim sistemlerinde çalışan basit bir yükleyici ve sürüm yöneticisidir.
ile Rustup Rust'ın farklı sürümlerini (kararlı, beta, gecelik) hiçbir şeyi bozmadan kurabilir, güncelleyebilir ve bunlar arasında geçiş yapabilirsiniz. Resmi Rust araçları sayfasına gidin ve sisteminiz için adımları izleyin. Kurulduktan sonra derleyici kullanıma hazır olacaktır. rustc, proje yöneticisi cargo ve onun rustup Cihazınızda terminal.
derleyici rustc Kaynak kodunuzu çalıştırılabilir ikili dosyalara veya kitaplıklara dönüştüren şeydir. Bunu doğrudan şu şekilde çağırabilirsiniz: komutlar olarak rustc main.rsPratikte, çağrıları işleyen Cargo aracılığıyla neredeyse her zaman çalışacaksınız. rustc doğru seçeneklerle.
İş akışının merkezi aracı KargoSadece birkaç komutla crates.io'da yeni projeler oluşturabilir, bağımlılıkları yönetebilir, paketleri derleyebilir, çalıştırabilir, test edebilir ve yayınlayabilirsiniz. Sık kullanılan bazı temel komutlar şunlardır: cargo new, cargo build, cargo run, cargo test y cargo checkSon çalıştırılabilir dosyayı üretmeden kodu kontrol eden, hataları hızlı bir şekilde tespit etmek için ideal.
Hiçbir şey kurmadan kurcalamak istiyorsanız, Pas Bahçesi (resmi çevrimiçi yürütücü) ve Replit gibi platformlar, tüm ortamı kurmanıza gerek kalmadan bellek ve eşzamanlılık örnekleriyle denemeler yapmak için mükemmel olan tarayıcıdan küçük kod parçaları yazmanıza ve çalıştırmanıza olanak tanır.
İlk programınız: Hello, Rust ve temel akış
Herhangi bir dilde sohbet başlatmanın klasik yolu ünlü "Merhaba dünya"dır. Rust'ta bir dosya main.rs minimum, bir fonksiyon kadar basit bir şey içerebilir main ekrana bir dize yazdıran.
anahtar kelime fn bir fonksiyon tanımladığımızı gösterir ve main Bu, programın giriş noktasıdır. Fonksiyonun kod bloğu süslü parantezler içinde yer alır. Konsola yazmak için şunu kullanın: makro println!, bir dize sabitini (veya yer imleri içeren bir şablonu) kabul eder ve bunu yeni satır karakteriyle biten standart çıktıya gönderir.
Eğer doğrudan derlerseniz rustc main.rs, çalıştırılabilir bir ikili dosya elde edeceksiniz (örneğin, main o main.exe (sisteme bağlı olarak). Çalıştırdığınızda terminalde mesajı göreceksiniz. Ancak Rust ile çalışmanın en yaygın yolu, projeyi Cargo'nun yönetmesine izin vermektir.
ile cargo new nombre_proyecto Bir klasör yapısı otomatik olarak oluşturulur src/main.rs "Merhaba dünya" ve bir dosya ile önceden hazırlanmış Cargo.toml meta verileri ve gelecekteki bağımlılıkları içerir. Buradan, cargo run ikili dosyayı derleyin ve çalıştırınve yalnızca değişiklikleri algıladığında yeniden derler.
Bu çalışma şekli yalnızca kullanışlı olmakla kalmıyor, aynı zamanda başlangıçtan itibaren standart Rust ekosistemini kullanmaya alışmanızı sağlıyor; bu da eşzamanlılık, ağ oluşturma, test etme veya ihtiyaç duyduğunuz herhangi bir şey için kasalar eklemeye başladığınızda çok faydalı oluyor.
// Ana fonksiyonu tanımlıyoruz: program giriş noktası fn main() { // Konsola metin yazdırmak için println! makrosunu kullanıyoruz println!("Merhaba, dünya!"); }
Değişkenler, değişebilirlik ve temel veri türleri
Rust'ta değişkenler anahtar kelimeyle tanımlanır letve varsayılan olarak değişmezdirBaşka bir deyişle, onlara bir değer atadığınızda, onu açıkça değiştirilebilir olarak beyan etmediğiniz sürece değiştiremezsiniz. mut.
Varsayılan olarak değişmezlik, özellikle birden fazla iş parçacığının aynı değeri değiştirmek isteyebileceği eşzamanlı programlarda, ince mantık hatalarının önlenmesine yardımcı olur. Değiştirmeniz gerekiyorsa, aşağıdaki gibi bir şey yazabilirsiniz. let mut contador = 0;Oradan yeni değerleri yeniden atayabilirsiniz contador.
Rust ayrıca sözde gölgelemeAynı kapsamda, aynı ada sahip yeni bir değişken tanımlayabilir ve öncekini gizleyebilirsiniz. Bu, mutasyonla aynı şey değildir, çünkü yeni bir değer yaratıyorsunuz (hatta farklı bir türde bile olabilir). Örneğin, aynı adı kullanarak bir dizeyi tam sayıya dönüştürebilirsiniz, yeter ki bu yeni bir tanımlama olsun: let.
Rust'ın tür sistemi statiktir, bu da şu anlama gelir: Her değişkenin türü derleme sırasında bilinirAncak, tür çıkarımı oldukça güçlüdür: eğer yazarsanız let x = 5;Derleyici bunun bir olduğunu varsayar i32 Aksi belirtilmediği sürece aşağıdaki gibi notlar ekleyebilirsiniz: let x: i64 = 5; Açıkça söylemek istediğinizde.
Kullanılabilir skaler tipler arasında işaretli ve işaretsiz tamsayılar bulunur (i8, u8, i32, vb.), yüzen olanlar (f32, f64), Boole'lar (bool) ve Unicode karakterleri (char). Bu basit tiplerin kopyalanması genellikle ucuzdur ve birçoğu bu özelliği uygular CopyBu, onları bir fonksiyona atadığınızda veya geçirdiğinizde, taşınmak yerine kopyalandıkları anlamına gelir.
Rust'taki Dizeler: &str ve String
Rust'ta metin işleme ilk başta biraz kafa karıştırıcı olabilir çünkü metinler arasında net bir ayrım yapar. zincir "dilimleri" ve tescilli zincirlerİki önemli parça şunlardır: &str y String.
Un &str bir akreditasyonu uluslararası tanınırlık sağlayan değişmez zincirin bir dilimiBir yerde saklanan bir UTF-8 bayt dizisinin görünümü. Tipik örnekler arasında şunlar yer alır: "Hola"hangi türdendir &'static str (Programın tüm ömrü boyunca var olurlar ve ikili dosyaya gömülürler.) Dilimler veriye sahip değildir; sadece ona işaret ederler.
StringÖte yandan, bir kendi dizesi, değiştirilebilir ve yığında barındırılırYeniden boyutlandırılabilir, birleştirilebilir, özelliği taşınarak fonksiyonlar arasında aktarılabilir, vb. Genellikle dinamik metin oluşturmak veya uzun süreli olarak yapılar içerisinde saklamak istediğinizde kullanılır.
Birçok senaryoda birinden diğerine geçiş yapacaksınız: örneğin, bir String::from("hola") bir dilimdenveya ödünç alacaksın &str Bir String yalnızca okuma yapması gereken fonksiyonlara referanslar geçirerek.
Sahip olunan ve ödünç alınan veriler arasındaki bu ayrım, bellek yönetimi için önemlidir ve dilin geri kalanına da uzanır: koleksiyonlar, yapılar ve numaralandırmalar, kimin sahip olduğu ve kimin yalnızca baktığı konusunda aynı fikirleri izler.
Fonksiyonlar, kontrol akışı ve yorumlar
Rust'taki fonksiyonlar şu şekilde tanımlanır: fn ve programın yeniden kullanılabilir mantıksal birimler halinde düzenlenmesine olanak tanır. Her işlev, parametrelerinin türü ve dönüş türü bir oku takip ederek ->Anlamlı bir sonuç dönmezse üniter tip varsayılır. ().
Önemli bir ayrıntı, bir fonksiyondaki (veya herhangi bir bloktaki) noktalı virgül içermeyen son ifadenin örtük dönüş değeri olarak alınmasıdır. return erken iadeler içinAncak deyimsel kodlarda, genellikle son ifadeyi boş bırakırsınız. ;.
Kontrol akışı klasiklerle sağlanır if/elsedöngüler loop, while y forRust'ta, if Bir değeri döndüren bir ifadedirböylece onu doğrudan kullanabilirsiniz letdallar aynı türü döndürdüğü sürece. Döngüler for Bunlar genellikle aralıklar veya koleksiyon yineleyicileri üzerinde yineleme yapar ve manuel dizinler yerine önerilen seçenektir.
Kodu belgelemek ve sizden sonra gelenlerin (kendiniz de dahil) hayatını kolaylaştırmak için şunları kullanabilirsiniz: satır yorumları ile // veya blok ile /* ... */Ayrıca Rust, dokümantasyon yorumlarını şu şekilde sunar: /// Bunlar daha çok büyük projelere uygun olmakla birlikte, üretilen belgeler haline gelir.
Sahiplik, ödünç verme ve yaşam süreleri: Bellek güvenliğinin temeli
Burada Rust'ın bellek modelinin kalbine ulaşıyoruz: sistem mülkiyet, borçlanma ve ömür boyuBu kurallar referansların her zaman geçerli olmasını ve belleğin çöp birikmeden güvenli bir şekilde serbest bırakılmasını sağlar.
Sahipliğin temel kurallarının ifade edilmesi kolaydır, ancak ilk başta içselleştirilmesi zor olabilir: Her değerin tek bir sahibi vardır.Aynı anda yalnızca bir sahip olabilir ve sahip kapsam dışına çıktığında değer yok olur ve hafızası serbest kalır. Bu, örneğin, String: bildirildiği bloğun tamamlanması üzerine otomatik olarak çağrılır drop bu da yığın belleğini serbest bırakır.
Başka bir değişkene uygun bir değer atadığınızda veya bir fonksiyona değer olarak aktardığınızda, özellik taşınır. Bu, orijinal değişken, taşıma işleminden sonra geçerliliğini yitirirBu hareket semantiği, aynı kaynağı yayınlamaya çalışan iki sahibin olmaması nedeniyle çift yayınların önüne geçer.
Programın birden fazla bölümünün sahipliği değiştirmeden aynı değere erişebilmesini sağlamak için Rust, referansları ve ödünç almayı sunar. Ödünç aldığınızda bir referans oluşturursunuz. &T (değişmez) veya &mut T (değişken) mülkiyet devri yapılmaksızın değere dönüştürülebilir. Kredi, kredi doğrulayıcısının kurallarıyla sınırlıdır., referansların işaret ettikleri verilerden daha uzun ömürlü olmadığını ve değiştirilebilir ve paylaşılan erişimlerin tehlikeli bir şekilde karışmadığını kontrol eder.
Kredinin kuralları şu şekilde özetlenebilir: Herhangi bir zamanda, şunlardan birine sahip olabilirsiniz: birden fazla değişmez referans bir değere veya tek bir değişken referansAncak ikisi aynı anda değil. Bu, paylaşımlı bellekteki yarış koşullarını ortadan kaldırır: ya çok sayıda okuyucu vardır ya da izole bir yazıcı vardır; aynı anda aynı veriler üzerinde asla eş zamanlı okuyucu ve yazıcı olmaz.
Bileşik türler: yapılar, numaralandırmalar ve akıllı işaretçiler
Rust, ilgili verileri daha zengin yapılara gruplandırmanın çeşitli yollarını sağlar; bunlardan biri yapılarBir yapı, adlandırılmış alanlara sahip özel bir tür tanımlamanıza olanak tanır; örneğin e-posta, ad, etkinlik durumu ve oturum açma sayacı olan bir kullanıcı.
Bir yapı örneği oluşturmak için, tüm alanlarını doldurursunuz ve onu içeren değişkeni, değerlerini daha sonra değiştirmek için değiştirilebilir olarak işaretleyebilirsiniz. Ayrıca, mevcut bir örnekten bazı alanları yeniden kullanarak yeni bir örnek oluşturmanıza olanak tanıyan struct update sözdizimi de mevcuttur. ..otro_struct.
Jardines de Viveros numaralar Bunlar bir diğer temel unsurdur: Her biri kendi ilişkili verileriyle veya veriler olmadan, birkaç olası varyanttan biri olabilen bir tür tanımlamanıza olanak tanırlar. Klasik bir örnek, bir varyantı olan IP adresleri için bir enum'dur. V4 dört oktet ve bir diğerini depolayan V6 IPv6 gösterimiyle bir dizeyi depolayan.
Rust'ın standart kütüphanesi iki çok önemli enum içerir: Option<T> y Result<T, E>Birincisi bir değerin (bir şey veya hiçbir şey) varlığını veya yokluğunu temsil eder ve boş işaretçilerden kaçınmak için kullanılır; ikincisi, doğru bir sonuç veya bir hata döndür, hata işlemenin açık ve güvenli olmasını gerektirir.
Dinamik belleği yönetmek ve verileri paylaşmak için Rust, akıllı işaretçiler olarak Box<T>, bir değeri yığına taşır ve benzersiz bir mülkiyeti korur; Rc<T>, tek iş parçacıklı ortamlar için paylaşılan bir referans sayımı; ve Arc<T>, benzer Rc ancak birden fazla iş parçacığı için güvenlidir. Dinamik belleği eşzamanlılıkla birleştirirken bunları doğru kullanmak çok önemlidir.
Kargo ve Kasa Ekosistemi
Kargo, Rust ekosistemini bir arada tutan tutkaldır: derlemeyi, bağımlılıkları ve proje yaşam döngüsünü yönetirHer projenin bir dosyası var Cargo.toml adı, sürümü, dil sürümünü ve dış bağımlılıkları bildiren bir manifesto görevi görür.
bölüm Bu dosya, üçüncü taraf kasaları sürümleriyle birlikte listelemenize olanak tanır. cargo build o cargo runCargo, bu kasaları crates.io'dan otomatik olarak indirir, derler ve projenize bağlar. Örneğin, rastgele sayı üreteçleri, web çerçeveleri veya kriptografik kütüphaneler eklemek işte bu kadar kolay.
En yaygın komutlar arasında şunlar yer alır: cargo new ikili projelere başlamak için o cargo new --lib kütüphaneler için; cargo build hata ayıklama modunda derlemek için; cargo build --release optimize edilmiş, üretim odaklı bir sürüm elde etmek; ve cargo test test bataryasını çalıştırmak için.
cargo check Özel bir sözü hak ediyor: İkili bir dosya oluşturmadan kodu ara bir noktaya derliyor, bu da onu derleme hatalarını tespit etmede çok hızlı olunÖdünç alma denetleyicisi özellikler, referanslar ve yaşam süreleri ile ilgili sorunları gösterirken hızlı bir şekilde yineleme yapmak için mükemmeldir.
Bu ekosistem sayesinde, projelerinizi küçük ve iyi tanımlanmış kasalar halinde yapılandırmak, aralarında kod paylaşmak ve topluluk tarafından oluşturulan çözümleri yeniden kullanmak yaygın bir uygulamadır. Örneğin, gelişmiş eşzamanlılık için, asenkron programlama için Tokio veya yüksek performanslı eşzamanlı veri yapıları için Crossbeam gibi kasalara sahip olacaksınız.
Rust'ta eşzamanlılık: iş parçacıkları, karşılıklı dışlamalar, kanallar ve atomlar
Eşzamanlılık, Rust'ın bu kadar ilgi çekmesinin nedenlerinden biridir: Çok çekirdekli işlemcilerden faydalanmanızı sağlar. iş parçacıklarının ve paylaşılan belleğin tipik hatalarına düşmedenEğer bu konulara ilk defa yaklaşıyorsanız, birkaç kavramı birbirinden ayırmak faydalı olacaktır.
Eşzamanlılık, zaman içinde çakışan birden fazla görevi, bir veya birden fazla çekirdekte yürütmeyi içerir. Rust'ta, paralel olarak çalışmak için sistem iş parçacıkları oluşturabilirsiniz ve dil, aralarındaki veri paylaşımının güvenli olmasını sağlamak için size rehberlik eder. Klasik bir hata, iki iş parçacığının aynı anda verilere erişip değiştirdiği ve sonucun yürütme sırasına bağlı olduğu yarış durumudur; bu, hata ayıklaması çok zor bir durumdur.
Paylaşılan verilere erişimi koordine etmek için Rust, aşağıdaki gibi ilkel öğelere güvenir: mutekskarşılıklı dışlamayı garanti eden: kritik bölüme aynı anda yalnızca bir iş parçacığı girebilir. Bununla birlikte Arc<T> Sahipliği iş parçacıkları arasında paylaşmak için, sahiplik ve ödünç alma kurallarına uyan paylaşımlı veri yapıları oluşturmak mümkündür.
Rust'ta yoğun bir şekilde teşvik edilen, iş parçacıklı iletişimin bir diğer yaygın biçimi, mesaj geçişini kullanarak canalesBir kanalın bir gönderici ucu ve bir alıcı ucu vardır; iş parçacıkları mesajları (değerleri) bu uçtan geçirir, bu da değiştirilebilir paylaşımlı belleğin kullanımını azaltır ve sistemin durumu hakkında akıl yürütmeyi kolaylaştırır.
Düşük seviyeli eşzamanlılığa daha derinlemesine baktığınızda aşağıdakiler ortaya çıkar: atom tipleriAtomik değişkenlere, iş parçacığı açısından bölünemez işlemler aracılığıyla erişilir. Bu, paylaşımlı sayaçların, durum bayraklarının, kilitsiz kuyrukların ve daha fazlasının uygulanmasına olanak tanır. Atomik değişkenlerde ustalaşmak, bellek modellerini ve erişim komutlarını anlamayı gerektirir, bu nedenle birçok geliştirici bu ayrıntılara dalmadan önce karşılıklı dışlamalar ve kanallarla başlamayı tercih eder.
Eşzamanlılık ve atomik öğrenme için ilk adımlar ve kaynaklar
Eğer arenaya daha önce hiç deneyiminiz olmadan giriyorsanız, en akıllıca hareket tarzı şudur: genel kavramların sağlam bir temelini oluşturmak Rust'ın atom tipleri gibi gelişmiş araçlara geçmeden önce. "Rust'u Programlama" gibi kitaplar kademeli bir giriş sunar, ancak atom tipleri ve kilitlere odaklanan eserlerin ilk başta yoğun görünmesi normaldir.
Daha fazla kolaylık için, öncelikle kendinizi şu şekilde tanıtmanız önerilir: Geleneksel iş parçacıkları, karşılıklı dışlama ve mesaj iletimi Rust'ta. Örneklerle oynayın std::thread, std::sync::Mutex, std::sync::Arc ve kanallar std::sync::mpsc Derleyicinin sizi nasıl yönlendirdiğini ve hangi hatalardan kaçındığını anlamanıza yardımcı olur.
Paralel olarak, Rust'a odaklanmasalar bile genel olarak eşzamanlılık hakkında giriş düzeyindeki kaynakları incelemeniz şiddetle tavsiye edilir: yarış koşullarının ne olduğu, engellemenin ne anlama geldiği, paylaşılan belleğin mesaj geçişine karşı ne anlama geldiği ve kilitlerin nasıl kullanıldığı. Bu kavramlar sizin için doğal hale geldiğinde, atom fiziği artık "kara büyü" olmaktan çıkar. ve onlar da sadece birer araç haline gelirler, ama çok hassas bir araç.
Rust'ta atomlar ve kilitler hakkında daha ileri düzey metinlere döndüğünüzde, her yapının çözmeye çalıştığı problemi zaten anlıyorsanız, mantığı takip etmek çok daha kolay olacaktır: basit bir iş parçacığı güvenli sayacından, çekişmeyi en aza indiren kilitsiz yapılara kadar.
Sonuç olarak Rust hem yüksek seviyeli ilkel araçlar hem de çok düşük seviyeli araçlar sunar ve asıl mesele, probleminizi çözen en güvenli soyutlama seviyesini seçmek ve atomik koda başvurmaktır. unsafe yalnızca gerçek anlamda değer kattığında ve bunun etkilerini tam olarak anladığınızda.
Türler, sahiplik, ödünç alma, kasalar, araçlar ve eşzamanlılık ilkel öğelerinden oluşan bu ekosistemin tamamı, yazmak için bir dil sunmak üzere bir araya geliyor hızlı, sağlam ve bakımı kolay yazılımBu, sistem programlamasını tarihsel olarak etkileyen birçok hata türünü en aza indirir. Küçük projeler, Rustlings gibi alıştırmalar ve resmi belgeler üzerinde pratik yaptıkça, bu kavramlar katı kurallar gibi görünmekten, sorun üretime geçmeden önce sizi uyaran bir müttefike dönüşecektir.
Genel olarak bayt ve teknoloji dünyası hakkında tutkulu bir yazar. Bilgilerimi yazarak paylaşmayı seviyorum ve bu blogda da bunu yapacağım; size gadget'lar, yazılım, donanım, teknolojik trendler ve daha fazlasıyla ilgili en ilginç şeyleri göstereceğim. Amacım dijital dünyada basit ve eğlenceli bir şekilde gezinmenize yardımcı olmaktır.