Rust (programmeringssprog)

Rust er et multi-paradigme programmeringssprog skabt af Graydon Hoare, der er omhyggeligt designet til at levere høj ydeevne og it-sikkerhed.

Sproget er særligt kendt for sin evne til at håndtere samtidighed på en sikker måde, hvilket minimerer risikoen for kørselsfejl. Rust svarer syntaktisk til C og C++, men kan garantere hukommelsessikkerhed ved at bruge en lånekontrol til at validere referencer. Man kan dog komme uden om dette ved f.eks. at bruge et såkaldt 'unsafe' keyword, hvilket giver mere fleksibilitet, men også øger programmørens ansvar for korrekt hukommelsesstyring, da det tillader kode, der potentielt kan bryde hukommelsessikkerheden .

Historie 
I 2006 besluttede Graydon Hoare, en 29-årig computerprogrammør, der arbejdede for Mozilla, at designe et nyt programmeringssprog. Han blev inspireret af en frustrerende oplevelse med en elevator, der konstant gik i stykker på grund af softwarefejl. Hoare vidste, at mange af disse fejl skyldtes problemer med, hvordan et program bruger hukommelse. Han besluttede sig derfor at skabe et sprog, der kunne skrive hurtig kode uden hukommelsesbugs. Rust har fået sit navn efter en gruppe af bemærkelsesværdigt hårdføre svampe, Rustsvampe, som ifølge Hoare er "over-engineered for survival" . 

Over et halvandet årti senere er Rust blevet et af de mest populære programmeringssprog.  

Rust blev officielt sponsoreret af Mozilla i 2009. Sproget ville være open source, og kun de mennesker, der bidrog til dets udvikling, ville have ansvar for det. Mozilla var dog parat til at kickstarte det ved at finansiere projektet . I løbet af de følgende 10 år hyrede Mozilla mere end et dusin ingeniører til at arbejde fuldtid på Rust . 

I 2015 blev den første stabile version af Rust udgivet, og det blev hurtigt populært blandt store virksomheder. I 2020 afslørede Dropbox en ny version af deres "sync engine", altså dét som synkroniserer filer i skyen, der var omskrevet til Rust . I samme år omskrev Discord deres "Read States" service, en kritisk service der holder styr på, hvilke kanaler og beskeder brugere har læst, til Rust, hvilket resulterede i en markant forbedring  og derved gjorde systemet 10 gange hurtigere . Amazon Web Services, som leverer cloud computing-platforme og API'er efter behov, har også fundet, at Rust kan hjælpe dem med at skrive sikrere, hurtigere kode . 

I Stack Overflows udviklerundersøgelse fra 2023, som de afholder hvert år, er Rust blevet kåret som det mest beundrede programmeringssprog, hvor over 80% af de udviklere, der har anvendt sproget, har udtrykt et ønske om at fortsætte med det i det kommende år . Dette står i skarp kontrast til det mindst attraktive sprog, MATLAB, hvor under 20% af de udviklere, der har brugt det, ønsker at fortsætte med det i det følgende år . Faktisk har Rust de sidste 7 år blevet kåret til at være det mest beundrede programmeringssprog ifølge samme undersøgelse .

Sikkerhedsforanstaltninger 
I Rust beregner compileren, hvornår en variabel ikke længere er tilgængelig, og når det sker, indsætter compileren kode til frigivelse af variablens hukommelse. Variabler er som udgangspunkt uforanderlige (immutable), hvilket betyder, at deres værdi ikke kan ændres, når de først er blevet tildelt. Hvis en variabel skal kunne ændres, kan den defineres som foranderlig (mutable) ved at bruge 'mut' nøgleordet foran variabelnavnet.

Når en funktion modtager en variabel som parameter, overtager den som udgangspunkt ejerskabet, medmindre parameteren er en reference. Ved at definere parameteren som en reference, 'låner' funktionen variablen uden at overtage ejerskabet.

En reference giver som udgangspunkt kun læseadgang, men det er muligt at definere foranderlige (mutable) referencer, der tillader opdatering. Rust tillader kun én foranderlig reference til en bestemt data i en bestemt rækkevidde, hvilket hjælper med at forhindre 'data race' betingelser. En 'data race' opstår, når to eller flere tråde i en multithreaded applikation samtidigt forsøger at læse fra og skrive til den samme hukommelsesplads uden passende synkronisering. Desuden tillader Rust flere uforanderlige (immutable) referencer, men ikke en mutable reference samtidig med nogen immutable referencer. Dette er også en del af Rusts regler for "aliasing" og "mutability", som sikrer mod fejl, hvor data ændres eller slettes under læsning.

Programstruktur 
Rust-programmer er typisk struktureret i mange funktioner, der kalder hinanden. Dette hjælper med at holde kode organiseret og genanvendelig.

Rust understøtter også moduler, som er en måde at gruppere relaterede definitioner, såsom funktioner, strukturer (datastrukturer, der kan indeholde forskellige typer data) og træk (en måde at definere fælles adfærd på), sammen. Som standard er alle definitioner i et modul private, hvilket betyder, at de kun kan tilgås inden for det modul, de er defineret i. Hvis en definition skal være tilgængelig uden for det modul, det er defineret i, kan det gøres offentligt ved hjælp af nøgleordet 'pub'.

I større Rust-programmer kan moduler være indlejret i hinanden for at skabe en hierarkisk struktur. Dette kan hjælpe med at organisere kode i logiske grupper. Desuden kan moduler flyttes ud i deres egne filer for at gøre koden mere overskuelig og nemmere at vedligeholde.

Her er et eksempel på, hvordan moduler kan bruges i Rust: 
 // Definerer et modul med navnet 'greetings'
 mod greetings {
     // Gør 'hello' funktionen offentlig med 'pub' nøgleordet
     pub fn hello() {
         println!("Hello, world!");
     }
 
     // 'goodbye' funktionen er privat og kan kun tilgås inden for 'greetings' modulet
     fn goodbye() {
         println!("Goodbye, world!");
     }
 }
 
 // Hovedfunktionen
 fn main() {
     // Kalder den offentlige 'hello' funktion fra 'greetings' modulet
     greetings::hello();
 }
I dette eksempel er 'hello'-funktionen defineret i 'greetings'-modulet og gjort offentlig, så den kan kaldes fra 'main'-funktionen. Derimod er 'goodbye'-funktionen privat og kan kun kaldes inden for 'greetings'-modulet.

Eksempel 
Her er et simpelt eksempel på et CLI script skrevet i Rust, hvor der genereres et tilfældigt tal ved hjælp af rand-programbiblioteket.
 // Her importeres 'rand' biblioteket, som muliggør generering af tilfældige tal.
 use rand::Rng;
 
 // Hovedfunktionen, hvor programmet starter.
 fn main() {
     // Kalder 'generate_random_number' funktionen og gemmer resultatet i et uforanderligt variabel.
     let random_number = generate_random_number();
 
     // Her skrives en linje til konsollen.
     println!("Det tilfældige tal er: {}", random_number);
 }
 
 // Funktion der genererer et tilfældigt tal mellem 1 og 10.
 fn generate_random_number() -> i32 {
     // Opretter en ny tilfældig nummergenerator.
     let mut rng = rand::thread_rng();
 
     // Genererer et tilfældigt tal mellem 1 og 10
     // Der skrives ikke '1..10', men i stedet '1..11', fordi den øvre grænse, 11, ikke er inkluderet
     let random_number = rng.gen_range(1..11);
 
     // Returnerer det tilfældige tal.
     return random_number;
 }

Se også 
 Redox (styresystem) - skrevet i Rust

Referencer

Links 
 https://rust-lang.org - Rusts officielle hjemmeside
 https://doc.rust-lang.org/stable/book/ - En guide til Rust

Programmeringssprog