Derfor velger de Rust: - JavaScript brukte minutter, Rust brukte sekunder

Hvorfor vil plutselig "alle" bruke Rust, og hvordan lærer du deg det? Vi spurte ekspertene.

Julian Ertel (øverst) i Miles og Marcus Dahl i Everyday er begge tilhengere av programmeringsspråket Rust. 📸: PxHere (CC0 Public Domain) / Rust Foundation (CC-BY) / privat / kode24. Bilde av Marcus Dahl: grayscale. / Christoffer Stette
Julian Ertel (øverst) i Miles og Marcus Dahl i Everyday er begge tilhengere av programmeringsspråket Rust. 📸: PxHere (CC0 Public Domain) / Rust Foundation (CC-BY) / privat / kode24. Bilde av Marcus Dahl: grayscale. / Christoffer Stette Vis mer

Ifølge Githubs Octoverse 2022-rapport er Rust ett av programmeringsspråkene som vokser aller mest, og språket foretrekkes i stadig større grad fremfor blant annet C og C++.

I Jetbrains siste gigantundersøkelse var Rust ett av språkene flest utviklere har planer om å ta i bruk.

Så hva er det egentlig som gjør at "alle" nå snakker om Rust, og mange store aktører som Microsoft, Amazon og Google kaster seg over dette forholdsvis nye programmeringsspråket?

Vi spurte et par eksperter som bruker Rust til daglig.

«Skal du lage en enkel nettside så er nok ikke Rust riktig språk.»

Rust kan brukes til nesten alt

Marcus Dahl er seniorutvikler og partner i Everyday, og mener Rust er et veldig allsidig programmeringsspråk som kan brukes i mange forskjellige miljøer med ulike krav.

– Der Rust virkelig skinner er for kritiske systemer og applikasjoner som krever høy ytelse og pålitelighet, men det brukes også til vanlige programmer på datamaskinen din, i operativsystem, nettsider, apper og til og med enkelte spillmotorer, sier Dahl.

Marcus Dahl, seniorutvikler og partner i Everyday. 📸: grayscale. / Christoffer Stette
Marcus Dahl, seniorutvikler og partner i Everyday. 📸: grayscale. / Christoffer Stette Vis mer

Han vil gå så langt som å si at Rust kan brukes til nær sagt hva som helst.

Hvorvidt man skal bruke Rust eller ikke i et bestemt prosjekt bør imidlertid bestemmes av hvor mye Rust-kunnskap som finnes i teamet som skal jobbe på prosjektet, og om sikkerhetskonseptene i Rust (som vi skal komme tilbake til) er viktig i akkurat det prosjektet.

– Skal du lage en enkel nettside så er nok ikke Rust riktig språk, men du kan likevel bruke Rust via WebAssembly til enkelte deler av et webprosjekt hvor ytelsen oppleves som dårlig i vanlig JavaScript, sier Dahl.

Julian Ertel, seniorutvikler i Miles. 📸: Miles
Julian Ertel, seniorutvikler i Miles. 📸: Miles Vis mer

Julian Ertel er seniorutvikler i Miles og mener Rust er intet mindre enn "verdens beste programmeringsspråk." Han er enig med Dahl i at språket kan brukes til det meste.

Selv om Ertel innrømmer at Rust kanskje kan virke unødvendig komplisert for nybegynnere, gjør de strenge reglene i språket at utviklingen og vedlikeholdet av koden blir lettere på lang sikt.

– Det er i systemprogrammering at Rusts minnesikkerhet virkelig gjør forskjellen, men resten av språket er også veldig gjennomtenkt og gjør det gøy å skrive hva som helst, sier Ertel.

Sekunder, ikke minutter

Mens Julian Ertel i Miles tidligere har brukt Rust til å utvikle diverse interne verktøy, bruker Everyday språket til blant annet et system for prosessering av betalinger.

Marcus Dahl i Everyday mener den ekstremt gode ytelsen til Rust gjør det mulig å løse ting som går for tregt i andre språk.

«Tiden det tok ble redusert fra flere minutter til noen få sekunder!»

– Ett bruksområde vi har sett er bruken av Rust via WebAssembly der ytelse er viktig. Vi har for eksempel jobbet på en Sudoku-generator, hvor det rett og slett tok altfor lang tid å gjøre følgende i ren JavaScript:

  1. Sjekke at Sudoku-oppgaven faktisk kan løses
  2. Teste oppgaven opp mot forskjellige strategier for å beregne en score for vanskelighetsgrad

– Når vi skulle generere et sett med 20 pluss ekstremt vanskelige oppgaver, tok det altfor lang tid i JavaScript, mye fordi det å løse og teste strategier på vanskelige Sudoku-oppgaver krever ekstremt mange iterasjoner.

Koden ble skrevet om til Rust/WebAssembly og det ble tatt i bruk multi-threading for å løse og gradere så mange oppgaver som mulig samtidig.

– Tiden det tok ble redusert fra flere minutter til noen få sekunder!

Minnesikkert – hva betyr det?

Både Julian Ertel og Marcus Dahl er enige i at en av hovedgrunnene til at Rust er så bra, er at det i motsetning til språk som C eller C++ er "minnesikkert". Det betyr at det er laget for å unngå feil som kan skje når et program prøver å lese eller skrive verdier til minne.

Det at språket gjør det lettere å unngå sårbarheter forårsaket av feil minnehåndtering er en av grunnene til at teknologidirektør for Microsoft Azure, Mark Russinovich, i fjor høst gikk så langt som å fraråde bruken av C/C++ og bruke Rust i stedet.

I tillegg til Microsoft, har også Amazon tatt i bruk Rust i stor skala. Til og med Google har valgt å bruke Rust til å skrive ny kode i Android. Det har ført til en halvering av minnerelaterte sikkerhetshull i Android.

– I språk som C eller C++ kan den manuelle minnehåndteringen føre til bugs. De usikre bugsene er de som leser eller skriver til minneområder som er utenfor de områdene utvikleren ville bruke. Sånne feil kan skje relativt enkelt i språk som gir deg direkte tilgang til minne gjennom pekere, sier Ertel.

Ulike språk kan bruke forskjellige taktikker for å være minnesikkert, for eksempel nekte direkte tilgang til og manipulering av pekere, og bruke avfallsinnhenting (garbage collection) for å unngå å frigjøre og gjenbruke minne det fortsatt refereres til ett eller annet sted i koden. Dette hindrer også minnelekkasjer, det vil si minne som ikke blir frigjort etter at det ikke lenger er i bruk. Enkelte språk sjekker også at indekser ligger innenfor tabellens grenser.

«Rust garanterer en høy minnesikkerhet ved kompileringstid og trenger ingen avfallsinnhenting.»

– Hvis flere steder i programmet har en referanse til samme minneområde kan det føre til data races, altså et kappløp da programmet oppfører seg annerledes basert på hvem som skriver og leser først. Å unngå disse er ofte utviklerens ansvar, sier Ertel.

Han sier at mange språk som for eksempel Java har høy minnesikkerhet på grunn av avfallsinnhenting og grensesjekking på tabeller.

– Men Rust garanterer en høy minnesikkerhet ved kompileringstid og trenger ingen avfallsinnhenting, sier Ertel.

Det mange synes er vanskelig i Rust

Ett av konseptene nybegynnere i Rust synes er vanskeligst, er at alle variabler kun kan ha én eier. I stedet for en garbage collector, har Rust en "borrow checker" (lånekontrollør) som kontrollerer at den aktuelle delen av koden din har eierskap til variabler du prøver å sende videre inn i andre funksjoner.

– Det er alltid bare én del av koden som har eierskap til en verdi. Eierskapet kan gis bort, eller så kan verdien lånes bort som en referanse. Rust pålegger at den delen av koden som skriver til en verdi må være den eneste som har en referanse til verdien, det må være en mutable referanse, forklarer Ertel.

«Det er alltid bare en del av koden som har eierskap til en verdi. Eierskapet kan gis bort, eller så kan verdien lånes bort som en referanse.»

Marcus Dahl i Everyday forklarer dette konseptet som mange synes er vanskelig med et kodeeksempel.

I JavaScript vil for eksempel denne koden være gyldig:


const myObject = {}
const myOtherObject = myObject

doSomething(myObject)

Tilsvarende kode i Rust vil se slik ut:

#[derive(Debug)]
struct MyStruct {}

fn main() {
    let my_object = MyStruct {};
    let my_other_object = my_object;

    println!("{:?}", my_object);

}

Denne koden er ikke gyldig i Rust. Du vil få en feilmelding som forteller deg at eierskap til "MyStruct" ikke lenger tilhører "my_object", og at eierskapet er flyttet til "my_other_object"-variabelen.

– Disse feilmeldingene kommer i compile-time, det vil si i det maskinen prøver å bygge koden din. På denne måten vet Rust når den ikke lenger har behov for en variabel og kan frigjøre den delen av minnet som en gang ble brukt til å huse en referanse til verdien dens, sier Dahl.

Rust trenger derfor ikke en "garbage collector" som gjør denne prosessen mens koden din kjører, og vi vil derfor aldri støte på en minnelekkasje.

– Det er nettopp dette som gjør Rust til et minnesikkert språk, sier Dahl. Han mener språket har en god balanse mellom hvor vanskelig det er å lære og hvor godt det yter.

Færre overraskelser

De som prøver Rust vil kanskje i starten bli overveldet av alle feilmeldingene fra kompilatoren. Men feilmeldingene du får ved kompilering er både gode og beskrivende. De hjelper deg ikke bare med å finne feil – men faktisk også med å lære språket.

– Feilhåndtering i Rust er mye strengere enn i andre språk. Ta for deg et hvilket som helst språk som støtter et "try/catch"-mønster, der er ofte try/catch fullstendig valgfritt og det eneste som forteller deg at en feil kan oppstå er IDE-en din, eller en liten advarsel når du kompilerer, sier Dahl.

«Rust vil faktisk tvinge deg til å håndtere feilen på en grasiøs måte.»

Han tror hovedgrunnen til at Rust har vokst så mye de siste par årene er at språket kan brukes til lavnivåprogrammering, men har et API som likevel ligner veldig mye på høynivå programmeringsspråk.

Så fort man lærer seg konseptet bak lånekontrolløren og eierskap, vil Rust oppleves som enklere å lære enn for eksempel C++, mener Dahl. Hans erfaring er også at kode du skriver i Rust yter bedre enn kode skrevet i C++, mye takket være minnesikkerhet og tvungen feilhåndtering.

– Rust vil faktisk tvinge deg til å håndtere feilen på en grasiøs måte, eller eksplisitt si at du ikke bryr deg, men man blir likevel lært opp til at man burde føle på en viss skam hver gang man skriver ".unwrap()", sier Dahl.

Julian Ertel i Miles tror at mens mange programmeringsspråk har blitt populære på grunn av at språket brukes i forbindelse med et bibliotek, rammeverk eller plattform, så er det mange som ønsker å bruke Rust for språkets skyld.

– Rust gjør veldig mye ved kompilerings-tid, det vil si når du utvikler. Det kan ta lengre tid å få ting til å kompilere, men det blir færre overraskelser når du kjører programmet. Som utvikler er det noe man setter mye pris på, sier Ertel.

Slik lærer du deg Rust

Marcus Dahl mener det ikke er uoverkommelig å lære seg Rust.

– Jeg vil si det er litt vanskeligere enn C#, men betydelig lettere enn C++. Det aller beste stedet å begynne å lære Rust er den offisielle Rust-dokumentasjonen. Den er overraskende bra, og jeg anbefaler å jobbe seg gjennom hele, sier Dahl.

Dahl anbefaler også norske Jon Gjengset sin "Crust of Rust"-serie på YouTube.

Julian Ertel mener det kan være vanskelig å lære Rust hvis det er ditt første programmeringsspråk. Har du imidlertid litt erfaring med andre språk, går det kanskje lettere. Men det avhenger litt av hvilke språk du kan fra før. Ertel selv hadde bakgrunn fra C++ før han begynte å lære Rust.

– Det som virkelig kan hjelpe deg er Rust-dokumentasjonen og de fantastiske feilmeldingene fra Rust-kompilatoren, sier Ertel.