Hvorfor bruke Rust?

Eivind Bergem publisert
6 min, 1161 ord

Kategorier: Rust

Rust er et relativt nytt programmeringsspråk som har en unik tilnærming til minnehåndtering. I C må programmereren selv passe å allokere og frigjøre minne, men i de fleste andre programmeringsspråk håndteres allokering og frigjøring av minne i bakgrunnen av en søppelhåndteringsprosedyre. Begge disse tilnærmingene har sine svakheter.

Denne artikkelen er rettet mot programmerere. Om du er litt mindre teknisk anlagt har vi også en artikkel om Rust for leder.

Med manuell minnehåndtering er det lett å gjøre feil. Automatisk søppelhåndtering krever at hele programmet stoppes mens søppelhåndteringen foregår.

Eierskap i Rust er et sett med regler som bestemmer hvordan Rust håndterer minne. Hvis noen av disse reglene brytes, vil ikke programmet kompilere. Fordi eierskap tas hånd om under kompilering, har det ikke noen innvirkning på ytelsen til programmet.

Eierskapsregler

  • Hver verdi i Rust har en variabel som eier.
  • Det kan kun være én eier av gangen.
  • Når eieren går ut av skop, frigjøres verdien.

En verdi kan også lånes ut ved å lage en referanse. I Rust kan en verdi enten ha én muterbar referanse eller mange ikke-muterbare refereanser, men vi kan ikke ha muterbare og ikke-muterbare refereanser på samme tid.

Disse reglene gjør at det er vanskeligere å kompilere et program i Rust uten feilmeldinger, men resulterer i kode som i stor grad fungerer første gang du kjører den.

Null

Null-pekere ble innført i ALGOL W av Tony Hoare i 1965 og han ha referert til det som hans "billion-dollar mistake". Problemet med Null-pekere er at det er ingenting som skiller vanlige pekere og Null-pekere, og det er dermed opp til programmereren å sjekke alle pekere. Én manglenede sjekk, og resultatet kan bli at programmet kræsjer.

Rust har ikke Null-pekere, men har en generisk type kalt Option. Denne kan være Some(T) eller None, hvor T representerer den underliggende typen. For å nå den indre verdien er man nødt til å sjekke om det er Some eller None først. Rust kompilatoren sørger for at det ikke er mulig å dereferere en Null-peker.

Minnefeil og sikkerhet

En veldig stor andel av feil i programmer skyldes minnefeil. Microsoft anslår at 70% av alle bugs i programvare hos skyldes minnefeil, og Mozilla har beregnet at av de 69 alvorlige sikkerhetshullene i komponentet som håndterer CSS i Firefox ville 51 av disse ikke vært mulige om de hadde brukt Rust. Ved å begrense muligheten til å innføre minnefeil vil man ha færre bugs, færre sikkerhetshull og man kan bruke mer tid på utvikling av ny funksjonalitet og mindre tid på feilsøking.

Ytelse

En av kjernekomponentene i Discord – som ble brukt for å holde styr på hvilke meldinger hver bruker har lest – levde ikke opp til Discords krav til ytelse. Ved nærmere inspeksjon ble det klart at tjenestene led av en skarp økning i latency med to minutters mellomrom. Tjenesten var skrevet i Go, og ved å ta en titt på Go's kildekode ble det klart at Go sin søppelhåndterer kjører med 2 minutters mellomrom. Etter å ha prøvd forgjeves å optmisere Go-koden, bestemte de seg for å skrive om tjenesten i Rust.

Etter omskrivingen til Rust kjørte de igjen samme benchmark, og til tross for at de ikke hadde gjort noen som helst optimisering av Rust-koden var gjennomsnittelig latency like bra som den skrevet i Go og spikene i latency var helt borte. Ved å optmisere koden yterligere gikk gjennomsnittelig responstid fra millisekunder til mikrosekunder.

Oppsummering

  • Rust hjelper deg å skrive programmer uten minnefeil.
  • Rust gir deg god ytelse, men uten alle fallgruvene i C og C++.
  • Fordi Rust gjør det vanskelig å skrive dårlig kode, kan du lage komplekse programmer uten å være redd for å gjøre noe feil.