Rust (programlama dili) - Rust (programming language)

Pas
Bir zincir dişlisine yerleştirilmiş büyük harfli bir R harfi
Resmi Rust logosu
paradigmalar Çoklu paradigma : eşzamanlı , işlevsel , genel , zorunlu , yapılandırılmış
Tarafından tasarlanmış Graydon Hoare
geliştirici Pas Vakfı
İlk ortaya çıktı 7 Temmuz 2010 ; 11 yıl önce ( 2010-07-07 )
kararlı sürüm
1.57.0  Bunu Vikiveri'de düzenle / 2 Aralık 2021 ; 29 gün önce ( 2 Aralık 2021 )
yazma disiplini Afin , çıkarsanan , nominal , statik , güçlü
uygulama dili Pas
platformu AMD64 , i686 , kol , AArch64 , ARMv7 , mips , mips64 , mipsel , mips64el , PowerPC , PowerPC64 , powerpc64le , risk-V , s390x , WebAssembly
işletim sistemi Windows , Linux , macOS , FreeBSD , NetBSD , Illumos , Haiku , Android , Redox , iOS , Fuşya
Lisans MIT veya Apache 2.0
Dosya adı uzantıları .rs, .rlib
İnternet sitesi www .rust-lang .org
Tarafından etkilenmiş
Etkilenen

Rust , performans ve güvenlik , özellikle güvenli eşzamanlılık için tasarlanmış çok paradigmalı , genel amaçlı bir programlama dilidir . Rust, sözdizimsel olarak C++'a benzer , ancak referansları doğrulamak için bir ödünç alma denetleyicisi kullanarak bellek güvenliğini garanti edebilir . Rust , çöp toplama olmadan bellek güvenliğini sağlar ve referans sayımı isteğe bağlıdır. Rust, bir sistem programlama dili olarak adlandırılmıştır ve işlevsel programlama gibi üst düzey özelliklere ek olarak , düşük düzeyli bellek yönetimi için mekanizmalar da sunar .

Rust, orijinal olarak Dave Herman, Brendan Eich ve diğerlerinin katkılarıyla Mozilla Research'te Graydon Hoare tarafından tasarlandı . Tasarımcılar, Servo deneysel tarayıcı motorunu ve Rust derleyicisini yazarken dili geliştirdiler . Endüstride artan bir kullanım kazanmıştır ve Microsoft , güvenli ve güvenlik açısından kritik yazılım bileşenleri için dil ile denemeler yapmaktadır.

Rust, 2016'dan beri her yıl Stack Overflow Geliştirici Anketi'nde "en sevilen programlama dili" seçildi , ancak 2021'de katılımcıların yalnızca %7'si tarafından kullanıldı.

Tarih

Bir Rust programı derleme örneği

Dil, 2006 yılında Mozilla çalışanı Graydon Hoare tarafından başlatılan kişisel bir projeden doğdu. Hoare, projenin adını muhtemelen pas mantarlarından aldığını ve adın da "sağlam"ın bir alt dizisi olduğunu belirtti . Mozilla çalışma başlangıç kaymıştır, 2009 yılında projeyi sponsor başladı ve aynı yıl 2010 yılında bunu açıkladı derleyici (yazılı OCaml bir kadar) LLVM tabanlı kendi kendine barındırmayı derleyici Rust yazılmış. adı rustc , 2011'de kendini başarıyla derledi .

Rust derleyicisinin ilk numaralı alfa öncesi sürümü Ocak 2012'de gerçekleşti. İlk kararlı sürüm olan Rust 1.0, 15 Mayıs 2015'te yayınlandı. 1.0'dan sonra, her altı haftada bir kararlı nokta sürümleri teslim edilirken, özellikler her gece geliştirilir. Günlük sürümlerle Rust, ardından altı hafta süren beta sürümleriyle test edildi. Her 2 ila 3 yılda bir yeni bir Rust "Edition" üretilir. Bu, Rust's Train yayın programının sık doğası nedeniyle değişiklikler için kolay bir referans noktası sağlamanın yanı sıra, kırılma değişiklikleri yapmak için bir pencere sağlamak içindir. Sürümler büyük ölçüde uyumludur.

0.4 sürümünden önce geleneksel statik yazmanın yanı sıra , Rust ayrıca typestates'i de destekliyordu . Typestate sistemi, özel bir checkifade kullanarak, program ifadelerinden önce ve sonra iddiaları modelledi . Tutarsızlıklar , C veya C++ kodundaki iddialarda olduğu gibi , çalışma zamanı yerine derleme zamanında keşfedilebilir . Typestate kavramı, ilk kez NIL dilinde tanıtıldığı için Rust'a özgü değildi . Typestates, pratikte çok az kullanıldıklarından kaldırıldı, ancak aynı işlevsellik Rust'ın hareket semantiğinden yararlanılarak elde edilebilir .

Nesne sistem tarzı alternatifler 0.2, 0.3 içinde önemli ölçüde değişmiş ve Rust 0.4. Sürüm 0.2, sınıfları ilk kez tanıttı ve sürüm 0.3 , arabirimlerin kullanımı yoluyla yıkıcılar ve polimorfizm dahil olmak üzere çeşitli özellikler ekledi . Rust 0.4'te, kalıtım sağlamanın bir yolu olarak özellikler eklendi ; arayüzler özelliklerle birleştirildi ve ayrı bir özellik olarak kaldırıldı. Sınıflar da kaldırıldı ve bir dizi uygulama ve yapılandırılmış tür ile değiştirildi .

Rust 0.9 ile başlayan ve Rust 0.11 ile biten Rust'ın iki yerleşik işaretçi türü vardı: ~ve @, çekirdek bellek modelini basitleştiren . Standart kitaplıktaki bu işaretçi türlerini Boxve (artık kaldırıldı) olarak yeniden uyguladı Gc.

Ocak 2014'te, ilk kararlı sürüm olan Rust 1.0'dan önce, Dr. Dobb's'un genel yayın yönetmeni Andrew Binstock, Rust'ın C++ ve diğer gelişmekte olan D , Go dillerine rakip olma şansı hakkında yorum yaptı. , ve Nim (sonra Nemrut). Binstock'a göre, Rust "olağanüstü derecede zarif bir dil olarak yaygın olarak görülürken", sürümler arasında tekrar tekrar değiştiği için benimseme yavaşladı.

Rust , örneğin C dilinden çağrılabilen ve C'yi çağırabilen bir yabancı işlev arayüzüne (FFI) sahiptir. C++'ı çağırmak tarihsel olarak (herhangi bir dilden) zorlayıcı olsa da, Rust'ın çağrıya izin vermek için bir CXX kütüphanesi vardır. C++'dan ve "CXX sıfır veya ihmal edilebilir ek yüke sahip."

Ağustos 2020'de Mozilla, COVID-19 pandemisinin uzun vadeli etkisinin neden olduğu kurumsal yeniden yapılanmanın bir parçası olarak dünya genelindeki 1.000 çalışanından 250'sini işten çıkardı . İşten çıkarılanlar arasında Rust ekibinin çoğu yer alırken, Servo ekibi tamamen dağıtıldı. Olay, Rust'ın geleceğiyle ilgili endişeleri artırdı.

Sonraki hafta, Rust Çekirdek Ekibi işten çıkarmaların ciddi etkisini kabul etti ve bir Rust vakfı için planların yapıldığını duyurdu. Vakfın ilk hedefi, tüm marka ve alan adlarının sahipliğini almak ve ayrıca maliyetleri için mali sorumluluk almak olacaktır.

8 Şubat 2021'de Rust Foundation'ın kuruluşu, beş kurucu şirketi ( AWS , Huawei , Google , Microsoft ve Mozilla) tarafından resmen ilan edildi .

6 Nisan 2021'de Google , C/C++'a alternatif olarak Android Açık Kaynak Projesi kapsamında Rust desteğini duyurdu .

Sözdizimi

İşte bir "Merhaba Dünya!" Rust ile yazılmış bir program . println! Makro mesajı yazdırır standart çıkışa .

fn main() {
    println!("Hello, World!");
}

Sözdizimi Rust benzer C ve C ++ tarafından sınırlanan kod blokları ile, kıvırcık parantez ve akış kontrolü olarak anahtar gibi if, else, whileve for, işlevleri tanımlamak için belirli bir sözdizimi daha benzerdir, ancak Pascal . C ve C++ ile sözdizimsel benzerliğine rağmen, Rust'ın semantiği, ML dil ailesine ve Haskell diline daha yakındır . Bir fonksiyon gövdesinin neredeyse her parçası bir ifadedir , hatta kontrol akışı operatörleri bile. Örneğin, sıradan ififade aynı zamanda ALGOL 60 tarafından kullanılan bir deyim olan C'nin üçlü koşullu ifadesinin yerini alır . Lisp'te olduğu gibi , bir fonksiyonun bir ifade ile bitmesi gerekmez : bu durumda, noktalı virgül atlanırsa, fonksiyondaki son ifade , faktöriyel fonksiyonun aşağıdaki özyinelemeli uygulamasında görüldüğü gibi , dönüş değerini yaratır : return

fn factorial(i: u64) -> u64 {
    match i {
        0 => 1,
        n => n * factorial(n-1)
    }
}

Aşağıdaki yinelemeli uygulama, ..=kapsayıcı bir aralık oluşturmak için operatörü kullanır :

fn factorial(i: u64) -> u64 {
    (2..=i).product()
}

Rust'taki daha gelişmiş özellikler, tür polimorfizmi elde etmek için genel işlevlerin kullanımını içerir . Aşağıdaki, genel bir işlev kullanarak toplama işlemi uygulanan iki şeyin toplamını hesaplayan bir Rust programıdır:

use std::ops::Add;

fn Sum<T: Add<Output = T> + Copy> (num1: T, num2: T) -> T {
    num1 + num2
}

fn main() {
    let result1 = Sum(10,20);
    println!("Sum is: {:?}", result1);
    
    let result2 = Sum(10.23,20.45);
    println!("Sum is: {:?}", result2);
}

Özellikleri

Mozilla'nın Rust ekibinden Emily Dunham tarafından Rust üzerine bir sunum ( linux.conf.au konferansı, Hobart, 2017)

Pas derece eşzamanlı ve son derece güvenli bir dil olması amaçlanmıştır sistemleri ve geniş programlama yaratma ve büyük sistem bütünlüğünü korumak sınırlarını koruyarak olduğunu. Bu, güvenlik, bellek düzeninin kontrolü ve eşzamanlılığa vurgu yapan bir özellik setine yol açmıştır .

hafıza güvenliği

Rust, bellek açısından güvenli olacak şekilde tasarlanmıştır . Boş işaretçilere , sarkan işaretçilere veya veri yarışlarına izin vermez . Veri değerleri yalnızca, tümü girdilerinin önceden başlatılmasını gerektiren sabit bir dizi form aracılığıyla başlatılabilir. Geçerli veya NULLbağlantılı liste veya ikili ağaç veri yapılarında olduğu gibi işaretçileri çoğaltmak için , Rust çekirdek kitaplığı, bir işaretçinin değerinin veya değerinin olup olmadığını test etmek için kullanılabilen bir seçenek türü sağlar . Rust, derleme zamanında ödünç alma denetleyicisi tarafından kontrol edilen yaşam sürelerini yönetmek için sözdizimi ekledi . Güvenli olmayan kod, anahtar kelimeyi kullanarak bu kısıtlamalardan bazılarını bozabilir . SomeNoneunsafe

Hafıza yönetimi

Rust, otomatik çöp toplama kullanmaz . Bellek ve diğer kaynaklar, isteğe bağlı referans sayımı ile kaynak edinimi başlatma kuralı aracılığıyla yönetilir . Rust, çok düşük ek yük ile kaynakların deterministik yönetimini sağlar . Rust , değerlerin yığın tahsisini destekler ve örtük kutulama gerçekleştirmez .

&Çalışma zamanı referans sayımını içermeyen referanslar kavramı ( sembol kullanılarak) vardır. Bu tür işaretçilerin güvenliği derleme zamanında doğrulanır, işaretçilerin sarkması ve diğer tanımsız davranış biçimleri önlenir . Rust'ın tür sistemi, formun paylaşılan, değişmez işaretçilerini, formun &Tbenzersiz, değiştirilebilir işaretçilerinden ayırır &mut T. Değişken bir işaretçi değişmez bir işaretçiye zorlanabilir, ancak bunun tersi olamaz.

Mülkiyet

Pas tüm değerler benzersiz sahibi olması bir mülkiyet sistemi vardır ve kapsam değerinin sahibinin kapsamı aynıdır. Değerler, değişmez referans kullanılarak, kullanılarak &T, değiştirilebilir referansla, kullanılarak &mut Tveya değer kullanılarak , kullanılarak iletilebilir T. Her zaman, birden çok değişmez referans veya bir değişken referans olabilir (örtük okuyucular-yazar kilidi ). Rust derleyicisi bu kuralları derleme zamanında uygular ve ayrıca tüm referansların geçerliliğini kontrol eder.

Türler ve polimorfizm

Rust'ın tür sistemi , Haskell dilindeki tür sınıflarından esinlenerek, özellikler adlı bir mekanizmayı destekler . Özellikler türleri açıklar ve farklı türler arasında paylaşılan davranışı tanımlamak için kullanılır : örneğin, kayan noktalar ve tamsayılar, her ikisi de eklenebildiklerinden bir "Ekle" özelliği uygulayabilir; ve bir dize olarak yazdırılabilen herhangi bir tür, "Görüntüleme" veya "Hata Ayıklama" özelliklerini uygular. Bu tesis ad hoc polimorfizm olarak bilinir .

Rust , anahtar kelimeyle bildirilen değişkenler için tür çıkarımı kullanır . Bu tür değişkenler, türlerini belirlemek için başlangıçta atanacak bir değer gerektirmez. Herhangi bir kod dalı değişkeni atama olmadan bırakırsa derleme zamanı hatası oluşur. Birden çok kez atanan değişkenler, anahtar kelimeyle işaretlenmelidir (mutable'ın kısaltması). letmut

Bir işleve , aynı işlevin farklı türlere uygulanmasına izin veren genel parametreler verilebilir . Genel işlevler, belirli bir özelliği veya özellikleri uygulamak için genel türü sınırlayabilir; örneğin, bir "ekle" işlevi, türün "Ekle" uygulamasını gerektirebilir. Bu, genel bir işlevin tanımlanır tanımlanmaz tip denetiminin yapılabileceği anlamına gelir .

Rust jeneriklerinin uygulanması, tipik C++ şablonlarının uygulanmasına benzer: her örnekleme için kodun ayrı bir kopyası oluşturulur. Buna monomorfizasyon denir ve tipik olarak Java ve Haskell'de kullanılan tür silme şemasıyla çelişir . Rust'ın türü silme, anahtar sözcüğü kullanılarak da kullanılabilir dyn. Monomorfizasyonun avantajı, her özel kullanım durumu için optimize edilmiş koddur; dezavantajı, artan derleme süresi ve ortaya çıkan ikili dosyaların boyutudur.

Rust'ta, structanahtar kelime ile kullanıcı tanımlı türler oluşturulur . Bu türler genellikle diğer dillerdeki nesneler veya sınıflar gibi veri alanlarını içerir. implAnahtar (veri ve işlevi, bir yapı içinde ayrı olarak tanımlandığı gibidir) yapı için yöntemleri tanımlar ya da uygulayabilir özelliği yapısı. Bir özellik, bir yapının belirli gerekli yöntemleri uyguladığı bir sözleşmedir. Nitelikler, jenerik parametreleri kısıtlamak için kullanılır ve özellikler, kullanıcı tanımlı olandan daha fazla yöntemle bir yapı sağlayabilir. Örneğin, özellik , tür için yöntemin tanımlanmasını Iteratorgerektirir next. Bir kez nextbir yöntem tanımlanır özellik gibi yineleyici üzerinde yaygın fonksiyonel yardımcı yöntemler sağlar mapya da filter.

Rust içindeki nesne sistemi, uygulamalara, özelliklere ve yapılandırılmış türlere dayanmaktadır . Uygulamalar, diğer dillerdeki sınıflara benzer bir rol üstlenir ve anahtar kelime ile tanımlanır impl. Özellikler kalıtım ve polimorfizm sağlar; yöntemlerin tanımlanmasına ve uygulamalara karıştırılmasına izin verir . Alanları tanımlamak için yapılandırılmış türler kullanılır. Uygulamalar ve özellikler, alanları kendileri tanımlayamaz ve yalnızca özellikler kalıtım sağlayabilir. Diğer yararları arasında, bu engeller elmas sorunu ait çoklu miras C ++ gibi. Başka bir deyişle, Rust, arabirim devralmayı destekler ancak uygulama devralma ile kompozisyonun yerini alır ; bkz . kalıtım üzerindeki kompozisyon .

Bileşenler

Rust, Rust özellik setini genişleten ve Rust geliştirmeyi kolaylaştıran çok sayıda bileşen içerir. Bileşen kurulumu tipik olarak Rust projesi tarafından geliştirilen bir Rust araç zinciri yükleyicisi olan rustup tarafından yönetilir .

Kargo

Cargo, Rust'ın yapı sistemi ve paket yöneticisidir . Kargo, bağımlılıkları indirmeyi ve bağımlılıkları oluşturmayı yönetir. Kargo ayrıca küçük ve diğer Rust bileşenleri için bir sarıcı görevi görür . Projelerin belirli bir dizin yapısını takip etmesini gerektirir.

Bir Rust paketinin bağımlılıkları bir Kargo'da belirtilir . toml dosyasını sürüm gereksinimleriyle birlikte, Cargo'ya bağımlılığın hangi sürümlerinin paketle uyumlu olduğunu söyler. Varsayılan olarak, Cargo bağımlılıklarını kullanıcının katkıda bulunduğu kayıt defteri sandıklarından alır ancak yerel dosya sistemindeki Git depoları ve paketleri de bağımlılıklar olarak belirtilebilir.

Rustfmt

Rustfmt, Rust için bir kod biçimlendiricidir . Rust kaynak kodunu girdi olarak alır ve Rust stil kılavuzuna veya bir rustfmt.toml dosyasında belirtilen kurallara göre biçimlendirilmiş kod üretmek için boşluk ve girintiyi değiştirir . Rustfmt, bağımsız bir program olarak veya Cargo aracılığıyla bir Rust projesinde çağrılabilir.

klişe

Clippy, Rust kodunun doğruluğunu, performansını ve okunabilirliğini geliştirmek için Rust'ın yerleşik astarlama aracıdır. 2014 yılında oluşturuldu ve adını aynı Microsoft Office özelliğinden aldı . 2021 itibariyle Clippy, çevrimiçi olarak göz atılabilen ve kategoriye göre filtrelenebilen 450'den fazla kurala sahiptir. Bazı kurallar varsayılan olarak devre dışıdır.

RLS

RLS, IDE'lere ve metin düzenleyicilere bir Rust projesi hakkında daha fazla bilgi sağlayan bir dil sunucusudur . Diğer işlevlerin yanı sıra Clippy aracılığıyla linting kontrolleri, Rustfmt aracılığıyla biçimlendirme , Racer aracılığıyla otomatik kod tamamlama sağlar. Racer'ın gelişimi pas analizörü lehine yavaşladı .

Dil uzantıları

Prosedürel makro mekanizmayı kullanarak Rust dilini genişletmek mümkündür.

Prosedürel makrolar, derleyicinin belirteç akışını değiştirmek için derleme zamanında çalışan Rust işlevlerini kullanır. Bu , benzer hedeflere ulaşmak için kalıp eşleştirmeyi kullanan bildirime dayalı makro mekanizmasını ( örnek olarak makrolar olarak da bilinir) tamamlar .

Prosedürel makrolar üç şekilde gelir:

  • İşlev benzeri makrolar custom!(...)
  • Makro türetme #[derive(CustomDerive)]
  • Özellik makroları #[custom_attribute]

println!Makro bir makro fonksiyonu gibi bir örneğidir ve serde_deriveokuma ve bu gibi birçok formatta veri yazmak için kodu üretmek için yaygın olarak kullanılan bir kütüphanedir JSON . Öznitelik makroları, R'yeextendr Rust bağlamaları için kitaplık gibi dil bağlamaları için yaygın olarak kullanılır .

Aşağıdaki kod, JSON okuma ve yazmanın yanı sıra hata ayıklama için bir yapıyı biçimlendirme yeteneğini uygulamak için Serialize, Deserializeve Debugtüretme yordamsal makrolarının kullanımını gösterir .

use serde_json::{Serialize, Deserialize};

#[derive(Serialize, Deserialize, Debug)]
struct Point {
    x: i32,
    y: i32,
}

fn main() {
    let point = Point { x: 1, y: 2 };

    let serialized = serde_json::to_string(&point).unwrap();
    println!("serialized = {}", serialized);

    let deserialized: Point = serde_json::from_str(&serialized).unwrap();
    println!("deserialized = {:?}", deserialized);
}

Verim

Rust, " güvenlikten ödün vermeden, deyimsel C++ kadar verimli ve taşınabilir olmayı" hedefliyor . Rust LLVM kullandığından, LLVM'deki performans iyileştirmeleri de Rust'a aktarılır.

Benimseme

Parlak turuncu yengeç simgesi
Bazı Rust kullanıcıları kendilerini Rustaceans ( kabuklulara yapılan bir kelime oyunu ) olarak adlandırır ve Ferris'i resmi olmayan maskotları olarak kullanır.


Rust, büyük yazılım mühendisliği şirketleri tarafından benimsenmiştir. Örneğin, Dropbox artık Rust'ta ve Amazon , Facebook , Discord ve Mozilla Foundation'daki bazı bileşenlerde yazılmıştır . Rust, 2015 Stack Overflow yıllık anketinde en sevilen üçüncü programlama diliydi ve 2016-2021 için birinci sırada yer aldı.

Web tarayıcıları ve hizmetleri

  • OpenDNS , iki bileşeninde Rust kullanır.
  • Web tabanlı bir vektör grafik editörü olan Figma , Rust ile yazılmıştır.

İşletim sistemleri

  • Redox , Rust ile yazılmış bir mikro çekirdek içeren "tam gelişmiş Unix benzeri bir işletim sistemidir" .
  • "Dil içi tasarıma" sahip deneysel bir işletim sistemi olan Theseus, Rust'ta yazılmıştır.
  • Google Fuşya yeteneği tabanlı işletim sistemi Rust yazılmış bazı araçlara sahiptir.
  • eksa bir Unix / Linux komut satırı alternatiftir ls Rust yazılmış.

Diğer önemli projeler ve platformlar

  • İkilik yazılmış çekirdek altyapı artırmak için, hem de müşteri tarafındaki video kodlama gibi onun arka uç bölümleri için Rust kullanır iksir .
  • Azure hizmetlerini ve IoT cihazlarında yapay zekayı çalıştırmak için kullanılan bir platform olan Microsoft Azure IoT Edge, Rust'ta uygulanan bileşenlere sahiptir.
  • Ametist ve Bevy , Rust'ta yerleşik veri odaklı oyun motorlarıdır.
  • Ruffle , Rust ile yazılmış açık kaynaklı bir SWF öykünücüsüdür.

Yönetim

Pas Vakfı
Rust Foundation logosu.png
oluşum 8 Şubat 2021 ; 10 ay önce ( 2021-02-08 )
kurucular
Tip Kar amacı gütmeyen kuruluş
Konum
Shane Miller
Rebecca Rumbul
İnternet sitesi vakıf .rust-lang .org

Pas Vakfı bir olan kar amacı gütmeyen üyelik organizasyonu dahil Delaware , ABD Rust gelişiminin altında yatan teknik altyapı, Pas proje ekibi üyeleri ve kullanıcı topluluğunu yetiştirilmesi, dilin bakım ve gelişimini destekleyen yönetmenin temel amaçlarıyla, ve Rust ticari markasının yönetimi ve idaresi.

8 Şubat 2021'de beş kurucu kurumsal üyeyle (Amazon Web Services, Huawei, Google, Microsoft ve Mozilla) kuruldu. Vakfın yönetim kuruluna Shane Miller başkanlık ediyor. 2021'in sonundan itibaren, İcra Direktörü ve CEO'su Rebecca Rumbul'dur. Bundan önce, Ashley Williams geçici icra direktörüydü.

Gelişim

Rust konferansları şunları içerir:

  • RustConf: Portland, Oregon'da yıllık bir konferans . 2016'dan beri her yıl düzenlenmektedir ( COVID-19 salgını nedeniyle 2020 ve 2021 hariç ).
  • Rust Belt Pas: Bir #rustlang konferans Rust Belt
  • RustFest: Avrupa'nın @rustlang konferansı
  • RustCon Asya
  • Pas LATAM
  • Küresel Oksitleme

Ayrıca bakınız

notlar

Referanslar

Dış bağlantılar