Rust (ohjelmointikieli)

Ruoste
Kieliluokka proseduuriohjelmointikieli , toiminnallinen ohjelmointikieli , moniparadigmaohjelmointikieli , pakollinen ohjelmointikieli , järjestelmien ohjelmointikieli [d] , ilmainen ja avoimen lähdekoodin ohjelmisto , käännetty ohjelmointikieli ja ohjelmointikieli
Esiintyi 2006 [1] [5]
Tekijä Graydon-kuoro [d]
Kehittäjä Mozilla [1] , Graydon Hore [d] [1] [2] ja Rust Foundation [d] [3]
Tiedostotunniste _ .rs
Vapauta
Vaikutettu Alef [d] [6],C++[7],C#[7],Cyclone[7],Erlang[7],Haskell[7],Limbo[7], Newsqueak [d] ,OCaml[7],Ruby[ 7],Scheme[7],SML[7]jaSwift[7]
Lisenssi Apache License 2.0 [8] [9] ja MIT License [8] [9]
Verkkosivusto rust-lang.org
OS cross-platform
 Mediatiedostot Wikimedia Commonsissa

Rust (Rust, [ rʌst ]; rust englanniksi   -  "rust") on yleiskäyttöinen moniparadigma käännetty ohjelmointikieli , joka yhdistää toiminnalliset ja proseduaaliset ohjelmointiparadigmat ominaisuuksiin perustuvaan objektijärjestelmään . Muistin hallinta tapahtuu "omistus"-mekanismilla käyttämällä affine-tyyppejä [10] , jonka avulla voit olla ilman roskienkeräysjärjestelmää ohjelman suorittamisen aikana. Ruoste takaa muistin turvallisuuden kääntäjän sisäänrakennetun staattisen viitetarkistuksen ( lainatarkistus ) avulla. On työkaluja, joiden avulla voit käyttää olio-ohjelmoinnin tekniikoita [11] .

Tärkeimmät kieliprioriteetit: turvallisuus, nopeus ja samanaikaisuus . Rust soveltuu erityisesti järjestelmäohjelmointiin , sitä pidetään lupaavana kielenä käyttöjärjestelmäytimien kehittämisessä [10] . Rust on nopeudeltaan ja ominaisuuksiltaan verrattavissa C++ / C :hen , mutta tarjoaa enemmän turvallisuutta muistin kanssa työskennellessä, minkä tarjoavat kieleen sisäänrakennetut viiteohjausmekanismit. Rust-ohjelmien suorituskykyä helpottaa "nollakustannusten abstraktioiden" käyttö [12] .

Useiden vuosien aktiivisen kehityksen jälkeen ensimmäinen vakaa versio (1.0) julkaistiin 15. toukokuuta 2015, jonka jälkeen uusia versioita julkaistaan ​​6 viikon välein [13] . Kieliversioille, jotka on julkaistu 1.0:n jälkeen, on ilmoitettu yhteensopivuus taaksepäin [14] .

Mozilla Researchin kehittämä 2010-luvulta lähtien ja Mozilla Foundationin rahoittama . Vuodesta 2020 alkaen oli tarkoitus siirtää kielen immateriaalioikeudet sekä kehitys- ja rahoitusprosessit Rust Foundationille [15] . 8. helmikuuta 2021 viisi perustajayritystä ( AWS , Huawei , Google , Microsoft ja Mozilla ) ilmoittivat virallisesti Rust Foundationin perustamisesta. [16] [17]

Seitsemänä peräkkäisenä vuotena vuosina 2016–2022 Rust on sijoittunut suosituimpien ohjelmointikielten listalla sijalle 1 vuotuisessa Stack Overflow Developer Survey -tutkimuksessa [18] [19] [20] [21] .

Historia

Työn kielen parissa aloitti Mozillan työntekijä Graydon Hor vuonna 2006. Kirjoittaja antoi hankkeelle nimen Rust, hänen mukaansa ruosteperheen sieniin ( eng. rust fungi ) [22] .  

Vuonna 2009 [23] Mozilla alkoi erikseen sponsoroida Rustin kehitystä. Vuotta myöhemmin kieli esiteltiin virallisesti Mozilla Summit 2010 -tapahtumassa [24] . Alkuperäinen kääntäjä, joka on toteutettu OCamlissa , on korvattu uudella, Rustilla kirjoitetulla kääntäjällä, joka käyttää LLVM :ää konekoodin luomiseen [25] ; seuraavana vuonna uusi kääntäjä käänsi itsensä onnistuneesti ensimmäistä kertaa [26] .

Ensimmäinen virallinen alfaversio Rustista (0.1) julkaistiin tammikuussa 2012 [27] .

Huhtikuussa 2013 lanseerattiin Servo  , Mozillan kokeellinen projekti selainmoottorin kehittämiseksi Rustissa. [28]

Ensimmäinen vakaa versio Rustista (1.0) julkaistiin toukokuussa 2015. Ohjelmointirajapinnat ja kieliominaisuudet ovat läpikäyneet merkittävän uudistuksen, jonka jälkeen oletusarvoisesti jäljelle jää vain täysin käyttövalmiita ominaisuuksia, joiden toteutus ei muutu jatkossa. Kaikki muut toiminnot siirretään oletusarvoisesti kokeelliseen kategoriaan ja poistetaan toimituksesta [29] .

Tyyppijärjestelmä

Käytetään vahvaa staattista kirjoitusta . Geneeristä ohjelmointia tuetaan parametrisen polymorfismin tuella , automaattinen tyyppipäätelmä tarjotaan paikallisille muuttujille (mutta ei funktioparametreille).

Toteutettu tuki yksittäisille tietotyypeille – tyypit, joissa on täsmälleen yksi esiintymä ja jotka eivät vie muistitilaa, esimerkkejä:

Toteutetut tyhjät tietotyypit — tyypit, joita ei voida toteuttaa; toteutetaan lueteltuina tyypeinä, joilla ei ole vaihtoehtoja: enum Void {}.

Kaikki kielen tietotyypit on jaettu kahteen pääryhmään: yksinkertaisiin ja vakiokirjastotyyppeihin.

Yksinkertaiset tyypit (kieleen sisäänrakennetut vakiopituiset tyypit) - numeerinen, looginen, merkki, taulukko, viipale, merkkijono, monikko, viite, funktioosoitin. Jotkut yksinkertaisista tyypeistä ovat "kone", eli ne on toteutettu suoraan nykyaikaisissa prosessoreissa , kuten numeeriset, loogiset ja merkit. Vakiokirjaston tarjoamat tyypit std(muuttuva pituus): vektori, merkkijono, hash-taulukko ja vastaavat.

Numeeriset tyypit:

Boolen ( bool ): true, false.

Merkki ( char ): Tyyppi, joka edustaa Unicode-merkkiä (sisäinen dataesitys muodossa u32). Esimerkkiarvot: '₽', '\n', '\x7f', '\u{CA0}',

Funktioosoitin ( function pointer ) : Funktioobjekteilla on niiden allekirjoituksen eli parametrien ja palautusarvon määräämä tyyppi. Esimerkki:let f: fn(i32) -> i32 = plus_one;

Viite (jaettu laina - jaettu laina ) &T(jaettu, ei vaihtuva, ei omista resurssia) sen sijaan, että se omistaisi resurssin, se lainaa sitä. Nimet, jotka lainaavat jotain, eivät vapauta resurssia, kun ne menevät soveltamisalan ulkopuolelle. Lisäksi omistajan nimet siirtyvät lainaksi.

Viite, joka on muuttuva (muuttuva laina ) ( &mut Tei omista resurssia). Voit muuttaa lainattavaa resurssia.

Rakenteet ( struct ):

Kokoelmat :

Merkkijonotyypit :

Luettelo ( enum ): Rustin luettelon jokainen vaihtoehto voidaan liittää myös muihin tietoihin, minkä vuoksi luetteloa kutsutaan myös tagged liitoksi tai summatyypiksi . Muunnelmien ilmoittamisen syntaksi on samanlainen kuin rakenteiden ilmoittamisen syntaksi: voi olla muunnelmia, joissa ei ole dataa, muunnelmia, joissa on nimetty data, ja muunnelmia, joissa on nimeämätöntä dataa:

Vakiot :

Valinta tulee antaa etusijalle const, koska usein vakio ei tarvitse tiettyä osoitetta muistissa ja constvoit tehdä optimointeja, kuten Constant Folding .

Muistinhallinta

Kieli toteuttaa turvallisiin samanaikaisuusmalleihin keskittyvän muistinhallintamallin, joka estää virheellisen muistin käytön, mikä on yleinen kriittisten segmentointivikojen lähde muissa ohjelmointikielissä. Tarjoaa alustamattomien ja deinitialisoitujen muuttujien käytön hallinnan; on mahdotonta jakaa yhteisiä tiloja useiden tehtävien kesken; osoittimien käyttöiän staattinen analyysi ja rajojen ulkopuolisten taulukoiden tarkistaminen tarjotaan (automaattisesti ja aina, mutta check in unsafe-lohkot on mahdollista kytkeä pois päältä menetelmällä get_unchecked).

Ns. Move-semantiikka on toteutettu: oletusarvoisesti Rust "siirtää" ( move ) osoittimen kasassa olevaan objektiin uudelle omistajalle toimeksiannon yhteydessä, mikä mitätöi vanhan muuttujan. Tätä ei tapahdu, jos tyyppi toteuttaa Kopioi-ominaisuuden, koska pinon tiedot kopioidaan.

let a = "objekti, jonka tiedot ovat kasassa" . merkkijonoon (); // muuttujalle b siirretty objekti // muuttuja a muuttuu alustamattomaksi olkoon b = a ; // virhe! olkoon c = a ; // pinon objektidata olkoon a = 55 ; // objektin kopio siirretään muuttujaan b olkoon b = a ; // c = 55 olkoon c = a ;

Toinen muistimallin ominaisuus on lainaamisen ( lainaa ) tuki mahdollisuudella muuttaa lainattua objektia ( &mut) ja ilman sitä ( &): Leksisesti ja semanttisesti hyvin samankaltainen kuin linkit, mutta siinä on erityispiirteitä: objektin lainaaminen on samanlaista kuin kohteen semantiikka " Joko monta lukijaa tai yksi kirjoittaja " - esine voidaan lainata joko kerran, jolloin objektia voidaan muuttaa, tai toistuvasti ilman sitä; lainat voidaan lainata uudelleen toiselle lainanottajalle. Toisin kuin tavallinen "joko monta lukijaa tai yksi kirjoittaja" semantiikka, se ei sovellu säikeen synkronoinnin yhteydessä, vaan universaalisti. Lainojen oikeellisuuden tarkistus tapahtuu käännösvaiheessa, eikä se tuota ylimääräistä suoritettavaa koodia ( nollakustannusten abstraktioiden periaate ). Kääntäjä ohjaa myös lainausten eliniän ja itse kohteen suhdetta - lainaukset eivät voi elää pidempään (ulottaa laajuuden ) lainattua objektia. Lainaukset toimivat minkä tahansa tiedon kanssa niiden sijainnista riippumatta (pino, paikallinen tai jaettu kasa, muut erikoispaikat). On tarpeen erottaa toisistaan ​​riippumattomat käsitteet - itse lainauksen muuttuvuus ( let mut b = &c) ja lainatun kohteen muuttuvuus ( let b = &mut c).

Laatikko - Älykäs osoitin, joka omistaa kasassa olevan objektin, tuhoaa objektin ja vapauttaa muistia, kun se menee soveltamisalan ulkopuolelle.

Solu ( Cell , RefCell ) toteuttaa sisällön muuttuvuuden, kun taas solu itse on muuttumaton.

Viittauksilla lasketut ( Rc<T>) ja atomiviitteillä lasketut ( Arc<T>) osoittimet: Viitemääräiset älykkäät osoittimet, jotka tuhoavat kohteen ja vapauttavat muistin, kun laskuri nollataan. Arc toteuttaa lankaturvan viitemäärälle (mutta ei itse objektille). Rc ja Arc ohjaavat muuttumatonta objektia, joten niiden tyypillinen käyttö on sekä Rc<Cell<T>>yksisäikeisessä että monisäikeisessä ohjelmassa Arc<Mutex<T>>.

Raaka-osoittimet muuttumattomat ( *const T) ja muuttuvat ( *mut T): Osoittimet, joilla ei ole turvatakuuta. Niiden käyttöä ei ehdottomasti suositella.

Sidokset ovat oletuksena muuttumattomia, ja jos haluat ilmoittaa muuttujan muuttuvaksi, tarvitset mut - avainsanan .

Esimerkkejä:

olkoon x = 80 ; // sido omistaja x arvoon 80 anna mut y = 50 ; // muuttuva sidos olkoon z = & x ; // muuttumaton viittaus muuttumattomaan sitomiseen olkoon w = & mut y ; // muuttumaton viittaus muuttuvaan sitoutumiseen olkoon r = & mut y ; // virhe: ei voi luoda toista viittausta muuttuvaan sidokseen * w = 90 // y = 90 * z = 30 // virhe: Yritä muokata viittaamalla muuttumattomaan sidokseen olkoon n = Laatikko :: uusi ( 42 ); // pakkaus anna m = Rc :: uusi ( 55 ); // viitelaskuri anna data = Arc :: new ( "test_string" ) // atomilaskuri

Ralph Jung osoitti väitöskirjassaan muodollisesti  kierteiden turvallisuuden ja muistinhallinnan turvallisuuden käyttämällä osiointilogiikkaa RustBelt-mallissaan ja Iris-työkalua ( Coq :iin perustuen ) [30] .

Syntaksi

Kielen syntaksi on samanlainen kuin C ja C++ ; kieli on isot ja pienet kirjaimet erotteleva, koodilohkot on rajoitettu aaltosulkeilla; ohjausrakenteiden vakionimet if , else , while ja for ovat käytössä ; kommentit kirjoitetaan myös C-muodossa; moduulien nimet erotetaan kahdella kaksoispisteellä ( ::). Tunnisteet voivat sisältää latinalaisia ​​kirjaimia, numeroita ja alaviivoja. Merkkijonoliteraalit voivat käyttää mitä tahansa UTF-8-unicode-merkkiä.

Operaattorijoukko Rustissa: aritmeettinen ( * - kertolasku, / - jakolasku, - jakolaskun % loppuosan ottaminen, + - yhteenlasku, - - vähennyslasku ja unaarinen etuliiteoperaattori -luvun etumerkin muuttamiseksi), bittikohtainen ( >>, <<, &, |ja ^), vertailu operaattorit ( ==, !=, <, >, <=, >=), loogiset ( &&ja ||). Rust käyttää binäärioperaattoria heittääkseen tyyppejä as. Implisiittistä tyyppivalua esiintyy hyvin pienessä joukossa tilanteita [31] .

Rust tukee makroja  , säännöllisten lausekkeiden korvauksia, jotka suoritetaan esikäännösvaiheessa, edistyneempiä ja turvallisempia kuin C. Makrot (makrot) ovat käyttäjän määrittämiä, yksinkertaisia ​​syntaksilaajennuksia, jotka voidaan suorittaa komennolla macro_rules!.Makrot määritellään samalla tyylillä kuin kuvionsovitusrakenne. Makroattribuutti on huutomerkki nimen lopussa. Tuettuja ovat myös niin sanotut "proseduurimakrot" [32] , joilla on kyky suorittaa mielivaltaista koodia käännöshetkellä.

Nimensidonta

Avainsana letmäärittelee sidoksen (paikallinen muuttuja).

olkoon x : i32 = 5 ;

Tämä merkintä tarkoittaa: " x on tyyppisidonta i32(32-bittinen kokonaisluku), jonka arvo on viisi".

Pattern matching (match)

Kielessä sovituskonstrukti on yleistetty ja paranneltu versio C-kytkinkonstruktiosta. Lisäksi match on tehokkain, monipuolisin ja, voisi jopa sanoa, keskeinen ohjauselementti paitsi suorituskulun, myös kielen tietorakenteet. Useita malleja voidaan sovittaa yhteen hakulausekkeisiin käyttämällä syntaksia |, joka tarkoittaa loogista tai loogista.

olkoon x = 10 ; ottelu x { 1 | 2 => println! ( "yksi tai kaksi" ), 3 => tulosta! ( "kolme" ) 4 ..= 10 => tulosta! ( "neljästä kymmeneen" ), // Tämä haara toimii, koska 10 kuuluu tälle alueelle. _ => tulosta! ( "kaikki, jotka eivät täytä yllä olevia ehtoja" ), // "_" vastaa mitä tahansa arvoa }

Rakennemuutos

Kun käsittelet yhdistelmätietotyyppejä (rakenne, luettelointi, monikko, taulukko), voit jäsentää ne osiin ("destructurize") mallin sisällä. Rakenteen tuhoaminen:

rakennepiste { _ x : i32 , y : i32 , } anna piste = Piste { x : 0 , y : 0 }; ottelupiste { _ Piste { x : 0 , y } => println! ( "x on nolla, y on yhtä suuri kuin {}" , y ), // koska "x" on nolla, tämä haara toimii. Piste { x , y : 0 } => println! ( "x on yhtä suuri kuin {}, y on nolla" , x ), Piste { x , y } => println! ( "x = {}, y = {}" , x , y ), }

Enumin rakenteen purkaminen:

enum color { Rgb ( i32 , i32 , i32 ), hsv ( i32 , i32 , i32 ), } anna väri = Väri :: Hsv ( 0 , 0 , 100 ); vastaa väriä { Väri :: Rgb ( 0 , 0 , 0 ) | Väri :: Hsv ( 0 , 0 , 0 ) => println! ( "musta" ) Väri :: Rgb ( 255 , 255 , 255 ) | Väri :: Hsv ( 0 , 0 , 100 ) => println! ( "valkoinen" ), // tämä haara toimii. Väri :: Rgb ( punainen , vihreä , sininen ) => { println! ( "punainen: {}, vihreä: {}, sininen: {}" , punainen , vihreä , sininen ) } // toimii kaikille Rgb-arvoille, jotka eivät täytä yllä olevia ehtoja. Väri :: Hsv ( sävy , kylläisyys , kirkkaus ) => println! ( "sävy: {}, kylläisyys: {}, kirkkaus: {}" , sävy , kylläisyys , kirkkaus ), // sama, mutta Hsv. }

Tuple-rakenteen tuhoaminen:

olkoon ( a , b ) = ( 1,2 ) ; _ println! ( "{}" , a ); // 1 println! ( "{}" , b ); // 2

Ehdolliset lausekkeet (jos annetaan)

Syntaksin if letavulla voit yhdistää ifja letvähemmän monisanaiseksi rakenteeksi ja käsitellä sitten vain yhtä mallia vastaavat arvot jättäen huomioimatta kaikki muut. Tämä syntaksi on sopiva, kun vain yksi kuvio on sovitettava.

anna x = Jotkut ( 10 ); jos anna Jotkin ( arvo ) = x { // tässä puretaan x, muuttujan arvo tallentaa arvon 10. // tämä haara suoritetaan, koska "x" tallentaa arvon sisään. println! ( "arvo = {}" , arvo ); } muu { // "else"-operaattori toimii tässä korvikkeena "_" hakulausekkeissa. println! ( "x - tyhjä" ); }

vaarallinen

Lohkoissa ja funktioissa, jotka on merkitty unsafe( unsafe englanniksi   - " unsafe  "), kääntäjä antaa sinun tehdä vain viisi muuta asiaa:

  • lukea ja päivittää muuttuvia staattisia ( static mut) muuttujia;
  • dereference raaka-osoittimet;
  • kutsu vaarallisia ( unsafe) toimintoja;
  • toteuttaa vaarallisia ominaisuuksia;
  • Pääsykentät union.

Sinun unsafeon turvauduttava luotaessa matalan tason abstraktioita, erityisesti kehitettäessä Rust-standardikirjastoa; normaali koodi on suositeltavaa kirjoittaa ilman unsafe.

Objektijärjestelmä

Rustissa objektijärjestelmä perustuu ominaisuuksiin ( traits ) ja rakenteisiin ( structs ). Ominaisuudet määrittelevät menetelmän allekirjoitukset , jotka on toteutettava kullekin ominaisuuden toteuttavalle tyypille (useimmiten rakenteelle). Ominaisuus voi sisältää myös menetelmien oletustoteutuksia. Tietyn rakenteen ominaisuuksien toteutus sekä rakenteen omien menetelmien toteutus merkitään avainsanalla impl. Kielessä on useita kymmeniä sisäänrakennettuja ominaisuuksia, joista useimpia käytetään operaattorin ylikuormitukseen ja joista osalla on erityinen merkitys.

Ruoste tukee piirteen periytymisen analogiaa - ominaisuus voi vaatia toteutustyypin muiden ominaisuuksien toteuttamiseksi. Rustissa ei kuitenkaan ole kielitukea itse tyyppien ja siten klassisen OOP :n perimiselle. Tyyppiperinnön sijasta luokkahierarkian analogia toteutetaan ottamalla käyttöön piirteitä, mukaan lukien esi-isärakenne lapsirakenteessa, tai ottamalla käyttöön luetteloita erilaisten rakenteiden yleistämiseksi [33] .

Kieli tukee yleistyyppejä ( generics ). Toimintojen lisäksi Rust voi myös yleistää monimutkaisia ​​tietotyyppejä, rakenteita ja enumeita . Rust- kääntäjä kokoaa yleiset funktiot erittäin tehokkaasti monomorfoimalla ne (luomalla erillisen kopion jokaisesta yleisfunktiosta suoraan kuhunkin kutsupisteeseen). Siten kopio voidaan mukauttaa tietyntyyppisille argumenteille ja optimoida näin ollen näille tyypeille. Tässä suhteessa Rustin yleiset toiminnot ovat suorituskyvyltään verrattavissa C++-kielimalleihin .

Rinnakkaislaskenta

Kielen aikaisemmat versiot tukivat kevyitä säikeitä, mutta niistä luovuttiin alkuperäisten käyttöjärjestelmän säikeiden sijaan. Suositeltava tapa vaihtaa tietoja säikeiden välillä on kuitenkin lähettää viestejä jaetun muistin sijaan. Korkean suorituskyvyn saavuttamiseksi on mahdollista lähettää tietoja ei kopioimalla, vaan käyttämällä omia osoittimia ( Box<T>). Ne takaavat vain yhden omistajan.

Asynkronisten toimintojen määrittelyä ja kutsumista tuetaan kielen syntaksitasolla: avainsana asyncmäärittelee asynkronisen funktion tai lohkon; normaali kutsu tällaiselle funktiolle palauttaa objektin, jolla on ominaisuus Future – kahvan laiskalle asynkroniselle toiminnolle [34] . Puhelu .awaitantaa yhden asynkronisen toiminnon odottaa, kunnes toinen asynkroninen toiminto on valmis. Samanaikaisesti asynkronisten toimintojen suoritusympäristön toteutus ei sisälly kielen ytimeen eikä vakiokirjastoon, vaan sen tarjoavat kolmannen osapuolen kirjastot [35] .

Muut ominaisuudet

Moduulijärjestelmä: käännösyksikkö ("laatikko") voi koostua useista moduuleista. Moduulien hierarkia vastaa yleensä hakemistojen ja projektitiedostojen hierarkiaa. Moduuli (pääsääntöisesti) on erillinen tiedosto, ja se on myös nimiavaruus ja yksi keino ohjata tunnisteiden näkyvyyttä: moduulin sisällä (ja alimoduuleissa) kaikki tunnisteet ovat "näkyviä", korkeammissa moduuleissa vain julkisia ( pub) funktiot, tyypit, ominaisuudet, vakiot, alimoduulit, rakennekentät.

Automaattinen testaus: kieli mahdollistaa automaattisten yksikkötestien (yksikkötestien) toteuttamisen suoraan testattavassa moduulissa tai alimoduulissa. Testausmenetelmät jätetään huomioimatta kääntämisen aikana ja niitä kutsutaan vain testauksen aikana. Integrointitestit toteutetaan erillisinä laatikoina tests.

Automaattinen dokumentointi: Rustdoc- työkalun avulla voit luoda HTML-dokumentaatiota suoraan lähdekoodista. Koodissa oleva dokumentaatio on merkitty kolminkertaisella kauttaviivalla ( /// Пример документации) tai kaksoisviivalla huutomerkillä, moduulidokumentaatiota varten - ( //! Пример документации модуля). Markdown - merkintäkieltä tuetaan . Koodi, joka on suoritettava (dokumentaatiotestit), voidaan upottaa dokumentaatioon. Tämä mahdollistaa muun muassa dokumentaation asianmukaisuuden tarkistamisen projektiin tehtäessä muutoksia.

Paketinhallintajärjestelmä: rahtipakettien hallinta (joka on myös tärkein työkalu projektien luomiseen, kokoamiseen ja testaamiseen) Cargo-luettelotiedostolla. toml ratkaisee projektiriippuvuudet tuodut laatikot) lataamalla ne crates.io- arkistosta .

Tunnisteita koskevat vaatimukset: kääntäjä hallitsee muuttujien, tyyppien, funktioiden ja niin edelleen nimeämiskäytäntöjen toteutusta ( snake_case , UpperCamelCase , SCREAMING_SNAKE_CASE) sekä käyttämättömiä tunnisteita; käyttämättömät tunnisteet on suositeltavaa aloittaa alaviivalla; rakentajien nimeämiseen, tyyppimuunnosmenetelmiin jne. on tiettyjä ohjeita. [36]

Esimerkkejä

Hei maailma! :

fn main () { println! ( "Hei, maailma!" ); }

99 pulloa olutta :

fn declension_of_noun ( count : u8 ) -> & ' static str { anna jäännös = count % 10 ; // sääntöpoikkeuksia , jos count == 11 || count >= 12 && count <= 14 { palauttaa "pullot" ; } ottelu loppu { 1 => palauta "pullo" , 2 ..= 4 => palauta "pullot" , _ => palauta "pullot" , } } fn main () { anna mut sana = substantiivin_deklinaatio ( 99 ); i in ( 2 ..= 99 ) . rev () { println! ( "{} {} olutta seinällä" , i , sana ); println! ( "{} {} olut!" , i , sana ); println! ( "Ota yksi, anna sen mennä ympäriinsä" ); sana = substantiivin_ilmoitus ( i - 1 ); println! ( "{} {} olutta seinällä! \n " , i - 1 , sana ); } println! ( "1 pullo olutta seinällä" ); println! ( "1 pullo olutta!" ); println! ( "Ota yksi, anna sen mennä ympäriinsä" ); println! ( "Ei enää olutpulloja seinällä! \n " ); println! ( "Ei olutpulloja seinällä!" ); println! ( "Ei olutpulloja!" ); println! ( "Mene kauppaan ja osta lisää" ); println! ( "99 pulloa olutta seinällä!" ); }

Vertailu muihin kieliin

Rustin muistinhallintaperiaatteet eroavat huomattavasti molemmista kielistä, joilla on täysi muistin käyttöoikeus, ja kielistä, joissa roskankerääjä hallitsee täydellistä muistia . Rustin muistimalli on rakennettu siten, että se toisaalta antaa kehittäjälle mahdollisuuden hallita tiedon kohdistamista, ottamalla käyttöön osoitintyyppien erottelun ja ohjaamalla niiden käyttöä käännösvaiheessa. Toisaalta Rustin viitelaskentamekanismilla on taipumus heittää käännösvirheitä tapauksissa, joissa muiden kielten käyttö johtaa ajonaikaisiin virheisiin tai ohjelman kaatumisiin.

Kielen avulla voit ilmoittaa funktiot ja koodilohkot "vaarallisiksi" ( unsafe). Jotkut rajoitukset eivät päde tällaisen vaarallisen koodin puitteissa, joten on mahdollista suorittaa toimintoja alemmalla tasolla, mutta kehittäjän on ymmärrettävä täysin mitä hän tekee.

Muistiinpanot

  1. 1 2 3 4 5 https://prev.rust-lang.org/id-ID/faq.html
  2. 1 2 https://jaxenter.com/mozillas-graydon-hoare-working-on-rust-102672.html
  3. 1 2 https://foundation.rust-lang.org/posts/2021-02-08-hello-world/
  4. Rust 1.65.0:n julkistaminen
  5. Rust Essentials  - ensimmäinen - P. 1.
  6. Liite: Vaikutukset - Rust Reference
  7. 1 2 3 4 5 6 7 8 9 10 11 https://doc.rust-lang.org/reference/influences.html
  8. 1 2 GitHub  (eng.) - 2007.
  9. 1 2 https://github.com/rust-lang/rust/blob/master/COPYRIGHT
  10. 1 2 Levy, Amit. Ruosteen ytimen kirjoittamisen tapaus  : [ eng. ]  / Amit Levy, Bradford Campbell, Branden Ghena … [ et al. ] // 8. Aasian ja Tyynenmeren järjestelmiä käsittelevän työpajan aineisto. - N. Y.  : ACM , 2017. - P. 1-7. — (APSys '17). — ISBN 978-1-4503-5197-3 . - doi : 10.1145/3124680.3124717 .
  11. Usein kysytyt kysymykset // Suunnittelukuviot  (englanniksi)  (downlink) . Rust arkistosivusto . — Usein kysyttyä ruostekielestä. – Monia asioita, joita voit tehdä OO-kielillä, voit tehdä Rustissa, mutta ei kaikkea, eikä aina käyttämällä samaa abstraktiota, johon olet tottunut. […] On olemassa tapoja kääntää olio-käsitteitä, kuten moniperinnöllinen ruoste, mutta koska Rust ei ole olio-suuntautunut, käännöksen tulos voi näyttää olennaisesti erilaiselta kuin sen ulkonäkö OO-kielellä." Haettu 25. toukokuuta 2020. Arkistoitu alkuperäisestä 29. tammikuuta 2018.
  12. Ivo Balbaert. Ruosteen välttämättömyydet. - Packt Publishing, toukokuu 2015. - ISBN 978-1-78528-576-9 .
  13. Rust Core Team. Julkaisemme Rust 1.0  :n . The Rust Programming Language -blogi (15. toukokuuta 2015). Haettu 18. elokuuta 2015. Arkistoitu alkuperäisestä 15. toukokuuta 2015.
  14. Road to Rust 1.0 - The Rust Programming Language -blogi . blog.rust-lang.org. Haettu 11. tammikuuta 2017. Arkistoitu alkuperäisestä 13. tammikuuta 2017.
  15. ↑ Ilmoititko Mozilla Rust Foundationista (Venäjä) riippumattoman organisaation perustamisesta   ? . Haettu 4. lokakuuta 2020. Arkistoitu alkuperäisestä 29. syyskuuta 2020.
  16. Rust  Foundation . Foundation.rust-lang.org . Haettu 18. helmikuuta 2021. Arkistoitu alkuperäisestä 9. helmikuuta 2021.
  17. Daniel Nazer.  Mozilla toivottaa tervetulleeksi Rust  Foundationin . Mozilla-blogi . Haettu 18. helmikuuta 2021. Arkistoitu alkuperäisestä 8. helmikuuta 2021.
  18. Stack Overflow Developer Survey  2019 . pinon ylivuoto . — "Rust on jo neljättä vuotta peräkkäin vastaajidemme rakastetuin ohjelmointikieli." Haettu 4. syyskuuta 2019. Arkistoitu alkuperäisestä 3. syyskuuta 2019.
  19. Stack Overflow Developer Survey 2020 . Haettu 6. kesäkuuta 2020. Arkistoitu alkuperäisestä 4. kesäkuuta 2020.
  20. Stack Overflow Developer Survey  2021 . pinon ylivuoto . Haettu: 29.6.2022.
  21. Stack Overflow Developer Survey  2022 . pinon ylivuoto . Haettu: 3.7.2022.
  22. Usein kysyttyjä kysymyksiä // Miksi kielen nimi on ruoste?  (englanniksi) . - historiallinen versio virallisesta Rust FAQ:sta marraskuussa 2015; tekstin myöhemmissä versioissa kielen nimeämishistoriaa käsittelevä osio on kadonnut. - "Kuten Graydon Hoare, alkuperäinen Rust-kielen kehittäjä, totesi, nimi "Rust" tulee hänen henkilökohtaisesta kiinnostuksestaan ​​sieniä kohtaan ja koska se herätti tunteen, jota hän etsi ohjelmointikielen nimestä." Haettu: 1. joulukuuta 2016.
  23. Projektin  UKK . Rustin virallinen verkkosivusto (2014). Haettu 17. huhtikuuta 2012. Arkistoitu alkuperäisestä 20. heinäkuuta 2020.
  24. Brendan Eich. Future Tense  (englanniksi)  (linkki ei saatavilla) (29. huhtikuuta 2011). "Mozilla Summit 2010 -tapahtumassa julkaisimme Rustin, uuden ohjelmointikielen, jonka motiivina on rinnakkaisten laitteistojen turvallisuus ja samanaikaisuus, "moniytiminen" tulevaisuus, joka on edessämme." Haettu 17. huhtikuuta 2012. Arkistoitu alkuperäisestä 18. syyskuuta 2012.
  25. Graydon Hoare. Rust Progress  (englanniksi)  (linkki ei saatavilla) (2. lokakuuta 2010). Haettu 17. huhtikuuta 2012. Arkistoitu alkuperäisestä 18. syyskuuta 2012.
  26. Graydon Hoare. [rust-dev] stage1/rustc builds  (englanniksi) (20. huhtikuuta 2011). - "Viimeisimmän lokilaajuuden kontekstivirheen korjaamisen jälkeen näyttää siltä, ​​että stage1/rustc-koontiversiot. Vain ujo keskiyöstä :)". Haettu 17. huhtikuuta 2012. Arkistoitu alkuperäisestä 20. heinäkuuta 2011.
  27. Brian Anderson. Rust - kääntäjä 0.1 on päästetty valloilleen  . Mozillan postituslistat (20. tammikuuta 2012). Haettu 22. syyskuuta 2014. Arkistoitu alkuperäisestä 5. syyskuuta 2014.
  28. Brendan Eich. Mozilla ja Samsung tekevät yhteistyötä seuraavan sukupolven verkkoselainmoottorissa  . Virallinen Mozilla- blogi (3. huhtikuuta 2013). Haettu 22. syyskuuta 2014. Arkistoitu alkuperäisestä 23. lokakuuta 2017.
  29. Julkaisemme Rust 1.0:n . Haettu 16. toukokuuta 2015. Arkistoitu alkuperäisestä 15. toukokuuta 2015.
  30. Ralf Jung. Rust-ohjelmointikielen ymmärtäminen ja kehittäminen  : [ fin. ] // PhD, Saarland University. – 2020.
  31. Erityisesti osoittimen viittauksen implisiittistä heittämistä tuetaan; muuttuva viittaus (osoitin) muuttumattomaan referenssiin (osoitin); tietyn tyyppinen objekti objektiin, jolla on kyseisen tyypin toteuttama ominaisuus. Ei ole olemassa epäsuoraa numeroiden tai merkkijonojen johtamista loogiseen arvoon.
  32. Proseduurimakrot – ruosteviite . doc.rust-lang.org . Haettu 19. elokuuta 2020. Arkistoitu alkuperäisestä 7. marraskuuta 2020.
  33. Mihail Pankov. Onko Rustissa OOP? . rustycrate.ru (11. kesäkuuta 2017). Haettu 6. kesäkuuta 2020. Arkistoitu alkuperäisestä 6. kesäkuuta 2020.
  34. Niko Matsakis. Async-wait vakaalla Rustilla!  (englanniksi) (7. marraskuuta 2019). Haettu 6. kesäkuuta 2020. Arkistoitu alkuperäisestä 3. kesäkuuta 2020.
  35. tokio::runtime  ( 13. toukokuuta 2020). Haettu 6. kesäkuuta 2020. Arkistoitu alkuperäisestä 6. kesäkuuta 2020.
  36. Nimeäminen  (englanniksi)  (pääsemätön linkki) . Rust API -ohjeet Haettu 16. lokakuuta 2018. Arkistoitu alkuperäisestä 16. syyskuuta 2018.

Kirjallisuus

  • Blandy J., Orendorf J. Ohjelmointi ruosteessa = Programming Rust. - DMK Press , 2018. - 550 s. - ISBN 978-5-97060-236-2 .
    • Alkuperäinen: Jim Blandy, Jason Orendorff. Ohjelmointi Rust . - O'Reilly Media, maaliskuu 2016. - ISBN 978-1-4919-2721-2 .

Linkit