Ohjelmistokehitys

Mikä on Rust? Muistiturvallisten kielten nousu

Kerromme, miten muistiturvallisuudella haavoittuvuuksia vähentävä Rust toimii ja miksi se on levinnyt nopeasti järjestelmäohjelmistoihin.

Aurora YazılımToimitustiimi 6 min lukuaika
Mikä on Rust? Muistiturvallisten kielten nousu
Mikä on Rust?

Rust on avoimen lähdekoodin järjestelmäohjelmointikieli, joka toimii yhtä nopeasti kuin C ja C++, mutta takaa muistiturvallisuuden jo käännösvaiheessa. Kysymyksen ”mikä on Rust” ydin on omistajuusmalli: ilman roskienkeruuta se estää muistin ylivuodon ja vapautetun muistin käytön kaltaiset virheet ennen ohjelman ajoa. Se yleistyy vähitellen käyttöjärjestelmissä, selaimissa ja palvelinohjelmistoissa.

Mikä on Rust-ohjelmointikieli?

Rust-ohjelmointikieli syntyi Mozillan sisällä alkaneesta projektista, ja sen ensimmäinen vakaa versio julkaistiin vuonna 2015. Nykyään sitä kehittää laaja yhteisö itsenäisen Rust Foundationin alaisuudessa. Viralliset dokumentit ja asennusohjeet löytyvät sivulta rust-lang.org.

Kielen tavoite on kunnianhimoinen: yhdistää matalan tason kielten nopeus ja hallinta korkean tason kielten turvallisuuteen. Perinteisesti näiden kahden ominaisuuden välillä piti valita; Rust pyrkii tarjoamaan molemmat.

Rustia käytetään laajalla alueella komentorivityökaluista verkkopalveluihin, sulautetuista laitteista selaimessa toimiviin WebAssembly-moduuleihin. Se erottuu erityisesti paikoissa, joissa sekä turvallisuus että suorituskyky ovat kriittisiä.

Miksi muistiturvallisuus on niin tärkeää?

Kielissä kuten C ja C++ muistinhallinta on pitkälti kehittäjän vastuulla. Taulukon rajan ulkopuolelle kirjoittaminen, vapautetun muistin uudelleenkäyttö tai saman muistin vapauttaminen kahdesti voi johtaa ohjelman kaatumiseen tai siihen, että hyökkääjä pääsee suorittamaan koodia.

Tämä ongelma ei ole teoreettinen. Microsoft ja Googlen Chromium-tiimi ovat kertoneet julkisesti, että noin 70 prosenttia heidän tuotteidensa vakavista tietoturva-aukoista johtui muistiturvallisuudesta. Siksi monet julkiset toimijat ja suuret teknologiayritykset suosittelevat muistiturvallisten kielten valitsemista uusiin projekteihin.

Kielet kuten Java, C#, Go ja Python ratkaisevat ongelman suurelta osin roskienkerääjällä (garbage collector). Hintana on ajonaikainen lisäkuorma ja ajoittaiset ennalta arvaamattomat tauot. Rust tarjoaa saman turvallisuuden ilman roskienkerääjää käännösaikana.

Miten omistajuus ja lainaus toimivat?

Rustin turvallisuus perustuu kolmeen perussääntöön. Vaikka ne tuntuvat aluksi vierailta, kun ne on sisäistetty, ne antavat sinun napata monta virhettä ennen koodin ajamista.

rustEsimerkki omistajuudesta ja lainauksesta
fn uzunluk(metin: &String) -> usize {
    metin.len()
}

fn main() {
    let selam = String::from("Merhaba");
    let n = uzunluk(&selam); // lainattu, omistajuus pysyy meillä
    println!("{} karakter: {}", n, selam);

    let tasindi = selam; // omistajuus siirtyi
    // println!("{}", selam); // käännösvirhe: selam ei ole enää voimassa
    println!("{}", tasindi);
}

Omistajuus (ownership)

Jokaisella arvolla on yksi omistaja. Kun omistaja poistuu näkyvyysalueelta, muisti vapautetaan automaattisesti. Kun arvo siirretään toiselle muuttujalle, omistajuus siirtyy mukana; vanhaa muuttujaa ei voi enää käyttää.

Lainaus (borrowing)

Arvon käyttämiseksi luovuttamatta omistajuutta otetaan viittaus. Samaan aikaan voi olla joko useita vain luku -viittauksia tai yksi muokattava viittaus. Tämä sääntö estää käännösaikana datakilpailuiksi (data race) kutsutut samanaikaisuusvirheet.

Elinajat (lifetimes)

Kääntäjä varmistaa, että viittauksen osoittama data elää viittausta pidempään. Näin roikkuvan osoittimen (dangling pointer) virhetyyppi poistuu.

Rustin ja C++:n ero

Rustia ja C++:aa käytetään samankaltaisilla alueilla, ja niiden suorituskyky on yleensä samalla tasolla. Todellinen ero on siinä, kenen vastuulla turvallisuus on.

KriteeriC++Rust
MuistiturvallisuusRiippuu kehittäjän tarkkaavaisuudestaKääntäjä valvoo
RoskienkerääjäEi yhtäänEi yhtään
SuorituskykyHyvin korkeaHyvin korkea
SamanaikaisuusvirheetVoivat ilmetä ajon aikanaDatakilpailut estetään käännöksessä
Pakettien hallintaUseita työkalujaVirallinen työkalu: Cargo
OppimiskäyräPitkä ja hajanainenAluksi jyrkkä, sitten johdonmukainen
Ekosysteemin ikäKymmeniä vuosiaNuorempi, kasvaa nopeasti

Missä Rustia käytetään?

Rust-koodin ajamisesta selaimessa kerroimme kirjoituksessa mikä on WebAssembly ja siitä, miksi pieni muistinkulutus ja nopea käynnistys ovat tärkeitä, kirjoituksessa mikä on serverless.

  • Käyttöjärjestelmät: Linuxin ydin on alkanut hyväksyä Rustilla kirjoitettuja ajureita; myös joissakin Windowsin osissa käytetään Rustia.
  • Selaimet: monet Firefoxin osat on kirjoitettu Rustilla.
  • Verkko- ja palvelinohjelmistot: paljon liikennettä käsittelevät palvelut, välityspalvelimet ja CDN-infrastruktuurit.
  • Komentorivityökalut: nopeat haku-, tiedosto- ja paketinhallintatyökalut.
  • WebAssembly: selaimessa lähes natiivinopeudella toimivat moduulit.
  • Sulautetut järjestelmät: turvallinen ohjelmisto rajallisten resurssien laitteissa.
  • Pilvi ja palvelimeton suoritus: funktiot, jotka vaativat nopeaa käynnistysaikaa ja vähäistä muistinkäyttöä.

Rustin asennus ja ensimmäinen projekti

Rustin virallinen asennustyökalu on rustup; se asentaa kääntäjän, Cargo-paketinhallinnan ja vakiokirjaston yhdessä sekä seuraa ajantasaista vakaata versiota.

bashTarkistus ja ensimmäinen projekti
rustc --version
cargo --version
cargo new merhaba
cd merhaba
cargo run

macOS ja Linux

Aja päätteessä alla oleva komento ja seuraa ohjeita. Asennuksen jälkeen sulje pääte ja avaa se uudelleen.

bash
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

Windows

Lataa ja aja rustup-init.exe sivuston rust-lang.org asennussivulta. Asennus pyytää tarvittaessa asentamaan Visual Studio C++ -käännöstyökalut; ilman niitä linkitysvaihe (linking) epäonnistuu.

Pitäisikö Rust opetella?

Rustin eniten puhuttu haaste on oppimiskäyrä. Kääntäjä noudattaa tiukkoja sääntöjä, ja ensimmäisinä viikkoina törmäät usein virheilmoituksiin. Hyvä uutinen on, että nämä ilmoitukset ovat selittäviä ja ehdottavat usein ratkaisunkin suoraan.

Jos haluat työskennellä järjestelmäohjelmoinnin, suorituskykykriittisten palvelujen, sulautettujen ohjelmistojen tai tietoturvan parissa, Rust on vahva investointi. Jos taas haluat kehittää verkkosivustoja tai yrityssovelluksia, aloittaminen kielillä kuten JavaScript, PHP tai Python tuottaa tuloksia nopeammin; Rustin voit lisätä myöhemmin suorituskykyä vaativiin osiin.

Oppiessasi älä taistele kääntäjää vastaan vaan pidä sitä opettajana. Jokainen virheilmoitus näyttää etukäteen ongelman, johon voisit törmätä myöhemmin tuotannossa. Yhteisön foorumit ja viralliset dokumentit ovat myös hyvin avuliaita aloittelijoille.

  • Virallinen kirja: The Rust Programming Language, ilmainen ja verkossa.
  • Rust by Example: lyhyitä, ajettavia esimerkkejä.
  • Kirjoita pieni CLI-työkalu: tiedostoa lukeva, tekstiä käsittelevä yksinkertainen ohjelma on paras harjoitus.

Muistiturvallisten kielten tulevaisuus

Turvalliset ohjelmointikielet nähdään nykyään paitsi kehittäjän valintana myös osana tietoturvapolitiikkaa. Muistiturvallisen kielen valinta uusiin kriittisiin osiin estää suuren osan tulevaisuudessa ilmenevistä haavoittuvuuksista jo alkuunsa.

Tämä ei tarkoita, että kaikki C- ja C++-koodi kirjoitettaisiin uudelleen. Realistisempi kuva on, että uudet osat kirjoitetaan turvallisilla kielillä ja ne toimivat yhdessä nykyisten järjestelmien kanssa. Se, että Rust voi helposti kytkeytyä C:hen, tekee siirtymän mahdolliseksi.

Yritysten kannalta viesti on tämä: tärkeämpää kuin se, millä kielellä käyttämäsi ohjelmisto on kirjoitettu, on se, miten turvallisuus on sijoitettu kehitysprosessiin. Me Aurora Yazılımilla valitsemme kielen tarpeen mukaan toimialakohtaisissa ohjelmistoratkaisuissa ja verkkokauppa-alustan projekteissa ja suunnittelemme turvallisuuden ja suorituskyvyn alusta alkaen. Sen, miten nopeutta mitataan ja parannetaan verkossa, kerroimme sivullamme nopeus- ja suorituskykyoptimointi.

Usein kysytyt kysymykset

01Käytetäänkö Rustia verkkokehityksessä?

Kyllä, palvelinpuolella on Rustilla kirjoitettuja verkkokehyksiä ja API-palveluja. Ekosysteemi ei kuitenkaan ole yhtä laaja kuin JavaScriptin, PHP:n tai Pythonin. Rust valitaan yleensä palveluihin, jotka vaativat korkeaa suorituskykyä, tai WebAssembly-moduuleihin.

02Korvaako Rust C++:n?

Lyhyellä aikavälillä ei; C++:lla on kirjoitettu valtava koodikanta ja kieli kehittyy edelleen. Uusissa projekteissa, erityisesti turvallisuuskriittisillä aloilla, Rust kuitenkin valitaan yhä useammin.

03Mitä unsafe tarkoittaa Rustissa?

Unsafe on avainsana, joka poistaa tietyn koodilohkon osalta käytöstä osan kääntäjän tarkistuksista. Sitä tarvitaan esimerkiksi laitteistoon pääsyssä tai C-kirjastoihin yhdistämisessä. Hyvin kirjoitetuissa projekteissa nämä lohkot pidetään pieninä ja tarkastetaan huolellisesti.

Rust yhdistää nopeuden ja turvallisuuden ja luo uuden standardin järjestelmäohjelmistoihin; se estää suuren osan muistiperäisistä haavoittuvuuksista jo ennen koodin ajamista. Jos haluat ohjelmiston, jossa turvallisuus ja suorituskyky on huomioitu alusta asti, tutustu ohjelmistoratkaisuihimme, katso verkkosivujen suunnittelupalveluamme verkkoprojektiasi varten tai ota meihin yhteyttä.