Rust-opetusohjelma: Muistin turvallisuus ja samanaikaisuus

Viimeisin päivitys: 04/12/2025
Kirjoittaja: Isaac
  • Ruoste varmistaa muistin turvallisuuden käännöksen yhteydessä omistajuuden, lainaamisen ja eliniän avulla ilman roskienkeruuta.
  • Tyyppijärjestelmä ja aliasointisäännöt mahdollistavat samanaikaisuuden ilman datakilpailuja käyttämällä mutexeja, kanavia ja älykkäitä osoittimia.
  • Cargo, crates.io ja aktiivinen ekosysteemi yksinkertaistavat riippuvuuksien hallintaa, kääntämistä, testausta ja käyttöönottoa.
  • Rakenteiden, luetteloiden, optioiden ja tulosten ymmärtäminen on avain virheiden käsittelyyn ja turvallisen datan mallintamiseen rinnakkaisissa sovelluksissa.

C-ohjelmointikieli vs. Rust: edut ja haitat

Ruosteesta on tullut yksi niistä kielistä, jotka Jokainen järjestelmäkehittäjä kuulee sen yhä uudelleen ja uudelleen.Se on yhtä nopea kuin C ja C++, mutta siinä on lähes pakkomielteinen keskittyminen muistin turvallisuuteen ja hyvin toteutettuun samanaikaisuuteen. Tämä ei ole pelkkää tyhjää markkinointia: sen suunnittelussa keskitytään kääntäjän havaitsemaan virheitä käännösaikana – virheitä, joita muissa kielissä näkee vain, kun järjestelmä on jo tuotannossa... tai kun se kaatuu.

Jos olet kiinnostunut ymmärtämään Kuinka Rust saavuttaa turvallisen muistin ilman roskienkeruuta ja samanaikaisuuden ilman pelkoa datan suorituksistaTämä tutoriaali on sinua varten. Käymme läpi kaiken kielen ja sen ekosysteemin perusteista keskeisiin käsitteisiin, kuten omistajuuteen, lainaamiseen, yhdistelmätyyppeihin ja työkaluihin, kuten Cargo, ja tarkastelemme jopa atomityyppejä ja lukitusta helpommin lähestyttävästä näkökulmasta niille, jotka ovat uusia rinnakkaiskielessä, keskittyen kaikki turvallisuuteen ja suorituskykyyn.

Rust-opetusohjelma: Suorituskyky, muistin turvallisuus ja samanaikaisuus

Rust on ohjelmointikieli ohjelmointi yleiskäyttöinen ja monialaisesti toimiva, suunniteltu matalan tason järjestelmäohjelmointiin sekä korkean tason projekteihin, mistä käyttöjärjestelmätPelimoottoreista ja selaimista tehokkaisiin verkkopalveluihin se sai alkunsa Mozillasta tavoitteenaan parantaa ohjelmistojen turvallisuutta, erityisesti herkissä komponenteissa, kuten selainmoottorissa.

Sen määrittelevä ominaisuus on, että takaa muistin turvallisuuden käännösaikana ilman roskienkerääjää. Sen sijaan Rust käyttää omistajuusjärjestelmää ja lainaustarkistinta, joka seuraa kunkin arvon ja sen viitteiden elinkaarta. Tämä välttää klassisia ongelmia, kuten roikkuvia osoittimia, puskurin ylivuotoja tai muistivuotoja, ilman automaattista viitteiden laskentaa tai roskienkeräystä.

Lisäksi Rust on suunniteltu helpottamaan turvallista läsnäoloaSen tyyppi- ja omistusmalli estää datakilpailut säikeiden välillä, ainakin pysyen samalla turvallisessa Rust-koodissa. Tämä tarkoittaa, että monet vaaralliset tilanteet havaitaan käännösaikana, ennen kuin yhtäkään riviä on suoritettu.

Kaikista näistä syistä suuret yritykset, kuten Dropbox, Microsoft, Amazon tai Google He ovat ottaneet Rustin käyttöön kriittisissä osissa infrastruktuuriaan. Eikä ole sattumaa, että se on ollut Stack Overflow -kyselyiden kärjessä vuosia yhtenä kehittäjien "rakkaimmista" kielistä: se yhdistää C++-tyylisen suorituskyvyn moderniin työkalupakkiin (Cargo, crates.io) ja erittäin aktiiviseen yhteisöön, niin kutsuttuun Rustaceans-yhteisöön.

Peruskäsitteet: ohjelmointikieli, tyypit ja muisti

Ennen kuin syvennymme muistin turvallisuuden ja samanaikaisuuden yksityiskohtiin, on syytä selventää joitakin yleisiä käsitteitä, jotka esiintyvät kaikkialla. aika Kun työskentelet Rustin kanssa, varsinkin jos olet kotoisin muista kielistä tai vasta aloittelet ohjelmointia.

Ohjelmointikieli on loppujen lopuksi ns. joukko sääntöjä ja rakenteita, joiden avulla voit kuvata algoritmeja ja muuntaa ne suoritettaviksi ohjelmiksi. Rust kääntyy natiiviksi konekieliseksi koodiksi kääntäjäänsä käyttäen rustcSiksi suorituskyky on yleensä C:n ja C++:n tasolla.

Muistinhallinta on prosessi, jolla ohjelma varaa ja vapauttaa muistilohkoja suorituksen aikanaTämän alueen virheet ovat usein kohtalokkaita: muistivuodot (käyttämättömän muistin vapauttamatta jättäminen), tietojen korruptoituminen rajojen ulkopuolisesta kirjoittamisesta tai muistin käyttämisestä sen vapauttamisen jälkeen. Rust ratkaisee tämän erittäin vahvalla tyyppijärjestelmällä ja muodollisilla säännöillä omistajuudelle, lainaamiselle ja elinkaareille.

Ruoste sisältää myös termejä, kuten älykkäät tyypit ja osoittimetTyyppi kuvaa, millaista dataa muuttuja tallentaa (kokonaislukuja, liukulukuja, merkkijonoja, rakenteita jne.) ja miten sitä voidaan käsitellä. Älykkäät osoittimet (esimerkiksi Box, Rc y Arc) ovat rakenteita, jotka kapseloivat muistiosoitteita ja lisäävät logiikkaa resurssien turvalliseen hallintaan, kuten jaettujen viitteiden laskemiseen tai arvojen siirtämiseen kekoon.

Kilpailun alalla käsitteitä, kuten kilpailuolosuhteet, mutexit ja kanavat Niistä tulee välttämättömiä: kilpailutilanne syntyy, kun useat säikeet käyttävät ja muokkaavat jaettua resurssia samanaikaisesti ilman asianmukaista koordinointia; mutex (keskinäinen poissulkeminen) varmistaa, että vain yksi säie saapuu kriittiseen osioon kerrallaan; ja kanavat mahdollistavat viestien lähettämisen säikeiden välillä ilman muistin suoraa jakamista.

Miksi oppia Rustia: Muistin turvallisuus ja peloton samanaikaisuus

Ruoste on ansainnut maineensa, koska se tarjoaa Kolme erittäin arvokasta pilaria nykyaikaiselle ohjelmoinnilleSuorituskyky, tietoturva ja nykyiset työkalut. Katsotaanpa, miksi nämä seikat ovat niin tärkeitä.

Suorituskyvyn osalta Rust kääntyy suoraan natiiveiksi binääritiedostoiksi ilman virtuaalikoneen tai tulkin tarvetta. Nollakustannusabstraktiomalli pyrkii varmistamaan, että korkean tason abstraktiot eivät lisää ylimääräistä työtä ajon aikana. Siksi se on ihanteellinen järjestelmäkehitykseen. peli, selainkomponentteja tai matalan latenssin mikropalveluita.

Muistin suojaus perustuu sen omistus- ja lainajärjestelmäRoskienkerääjää ei ole, mutta kääntäjä tietää tarkalleen, kuka omistaa kunkin resurssin, milloin sitä ei enää tarvita ja milloin se voidaan vapauttaa. Tämä estää vuodot, roikkuvat osoittimet ja monet virheet, jotka ovat perinteisesti tehneet C- ja C++-ohjelmoinnista niin vaarallista.

Kilpailun alalla Rust pyrkii siihen, mitä yleensä ns. "Samanaikaisuus ilman pelkoa"Tyyppijärjestelmä itsessään estää datajuurten olemassaolon suojatussa koodissa. Jos haluat jakaa muokattavaa dataa säikeiden välillä, sinun on käytettävä sopivia primitiivityyppejä, kuten Mutex, RwLock o Arc, ja kääntäjä varmistaa, että aliasointi- ja muokattavuussääntöjä noudatetaan.

  Kuinka desinfioida Windows Malwarebytesilla askel askeleelta

Kehityskokemusta parannetaan nykyaikaisilla työkaluilla, kuten lastiSiinä on integroitu paketinhallinta ja koonti-infrastruktuuri sekä laaja kirjastojen (laatikoiden) ekosysteemi, joka kattaa kaiken asynkronisesta verkosta (Tokyo) web-kehyksiin (Actix, Rocket, Axum). Kaikkea tätä tukee avoin, tuottelias ja melko kärsivällinen yhteisö, erityisesti aloittelijoille.

Asennus ja tärkeimmät työkalut: rustup, rustc ja cargo

Ensimmäisten Rust-ohjelmien kirjoittaminen ja ajaminen aloitetaan yleensä asentamalla virallinen työkaluketju käyttämällä ruostuminen (katso Täydellinen johdanto Rustiin), yksinkertainen asennusohjelma ja versionhallintaohjelma, joka toimii kaikissa tärkeimmissä käyttöjärjestelmissä.

kanssa ruostuminen Voit asentaa, päivittää ja vaihtaa Rustin eri versioiden (vakaa, beta, öinen) välillä rikkomatta mitään. Siirry vain Rustin viralliselle työkalusivulle ja noudata järjestelmäsi ohjeita. Asennuksen jälkeen kääntäjä on käytettävissä. rustc, projektipäällikkö cargo ja omistaa rustup sinun terminaali.

kääntäjä rustc Se muuntaa lähdekoodisi suoritettaviksi binääreiksi tai kirjastoiksi. Vaikka voisitkin kutsua sitä suoraan komennolla komennot kuten rustc main.rsKäytännössä työskentelet lähes aina Cargon kautta, joka käsittelee puhelut kohteeseen rustc oikeilla vaihtoehdoilla.

Työnkulun keskeinen työkalu on lastiMuutamalla komennolla voit luoda uusia projekteja, hallita riippuvuuksia, kääntää, suorittaa, testata ja julkaista paketteja crates.io:ssa. Joitakin yleisesti käytettyjä peruskomentoja ovat: cargo new, cargo build, cargo run, cargo test y cargo check, joka tarkistaa koodin tuottamatta lopullista suoritettavaa tiedostoa, mikä on ihanteellinen virheiden nopeaan havaitsemiseen.

Jos haluat säätää asentamatta mitään, Ruosteen leikkikenttä (virallinen online-suorittaja) ja alustat, kuten Replit, mahdollistavat pienten koodipätkien kirjoittamisen ja suorittamisen selaimesta, mikä sopii täydellisesti muistin ja samanaikaisuusesimerkkien kokeilemiseen ilman, että koko ympäristöä tarvitsee asentaa.

Ensimmäinen ohjelmasi: Hei, Rust ja perusflow

Klassinen tapa aloittaa keskustelu millä tahansa kielellä on kuuluisalla "Hei maailma". Rustissa tiedosto main.rs Minimi voisi sisältää jotain niin yksinkertaista kuin funktion main joka tulostaa merkkijonon näytölle.

Avainsana fn osoittaa, että määrittelemme funktion, ja main Tämä on ohjelman aloituskohta. Funktion koodilohko tulee aaltosulkeiden sisään. Kirjoittaaksesi konsoliin, käytä makro println!, joka hyväksyy merkkijonoliteraalin (tai kirjanmerkeillä varustetun mallin) ja lähettää sen standarditulosteeseen, joka päättyy rivinvaihtomerkkiin.

Jos käännät suoraan komennolla rustc main.rs, saat suoritettavan binääritiedoston (esimerkiksi main o main.exe (järjestelmästä riippuen). Kun suoritat sen, näet viestin terminaalissa. Mutta idioomaattinen tapa työskennellä Rustin kanssa on antaa Cargon ottaa johtoasema projektissa.

kanssa cargo new nombre_proyecto Kansiorakenne luodaan automaattisesti src/main.rs jo valmiiksi valmiina "Hei maailma" -viestillä ja tiedostolla Cargo.toml joka sisältää metadataa ja tulevia riippuvuuksia. Sieltä eteenpäin cargo run käännä ja suorita binääritiedostoja se kääntää uudelleen vain, kun se havaitsee muutoksia.

Tämä työskentelytapa ei ole ainoastaan ​​kätevä, vaan se myös totuttaa sinut käyttämään Rustin vakioekosysteemiä alusta alkaen, mikä on erittäin hyödyllistä, kun alat lisätä laatikoita samanaikaisuutta, verkostoitumista, testausta tai mitä tahansa tarvitset.

// Määrittelemme pääfunktion: program entry point fn main() { // Käytämme println!-makroa tulostaaksemme tekstiä konsoliin println!("Hello, world!"); }

Muuttujat, mutability ja perustietotyypit

Rustissa muuttujat deklaroidaan avainsanalla letja oletuksena ovat muuttumattomiaToisin sanoen, kun olet kerran antanut niille arvon, et voi muokata sitä, ellet nimenomaisesti määrää sitä muutettavaksi mut.

Oletusarvoinen muuttumattomuus auttaa välttämään hienovaraisia ​​logiikkavirheitä, erityisesti rinnakkaisissa ohjelmissa, joissa useat säikeet saattavat haluta muuttaa samaa arvoa. Jos sinun on muutettava sitä, kirjoitat jotain seuraavanlaista: let mut contador = 0;Sieltä voit määrittää uudet arvot uudelleen contador.

Ruoste mahdollistaa myös ns. varjostusVoit deklaroida uuden muuttujan samalla nimellä samassa näkyvyysalueessa ja piilottaa edellisen. Tämä ei ole sama asia kuin muuntaminen, koska luot uuden arvon (joka voi olla jopa eri tyyppiä). Voit esimerkiksi muuntaa merkkijonon kokonaisluvuksi käyttäen samaa nimeä, kunhan se on uusi deklarointi, jossa on let.

Rustin tyyppijärjestelmä on staattinen, mikä tarkoittaa, että Kunkin muuttujan tyyppi tiedetään käännöksen yhteydessäTyypin päättely on kuitenkin varsin tehokasta: jos kirjoitat let x = 5;Kääntäjä olettaa, että kyseessä on i32 Ellet toisin määrää. Voit lisätä muistiinpanoja, kuten let x: i64 = 5; kun haluat olla selkeä.

Käytettävissä olevista skalaarityypeistä ovat etumerkityt ja etumerkittömät kokonaisluvut (i8, u8, i32, jne.), kelluvat (f32, f64), Boolen operaattorit (bool) ja Unicode-merkit (char). Nämä yksinkertaiset tyypit ovat yleensä halpoja kopioida ja monet toteuttavat ominaisuuden CopyTämä tarkoittaa, että kun määrität ne tai välität ne funktiolle, ne kopioidaan siirtämisen sijaan.

Jousien käyttö Rustissa: &str ja String

Tekstin käsittely Rustissa voi olla aluksi hieman hämmentävää, koska se erottaa selvästi toisistaan ketjun "siivut" ja omat ketjutKaksi keskeistä osaa ovat &str y String.

Un &str on muuttumattoman ketjun siivuNäkymä UTF-8-tavujonosta, joka on tallennettu jonnekin. Tyypillisiä esimerkkejä ovat literaalit, kuten "Hola"jotka ovat tyyppiä &'static str (Ne ovat olemassa koko ohjelman elinkaaren ajan ja ne on upotettu binääritiedostoon.) Viipaleet eivät omista dataa; ne vain osoittavat siihen.

  Tehtäväpalkin perusteellinen mukauttaminen Windows 11:ssä: Täydellinen opas ja edistyneet vinkit

Stringtoisaalta, on oma merkkijono, muokattava ja isännöity keossaSen kokoa voidaan muuttaa, sitä voidaan ketjuttaa, siirtää funktioiden välillä siirtämällä sen ominaisuutta jne. Sitä käytetään usein, kun haluat luoda dynaamista tekstiä tai tallentaa sitä pitkäaikaisesti rakenteisiin.

Monissa tilanteissa vaihdat asetuksia, esimerkiksi luot String::from("hola") siivustatai lainaatko sinä &str mukaan String välittämällä viittauksia funktioille, joiden tarvitsee vain lukea.

Tämä omistetun ja lainatun datan erottelu on avainasemassa muistinhallinnassa ja ulottuu muuhun kieleen: kokoelmat, rakenteet ja luettelot noudattavat samoja periaatteita siitä, kuka omistaa ja kuka vain katsoo.

Funktiot, ohjausvirta ja kommentit

Rustin funktiot määritellään seuraavasti: fn ja mahdollistavat ohjelman järjestämisen uudelleenkäytettäviksi loogisiksi yksiköiksi. Jokainen funktio määrittää sen parametrien tyyppi ja paluuarvojen tyyppi nuolen seuraaminen ->Jos se ei palauta mitään merkityksellistä, oletetaan, että kyseessä on unitaarinen tyyppi. ().

Tärkeä yksityiskohta on, että funktion (tai minkä tahansa lohkon) viimeinen lauseke ilman puolipistettä otetaan implisiittiseksi paluuarvoksi. Voit käyttää return aikaisia ​​palautuksia vartenMutta idiomaattisessa koodissa usein jätetään lopullinen lauseke pois. ;.

Ohjausvirtaa käsitellään klassikoilla if/elsesilmukoita loop, while y forRuosteessa if Se on lauseke, joka palauttaa arvonjoten voit käyttää sitä suoraan letedellyttäen, että haarat palauttavat saman tyypin. Silmukat for Ne iteroivat tyypillisesti alueiden tai kokoelmaiteraattoreiden yli ja ovat suositeltu vaihtoehto manuaalisten indeksien sijaan.

Dokumentoidaksesi koodin ja helpottaaksesi elämää tuleville (myös itsellesi kuukauden kuluttua), voit käyttää rivikommentit // tai lohko /* ... */Lisäksi Rust tarjoaa dokumentaatiokommentteja, joissa on /// joista tulee luotuja dokumentteja, vaikkakin se sopii paremmin suuriin projekteihin.

Omistajuus, lainaaminen ja eliniät: muistin turvallisuuden perusta

Tässä tulemme Rustin muistimallin ytimeen: järjestelmään omistajuus, lainaaminen ja elinkaaretNämä säännöt varmistavat, että viittaukset ovat aina kelvollisia ja että muisti vapautuu turvallisesti ilman kertyvää roskaa.

Omistajuuden perussäännöt on helppo esittää, vaikka niitä voi olla aluksi vaikea sisäistää: Jokaisella arvolla on yksi omistaja.Omistajia voi olla vain yksi kerrallaan, ja kun omistaja poistuu arvoalueelta, arvo tuhoutuu ja sen muisti vapautuu. Tämä pätee esimerkiksi String: sen lohkon valmistuttua, jossa se määriteltiin, se kutsutaan automaattisesti drop mikä vapauttaa kekomuistia.

Kun annat toiselle muuttujalle sopivan arvon tai välität sen arvon mukaan funktiolle, ominaisuus siirtyy. Tämä tarkoittaa, että alkuperäinen muuttuja lakkaa olemasta voimassa siirron jälkeenTämä liikkumisen semantiikka välttää kaksinkertaiset julkaisut, koska ei ole koskaan kahta omistajaa, jotka yrittävät julkaista samaa resurssia.

Jotta useat ohjelman osat voisivat käyttää samaa arvoa ilman omistajuuden muutosta, Rust ottaa käyttöön viittaukset ja lainaamisen. Lainatessasi luot viittauksen &T (muuttumaton) tai &mut T (muutettava) arvoon ilman omistajuuden siirtoa. Lainaa rajoittavat lainantarkastajan säännöt., joka tarkistaa, että viittaukset eivät elä pidempään kuin data, johon ne osoittavat, ja että muokattavat ja jaetut käyttöoikeudet eivät sekoitu vaarallisesti.

Lainan säännöt voidaan tiivistää seuraavasti: voit milloin tahansa joko useita muuttumattomia viittauksia arvoon tai yksittäinen muuttuva viiteMutta ei molempia samanaikaisesti. Tämä poistaa kilpailutilanteen jaetussa muistissa: joko lukijoita on useita tai kirjoittajia on yksittäinen; ei koskaan samanaikaisia ​​lukijoita ja kirjoittajia samalle datalle samaan aikaan.

Yhdistelmätyypit: rakenteet, enumit ja älykkäät osoittimet

Rust tarjoaa useita tapoja ryhmitellä toisiinsa liittyvää dataa rikkaampiin rakenteisiin, alkaen rakenteetRakenteen avulla voit määrittää mukautetun tyypin nimetyillä kentillä, esimerkiksi käyttäjän sähköpostiosoitteella, nimellä, aktiivisuustilalla ja kirjautumislaskurilla.

Rakenteen instanssin luomiseksi täytät kaikki sen kentät ja voit merkitä sen sisältävän muuttujan muutettavaksi, jotta sen arvoja voidaan muokata myöhemmin. Käytettävissä on myös struct update -syntaksi, jonka avulla voit rakentaa uuden instanssin käyttämällä uudelleen joitakin olemassa olevan instanssin kenttiä. ..otro_struct.

Los luettelot Ne ovat toinen olennainen pilari: niiden avulla voit määrittää tyypin, joka voi olla yksi useista mahdollisista muunnelmista, joista jokaisella on omat tiedot tai ei ole niitä. Klassinen esimerkki on IP-osoitteiden luettelo, jossa on yksi muunnos. V4 joka tallentaa neljä oktettia ja toisen V6 joka tallentaa merkkijonon IPv6-merkintämuodossa.

Rustin vakiokirjasto sisältää kaksi erittäin tärkeää enumia: Option<T> y Result<T, E>Ensimmäinen edustaa arvon (jotain tai ei mitään) olemassaoloa tai puuttumista ja sitä käytetään välttämään null-osoittimia; toinen mallintaa operaatioita, jotka voivat palauttaa oikean tuloksen tai virheen, mikä edellyttää, että virheiden käsittely on eksplisiittistä ja turvallista.

Dynaamisen muistin hallintaan ja datan jakamiseen Rustilla on älykkäät osoittimet kuten Box<T>, joka siirtää arvon kekoon ja säilyttää yksilöllisen omistajuuden; Rc<T>, jaettu viitemäärä yksisäikeisille ympäristöille; ja Arc<T>, samanlainen kuin Rc mutta turvallinen useille säikeille. Niiden oikea käyttö on ratkaisevan tärkeää yhdistettäessä dynaamista muistia samanaikaisuuteen.

Rahti ja laatikoiden ekosysteemi

Rahti on liima, joka pitää Rust-ekosysteemin koossa: hallinnoi käännöstä, riippuvuuksia ja projektin elinkaartaJokaisella projektilla on tiedosto Cargo.toml joka toimii manifestina ja ilmoittaa nimen, version, kieliversion ja ulkoiset riippuvuudet.

  Korjattu: Windows 10:n sisäisen PCI-väyläohjaimen virhe

jakso Tämän tiedoston avulla voit listata kolmannen osapuolen laatikot ja niiden versiot. Kun suoritat cargo build o cargo runCargo lataa nämä laatikot automaattisesti crates.io-sivustolta, kääntää ne ja linkittää ne projektiisi. Niin helppoa on lisätä esimerkiksi satunnaislukugeneraattoreita, verkkokehyksiä tai kryptografisia kirjastoja.

Yleisimpiä komentoja ovat mm. cargo new aloittaa binääriprojektit o cargo new --lib kirjastoille; cargo build kääntää virheenkorjaustilassa; cargo build --release optimoidun, tuotantoon suuntautuneen version hankkimiseksi; ja cargo test suorittaa testisarjan.

cargo check Se ansaitsee erityismaininnan: se kääntää koodin välipisteeseen asti luomatta binääritiedostoa, mikä tekee siitä olla erittäin nopea havaitsemaan käännösvirheetSe sopii täydellisesti nopeaan iterointiin, kun lainaustarkistin osoittaa ongelmia ominaisuuksien, viitteiden ja elinaikojen kanssa.

Tämän ekosysteemin ansiosta on yleistä jäsentää projektit pieniksi, hyvin määritellyiksi laatikoiksi, joiden välillä jaetaan koodia ja yhteisön luomia ratkaisuja käytetään uudelleen. Esimerkiksi edistyneeseen samanaikaisuuteen on olemassa laatikoita, kuten Tokio asynkronista ohjelmointia varten tai crossbeam tehokkaita samanaikaisia ​​tietorakenteita varten.

Samanaikaisuus Rustissa: säikeet, mutexit, kanavat ja atomit

Rinnakkaisuus on yksi syy siihen, miksi Rust herättää niin paljon kiinnostusta: se mahdollistaa moniydinprosessoreiden hyödyntämisen. sortumatta tyypillisiin säikeiden ja jaetun muistin virheisiinJos käsittelet näitä aiheita ensimmäistä kertaa, on hyödyllistä erottaa toisistaan ​​useita käsitteitä.

Rinnakkaisuus tarkoittaa useiden päällekkäisten tehtävien suorittamista joko yhdellä tai useammalla ytimellä. Rustissa voit luoda järjestelmäsäikeitä suorittamaan työtä rinnakkain, ja kieli opastaa sinua varmistamaan, että tiedon jakaminen niiden välillä on turvallista. Klassinen virhe on kilpailutilanne, jossa kaksi säiettä käyttää ja muokkaa tietoja samanaikaisesti, ja tulos riippuu suoritusjärjestyksestä – asia, jota on erittäin vaikea korjata.

Jaetun datan käytön koordinoimiseksi Rust luottaa primitiiveihin, kuten mutexjotka takaavat keskinäisen poissulkemisen: vain yksi säie voi kerrallaan tulla kriittiseen osioon. Yhdessä Arc<T> Omistajuuden jakamiseksi säikeiden välillä on mahdollista rakentaa jaettuja tietorakenteita, jotka noudattavat omistajuuden ja lainaamisen sääntöjä.

Toinen yleinen säikeiden välisen viestinnän muoto, jota Rustissa voimakkaasti kannustetaan, on viestien välitys käyttämällä kanavatKanavalla on lähettävä pää ja vastaanottava pää; säikeet välittävät viestejä (arvoja) sen kautta, mikä vähentää muokattavan jaetun muistin käyttöä ja yksinkertaistaa järjestelmän tilan päättelyä.

Kun syvennytään matalan tason samanaikaisuuteen, seuraavat asiat näkyvät: atomityypitAtomimuuttujiin päästään käsiksi operaatioilla, jotka ovat säikeen näkökulmasta jakamattomia. Tämä mahdollistaa jaettujen laskureiden, tilalippujen, lukitsemattomien jonojen ja muiden toimintojen toteuttamisen. Atomimuuttujien hallinta edellyttää muistimallien ja käyttökomentojen ymmärtämistä, joten monet kehittäjät haluavat aloittaa mutexeista ja kanavista ennen kuin syventyvät näihin yksityiskohtiin.

Ensiaskeleet ja resurssit samanaikaisuuden ja atomitason oppimiseen

Jos astut areenalle ilman aiempaa kokemusta, viisain toimintatapa on rakentaa vankan perustan yleisille käsitteille ennen kuin tartut edistyneisiin työkaluihin, kuten Rustin atomityyppeihin. Kirjat, kuten "Programming Rust", tarjoavat asteittaisen johdannon, mutta on normaalia, että atomityyppeihin ja lukkoihin keskittyvät teokset tuntuvat aluksi tiiviiltä.

Helpomman tavan vuoksi on suositeltavaa ensin tutustua Perinteiset säikeet, keskinäinen poissulkeminen ja viestien välittäminen Rustissa. Leiki esimerkeillä std::thread, std::sync::Mutex, std::sync::Arc ja kanavat std::sync::mpsc Se auttaa sinua ymmärtämään, miten kääntäjä ohjaa sinua ja mitä virheitä se välttää.

Samanaikaisesti on erittäin suositeltavaa tarkastella yleisesti rinnakkaisuutta käsitteleviä johdantomateriaaleja, vaikka ne eivät keskittyisikään Rustiin: mitä kilpailuehdot ovat, mitä estäminen tarkoittaa, mitä jaettu muisti tarkoittaa verrattuna viestien välittämiseen ja miten lukkoja käytetään. Kun nuo käsitteet tulevat sinulle luonnollisiksi, atomifysiikka lakkaa olemasta "mustaa magiaa". ja niistä tulee vain yksi työkalu lisää, vain hyvin herkkä sellainen.

Kun palaat Rustin atomeja ja lukkoja käsitteleviin edistyneempiin teksteihin, päättelyn seuraaminen on paljon helpompaa, jos jo ymmärrät, mitä ongelmaa kukin konstruktio yrittää ratkaista: yksinkertaisesta säikeenkestävästä laskurista lukkovapaisiin rakenteisiin, jotka minimoivat kilpailun.

Viime kädessä Rust tarjoaa sekä korkean tason primitiivit että hyvin matalan tason työkalut, ja avainasemassa on aina valita turvallisin abstraktiotaso, joka ratkaisee ongelmasi, turvautumalla atomikoodiin. unsafe vain silloin, kun se todella lisää arvoa ja ymmärrät täysin sen vaikutukset.

Tämä koko tyyppien, omistajuuden, lainaamisen, laatikoiden, työkalujen ja samanaikaisuusprimitiivien ekosysteemi tarjoaa yhdessä kielen, jolla voi kirjoittaa nopea, luotettava ja ylläpidettävä ohjelmistoTämä minimoi monenlaisia ​​virheitä, jotka ovat historiallisesti vaivanneet järjestelmäohjelmointia. Kun harjoittelet pienten projektien, Rustlingsin kaltaisten harjoitusten ja virallisen dokumentaation kanssa, nämä käsitteet muuttuvat näennäisistä tiukoista säännöistä liittolaiseksi, joka varoittaa sinua ennen kuin ongelma saavuttaa tuotantoympäristön.

Johdatus Rust-kieleen esimerkkien kera-0
Aiheeseen liittyvä artikkeli:
Täydellinen johdanto ruosteeseen: Käytännönläheinen aloittelijan opas esimerkkeineen