Rust | |
---|---|
![]() Rust logo | |
Faililaiend |
.rs, .rlib |
Paradigma | Funktsionaalne, imperatiivne, struktureeritud, üldine, mitmeparadigmaline |
Väljalaskeaeg | 7. juuli 2010 |
Looja | Graydon Hoare |
Arendaja | The Rust Project |
Viimane väljalase |
1.78.0 (2.05.2024) ![]() |
Tüüpimine | lineaarne, nominaalne, staatiline, tugev |
Implementatsioonid | Rust |
Mõjutatud keeltest | Alef,[1] C sharp,[1] C++,[1] Cyclone,[1][2] Erlang,[1] Haskell,[1] Limbo,[1] Newsqueak,[1] OCaml,[1] Ruby,[1] Scheme,[1] Standard ML,[1] Swift[1][3] |
Mõjutanud keeli | Crystal, Elm,[4] Idris,[5] Spark,[6] Swift[7] |
OS | Linux, macOS, Windows, FreeBSD, OpenBSD, Redox, Android, iOS[8] |
Litsents | MIT või Apache 2.0[9] |
Veebileht |
www |
Rust on mitmeparadigmaline üldotstarbeline programmeerimiskeel, mis keskendub peamiselt tüübikindlusele, jõudlusele ja turvalisusele, eriti turvalisele samaaegsusele.[10][11] Rust on süntaksi poolest sarnane C++ga,[12] kuid on disainitud selleks, et tagada parem mälu turvalisus hoides kõrget jõudlust. Keeles viitavad kõik viitajad alati asjakohasele mälule (mäluobjektid viidete taga on alati korrektsed) ilma, et oleks vajalik laialdasem mäluhaldussüsteem, nagu näiteks prügikogumine.
Mäluturvalisuse kindlustamiseks ja andmete võidujooksude vältimiseks kasutab Rust "laenukontrollijat", mis jälgib kompileerimise ajal iga programmis oleva objektiviida eluaega. Rusti arendust inspireerisid funktsionaalne programmeerimine, sealhulgas muutmatus, kõrgema järgu funktsioonid ja algebralised andmetüübid.
Algselt oli Rust disainitud Graydon Hoare'i poolt Mozilla uurimisasutuses, kaasa aitasid ka Dave Herman, Brendan Eich ja teised.[13][14] Disainerid arendasid keelt samal ajal kui nad kirjutasid koodi Servo küljendusmootori[15] ja Rusti enda kompileerija jaoks.
Rust on alates 2016. aastast olnud igal aastal Stack Overflow arendajate küsitluses olnud "kõige rohkem armastatud programmeerimiskeel".[16][17][18][19] Keelt kasutavad firmad nagu Amazon, Discord, Dropbox, Google (Alphabet), Facebook ja Microsoft. Detsembris 2022 sai sellest ainus keel peale C ja assemblerkeele, mida on võimalik kasutada Linuxi tuuma arendamises.
Rust on ette nähtud väga tihedalt koos töötavate ja väga turvaliste süsteemide[20] jaoks ning suurte programmide loomiseks.
Rusti süntaks on sarnane keeltega C ja C++, kus koodiblokid on eraldatud loogeliste sulgude ja käsuvoo märksõnadega nagu näiteks if
, else
, while
ja for
. Siiski pole kõik C ja C++ märksõnad rakendatud ning mõned Rust funktsioonid (nagu näiteks match
mustrite sobitamiseks) näivad võõratena nendele, kes on neid keeli õppinud. Vaatamata Rusti pealiskaudsele sarnasusele C ja C++ga on Rusti süntaks sügavamas mõistes sarnane ML perekonda kuuluvate keeltega ja Haskell keelega. Peaaegu iga osa funktsioonist on väljend,[21] isegi käsuvoo operaatorid. Näiteks tavaline if
lause toimub C keele kolmepoolses tingimuslikus operaatoris. Funktsioon ei pea lõppema return
väljendiga, mis juhul tagastab viimane väljend funktsioonis (ja koodiblokis) tagastusväärtuse juhul, kui semikoolon on ära jäetud.
Rust on disainitud olema ohutu mälule ning ei luba kasutada null viitajaid, rippuvaid viitajaid, ega andmete võidujooksu ohutus koodis.[22][23][24][25] Andmete väärtuseid võib lähtestada vaid läbi kindlate keelevormide, kus kõikide sisendite väärtused peavad olema juba saadaval.[26]
Rusti omanikusüsteem koosneb reeglitest, mis garanteerivad mäluohutust ilma prügikogujata. Programmi jooksmise ajal, peab igal väärtusel olema muutuja, mis on selle omanik ja igal väärtusel saab olla ainult üks omanik. Väärtuse omanik muutub, kui väärtus määratakse uue nime alla või edastatakse funktsioonile parameetrina. Väärtust saab ka laenata, mis tähendab, et väärtus kantakse ajutiselt teisele funktsioonile ning siis antakse omanikule tagasi.[27] Nende reeglite abil saab Rust vältida rippuvate viitajate sattumist koodi.[27][28]
Keel kasvas välja Graydon Hoare'i 2006. aastal alguse saanud isiklikust projektist.[11] Mozilla alustas projekti sponsoreerimist 2009. aastal[11] ning kuulutas selle välja aastal 2010.[29][30] Samal aastal liikus töö algsest kompileerijast (kirjutatud OCaml keeles) iseseisvale kompileerijale, mis oli kirjutatud Rust keeles.[31]
Kõige esimene nummerdatud alfaeelne versioon anti välja 2012 aasta jaanuaris.[32][33] Rust 1.0, kõige esimene stabiilne versioon, anti välja 15 mai 2015. Pärast seda antakse välja uus stabiilne versioon iga kuue nädala tagant.[34]
Lihtne "Tere maailm!" programm kirjutatud Rust keeles.
fn main() {
println!("Tere maailm!");
}
fn factorial(i: u64) -> u64 {
match i {
0 => 1,
n => n * factorial(n-1)
}
}
fn factorial(i: u64) -> u64 {
let mut acc = 1;
for num in 2..=i {
acc *= num;
}
acc
}
fn factorial(i: u64) -> u64 {
(1..=i).product()
}
Igal viitajal on eluaeg, mis tähendab teatud asukohti koodis, kus väärtus siiamaani eksisteerib. Näiteks on eluaeg kohalikule muutujale viitaval viitajal see koodiplokk, milles ta defineeritud on:
fn main() {
let r = 9; // ---------+-- eluaeg 'a
// |
{ // |
let x = 5; // -+-- eluaeg 'b
println!("r: {}, x: {}", r, x); // | |
} // -+ |
// |
println!("r: {}", r); // |
} // ---------+
Üks Rusti omapärasemaid omadusi on konkreetsed eluajad (ingl. "explicit lifetimes").[35][36] Siin on ebakorrektne funktsioon, mis võtaks parameetritena kaks sõneviitajat ja tooks tagasi viitaja pikimale:
fn pikim(x: &str, y: &str) -> &str {
if x.len() > y.len() {
x
}
else {
y
}
}
Rust ei lase seda funktsiooni kompileerida, sest seda funktsiooni mujalt kutsudes ei saa kompileerija kindel olla, kas üks viitaja võib elada kauem kui teine. On võimalik kirjutada variant sellest funktsioonist kasutades konkreetset eluaega, millele paneme juhusliku nime 'a
, kus mõlemad viitajad peavad elama sama kaua:
fn pikim<'a>(x: &'a str, y: &'a str) -> &'a str {
if x.len() > y.len() {
x
}
else {
y
}
}
Rust is not a particularly original language, with design elements coming from a wide range of sources. Some of these are listed below (including elements that have since been removed): SML, OCaml [...] C++ [...] ML Kit, Cyclone [...] Haskell [...] Newsqueak, Alef, Limbo [...] Erlang [...] Ruby [...] Swift [...] Scheme [...] C# [...]
Papers that have had more or less influence on Rust, or which one might want to consult for inspiration or to understand Rust's background. [...] Region based memory management in Cyclone [...] Safe memory management in Cyclone
I just added the outline of a Result library that lets you use richer error messages. It's like Either except the names are more helpful. The names are inspired by Rust's Result library.
((cite journal))
: viitemall journal nõuab parameetrit |journal=
(juhend)
Rust is syntactically similar to C++, but it provides increased speed and better memory safety
GH: A lot of obvious good ideas, known and loved in other languages, haven't made it into widely used systems languages ... There were a lot of good competitors in the late 1970s and early 1980s in that space, and I wanted to revive some of their ideas and give them another go, on the theory that circumstances have changed: the internet is highly concurrent and highly security-conscious, so the design-tradeoffs that always favor C and C++ (for example) have been shifting.
[Brendan Eich] noted that every year browsers fall victim to hacking in the annual Pwn2Own contest at the CanSecWest conference. "There's no free memory reads" in Rust, he said, but there are in C++. Those problems "lead to a lot of browser vulnerabilities" and would be solved by Rust, which is a self-compiling language.
... Other more complex data structures could clearly be implemented to allow greater levels of sharing, while making sure the interface is composed only of owned and managed references, and thus is safe from unplanned concurrent access and from dangling pointer errors.
At Mozilla Summit 2010, we launched Rust, a new programming language motivated by safety and concurrency for parallel hardware, the “manycore” future which is upon us.