Rust er et kompilert , multiparadigme programmeringsspråk som utvikles av Rust Foundation . Det er et multi-paradigme programmeringsspråk som støtter ren funksjonell , prosedyremessig , imperativ og objektorientert programmering .
I henhold til Mozillas policy, [ 5 ] er Rust utviklet på en helt åpen måte og søker innspill og bidrag fra samfunnet. Utformingen av språket har blitt foredlet gjennom erfaringer med utvikling av Servo - nettlesermotoren [ 6 ] og selve Rust-kompilatoren. Selv om det er utviklet og sponset av Mozilla og Samsung, er det et fellesskapsprosjekt. En stor del av bidragene kommer fra medlemmer av fellesskapet. [ 7 ]
Innen 2020 er det et av de mest brukte programmeringsspråkene når det gjelder å jobbe med kryptovalutaer og lage noder for å utvinne kryptoaktiva. [ 8 ]
Rusts mål er å være et godt språk for å lage store klient- og server -side programmer som kjører på Internett. Dette har ført til et funksjonssett med vekt på sikkerhet, minneallokeringskontroll og samtidighet. Sikker kodeytelse forventes å være tregere enn C++ , hvis ytelse er den eneste vurderingen, men sammenlignet med C++-kode laget for å ta sammenlignbare forholdsregler som Rust gjør, kan sistnevnte være enda raskere. [ 9 ]
Rusts syntaks er lik C og C++, med parentesavgrensede blokker med kode og flytkontrollstrukturer som if, else, do, whileog for. Ikke alle C- og C++-strukturer er til stede, og andre (for eksempel nøkkelordet matchfor flerveis forgrening) vil være mindre kjent for programmerere som kommer fra disse språkene.
Systemet er designet for sikker minnetilgang, og tillater ikke null -pekere eller hengende pekere . [ 10 ] [ 11 ] Dataverdier kan bare initialiseres på et fast sett med måter, som krever at inngangene deres allerede er initialisert. [ 12 ]
Typesystemet støtter en mekanisme som ligner på typeklasser, kalt "trekk", direkte inspirert av Haskell -språket . Dette er et anlegg for polymorfisme som støtter ulike typer argumenter ( ad-hoc polymorfisme ), oppnådd ved å legge til restriksjoner for å skrive variabeldeklarasjoner. Andre Haskell -funksjoner , for eksempel høyere type polymorfisme , støttes ikke.
Rust har typen inferens , for variabler deklarert med let nøkkelordet. Slike variabler trenger ikke å initialiseres med en tilordnet verdi for å bestemme typen. På kompileringstidspunktet gir den en feil hvis en kodegren ikke klarer å tilordne en verdi til variabelen. [ 13 ] Funksjoner kan motta generiske parametere, men de må være uttrykkelig avgrenset av egenskaper , det er ingen måte å utelate typedeklarasjoner uten å forlate bruken av metodene og operatorene til parameterne.
Samtidig støttes gjennom enkle oppgaver, lik de som finnes i Erlang og andre aktørbaserte språk. I slike systemer kommuniserer oppgaver gjennom meldingsoverføring, i stedet for å dele data direkte. Av ytelsesgrunner er det mulig å sende data uten å kopiere ved å bruke enkeltbokser. Unike bokser har garantert kun én eier, og kan frigis av avsenderen for bruk av mottakeren.
Rusts objektsystem er basert på implementeringer, egenskaper og strukturerte typer. Implementeringer har en lignende funksjon som klasser på andre språk, og er definert med impl nøkkelordet. Arv og polymorfisme er gitt av egenskaper , de lar metoder defineres og blandes i implementeringer. Strukturerte typer brukes til å definere felt. Implementeringer og egenskaper kan ikke definere sine egne felt, og bare egenskaper gir arv, for å unngå C++ diamantproblemet .
Språket vokste ut av et personlig prosjekt startet i 2006 av Mozilla-ansatt Graydon Hoare, [ 14 ] som hevdet at prosjektet muligens var oppkalt etter rustfamilien av sopp. [ 15 ] Mozilla begynte å sponse prosjektet i 2009 [ 14 ] og kunngjorde det i 2010. [ 16 ] [ 17 ] Samme år flyttet arbeidet fra den første kompilatoren (skrevet i OCaml) til den selv-hostede kompilatoren skrevet i Rust. [ 18 ] Kalt rustc, den ble vellykket kompilert i 2011. [ 19 ] rustc bruker LLVM som bakenden.
Den første nummererte pre-alfa-versjonen av Rust-kompilatoren ble produsert i januar 2012. [ 20 ] Rust 1.0, den første stabile versjonen, ble utgitt 15. mai 2015. [ 21 ] [ 22 ] Etter 1.0 leveres stabile punktutgivelser hver sjette uke, mens funksjoner utvikles i Rust hver kveld og deretter testes med alfa- og beta-utgivelser som varer i seks uker. [ 23 ]
Sammen med konvensjonell statisk skriving, støttet Rust også typetilstander før versjon 0.4. Typestate-systemet modellerer påstander før og etter programsetninger, ved bruk av en spesiell sjekkerklæring. Avvik kan oppdages på kompileringstidspunktet, i stedet for når et program kjøres, som kan være tilfellet med påstander i C- eller C++-kode. Typestate-konseptet var ikke unikt for Rust, da det først ble introdusert på NIL-språket. [ 24 ] Typestates ble fjernet fordi de sjelden ble brukt i praksis, selv om den samme funksjonen fortsatt kan oppnås med et markup-mønster. [ 25 ]
Stilen til objektsystemet endret seg betydelig i Rust-versjonene 0.2, 0.3 og 0.4. Versjon 0.2 introduserte klasser for første gang, og versjon 0.3 la til flere funksjoner, inkludert destruktorer og polymorfisme gjennom bruk av grensesnitt. I Rust 0.4 ble egenskaper lagt til som et middel for å gi arv; grensesnitt ble forent med egenskaper og fjernet som en egen funksjon. Klasser ble også fjernet, erstattet av en kombinasjon av implementeringer og strukturerte typer.
Starter i Rust 0.9 og slutter i Rust 0.11, Rust hadde to typer innebygde pekere: ~ og @, noe som forenkler kjerneminnemodellen. Reimplementerte disse pekertypene i standardbiblioteket som Boxy (nå fjernet) Gc.
I januar 2014, før den første stabile utgivelsen, Rust 1.0, kommenterte Dr. Dobbs sjefredaktør Andrew Binstock Rusts sjanser til å bli en konkurrent til C++ og de andre kommende D-språkene, Go og Nim (den gang Nimrod). I følge Binstock, mens Rust ble "utbredt sett på som et bemerkelsesverdig elegant språk", ble adopsjonen redusert fordi den gjentatte ganger byttet mellom versjoner. [ 26 ]
Rust var det tredje mest elskede programmeringsspråket i 2015 Stack Overflow årlige undersøkelse [ 27 ] og rangert først i 2016-2020. [ 28 ] [ 29 ] [ 30 ] [ 31 ] [ 32 ]
Språket er nevnt i The Mozilla Book som "rustent metall". [ 33 ]
I august 2020 permitterte Mozilla 250 av sine 1000 ansatte over hele verden som en del av en bedriftsrestrukturering utløst av den langsiktige virkningen av COVID-19-pandemien. Teamet bak Servo , en nettlesermotor skrevet i Rust, er fullstendig oppløst. Arrangementet vakte bekymring for fremtiden til Rust, ettersom noen teammedlemmer var aktive Rust-bidragsytere.
Uken etter anerkjente Rusts kjerneteam den alvorlige virkningen av permitteringene og kunngjorde at planene for en Rust-stiftelse var i gang. Stiftelsens første mål vil være å ta eierskap til alle varemerker og domenenavn, og påta seg økonomisk ansvar for kostnadene deres. [ 34 ]
8. februar 2021 kunngjorde de fem grunnleggerne ( AWS , Huawei , Google , Microsoft og Mozilla) dannelsen av Rust Foundation. [ 35 ] [ 36 ]
6. april 2021 annonserte Google støtte for Rust i Android Open Source Project som et alternativ til C/C++. [ 37 ]
Følgende kode er gyldig for Rust 0.8. I senere versjoner kan du endre syntaks eller funksjoner.
Program som viser uttrykket "Hallo, verden!":
fn main () { println! ( "Hei verden!" ); }To versjoner av den faktorielle funksjonen , i rekursiv og iterativ stil :
/* Grenene i denne funksjonen viser Rusts valgfrie implisitte returverdier , som kan brukes når en mer "funksjonell" stil er foretrukket. I motsetning til C++ og andre lignende språk, er `hvis`-kontrollstrukturen et uttrykk snarere enn en erklæring, og har dermed en egen returverdi. */ fn rekursiv_faktoriell ( n : i32 ) -> i32 { hvis n == 0 { 1 } annet { n * rekursiv_faktoriell ( n - 1 ) } } fn iterative_factorial ( n : i32 ) -> i32 { // Variabler er deklarert med `let`. // Nøkkelordet `mut` lar variabler muteres. la mut i = 1 ; la mut resultat = 1 ; mens jeg <= n { resultat *= i ; i += 1 ; } returnere resultat ; // En eksplisitt retur, i motsetning til forrige funksjon. } fn main () { println! ( "Rekursivt resultat: {:i}" , rekursiv_faktor ( 10 )); println! ( "Iterativt resultat: {:i}" , iterative_factorial ( 10 )); }En enkel demonstrasjon av Rusts lette samtidighetsegenskaper :
/* Denne funksjonen lager ti "oppgaver" som kan utføres samtidig. Kjør den flere ganger og legg merke til den taggete utgangen når hver oppgave kaller stdout, siden hver oppgave kan forekomme mellom påfølgende `println`-kall og innenfor selve `println`-funksjonen. */ fn main () { // Denne strengen er uforanderlig, så den kan trygt nås // av flere oppgaver. let message = "Se på meg, jeg er en lett prosess!" ; // `for`-løkker fungerer med alle typer som implementerer // `Iterator`-trekket. for num i området ( 0 , 10 ) { do spawn { println ( melding ); // `println!` er en makro som statisk kontrollerer en formatstreng. Makroer er strukturelle (som i Scheme) i stedet for at // er tekstuelle (som i C). println! ( "Denne meldingen ble tilbudt av oppgaven {:i}." , num ); } } }I tillegg til de konvensjonelle statiske typene, inkluderte Rust også typetilstander opp til versjon 0.4. Typestate -systemet modellerer setninger før og etter programsetninger, ved bruk av en spesiell sjekkerklæring . Avvik kan oppdages under kompilering, i stedet for etter at programmet er kjørt, som kan være tilfellet med påstander i C- eller C++-kode. Typestate- konseptet er ikke unikt for Rust, da det først ble introdusert i NIL-programmeringsspråket. [ 24 ] Typestates ble fjernet fordi de i praksis ble funnet å være lite brukt, men den samme funksjonaliteten kan fortsatt oppnås med mønstrene til samme språk. [ 38 ]
Stilen til objektsystemet har endret seg betydelig i Rust-versjonene 0.2, 0.3 og 0.4. Versjon 0.2 introduserte klasser for første gang, med versjon 0.3 som la til en rekke funksjoner, inkludert destruktorer og polymorfisme gjennom bruk av grensesnitt. I Rust 0.4 ble egenskaper lagt til som et middel for å gi arv, grensesnitt ble forent med egenskaper og fjernet som en frittstående funksjon. Klasser ble også fjernet, erstattet av en kombinasjon av implementeringer og strukturerte typer.
Rust tillater opprettelsen av grafiske grensesnitt gjennom de opprinnelige APIene til vertsplattformen, takket være dens lavnivåspråkegenskaper. Imidlertid kan denne utviklingsveien føre til vanskeligheter i prosjekter som vurderer opptak av flere plattformer. [ 39 ]
For tiden er det flere utviklinger for å lage GUI-er i Rust, noen tillater opprettelse av grensesnittet sammen med Electron eller ved å bruke HTML, noen andre gir innfødte biblioteker for språket, men de er fortsatt i en umoden tilstand av utvikling. Til slutt er det prosjektene som kobler kjente biblioteker med større modenhet i utviklingen, som GTK eller Qt , som tillater utvikling på tvers av plattformer. [ 40 ] Noen populære prosjekter er følgende:
Det er en implementering av GTK 3 -bibliotekene for bruk med Rust-språket. For å gjøre dette oppretter den Rust-funksjoner som overlapper funksjonene til GTK -bibliotekene i C, ved å bruke Foreign Function Interface som Rust tilbyr.
Lavt nivå bibliotek som gjør bruk av OpenGL eller Vulkan.
En nettleser og forskjellige relaterte komponenter blir skrevet i Rust, inkludert:
Mange operativsystemer (OS) og relaterte komponenter blir skrevet i Rust. Fra januar 2019 inkluderte operativsystemer: BlogOS, intermezzOS, QuiltOS, Redox, RustOS, Rux, Tefflin og Tock.