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] .
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] .
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 ):
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 .
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" ) // atomilaskuriRalph 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] .
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ä.
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".
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 }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 ); // 2Syntaksin 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ä" ); }Lohkoissa ja funktioissa, jotka on merkitty unsafe( unsafe englanniksi - " unsafe "), kääntäjä antaa sinun tehdä vain viisi muuta asiaa:
Sinun unsafeon turvauduttava luotaessa matalan tason abstraktioita, erityisesti kehitettäessä Rust-standardikirjastoa; normaali koodi on suositeltavaa kirjoittaa ilman unsafe.
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 .
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] .
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]
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.
Mozilla- projektit | |
---|---|
Selaimet | |
Muut projektit | |
Ei kehity | |
Infrastruktuuri | |
Komponentit |
|