Programmering

Kom i gang med Rust i Windows-programmering

Kan Microsoft bytte fra bruk av C, C ++ og C # til andre språk? Et nylig blogginnlegg fra Microsoft Security Response Center (MSRC) antydet at det godt kunne være å se på alternativer, med sikte på å redusere risikoen for koden. Som Gavin Thomas, den viktigste sikkerhetsingeniørsjefen ved MSRC, bemerket at en av hovedårsakene til feilene i Microsoft-koden rapportert til MSRC er minnekorrupsjon, feil som lar minne overskrives eller få tilgang til det som skal beskyttes minne.

Å holde minnet trygt

Minnesikkerhet har vært et betydelig problem i lang tid, men det statistiske arbeidet som er gjort av MSRC viser at problemet ikke forsvinner. Du har mange verktøy som hjelper til med å skrive sikker kode, fra Microsofts egen Secure Development Lifecycle, til bruk av nyere minnesikre språk som C #. Men disse tilnærmingene har sine kompromisser: Koden de produserer er tregere og fungerer på et høyere nivå enn C ++.

Det er ikke et problem for kundevendt kode. Det er ingen perseptuell forskjell mellom en C ++ - develoepd brukeropplevelse og en innebygd C #. Men på systemnivå, koden som brukes til å bygge operativsystemer og enhetsdrivere, er det stor forskjell. Prosessorsykluser har betydning når du jobber på systemnivå, og som Thomas påpeker i blogginnlegget, er ubeskyttede språk som C ++ og C egentlig de eneste verktøyene som historisk fungerer på det nivået.

Det er klart at de hukommelsessikre tilnærmingene som brukes av språk på høyere nivå, ikke fungerer på systemnivå. Mange av problemene som plaget Microsofts aborterte Longhorn-prosjekt, var forårsaket av å prøve å bygge et helt operativsystem på .NET-plattformen. Så hvordan kan vi bringe minnesikkerhet til grunnlaget for systemutvikling?

Vi presenterer Rust

Svaret kommer med en ny generasjon av systemprogrammeringsspråk som Go og Rust, språk som har minnesikker design av .Net med hastigheten C og C ++. Microsoft bruker allerede Go i omfattende grad i Azure, fordi det er språket Kubernetes er skrevet i. Men disse tilnærmingene har ikke kommet til Windows ennå, hvor C ++ fremdeles er systemprogrammeringskongen.

I sitt blogginnlegg argumenterer Thomas for å bruke Mozillas Rust som et trygt systemspråk for Windows. Det er et interessant forslag, og et som allerede har ett stort bevis-poeng i sin favør: Språkdesigneren Mozilla bruker den allerede i sine nyeste nettleserutgivelser, der den driver Mozillas nåværende og neste generasjons gjengivelsesmotorer. Andre store Rust-brukere inkluderer JavaScript-modulregisteret NPM, Dropbox og Oracle. Selv Microsoft bruker det allerede, med Rust-kode i noen av Azure IoT Edge-verktøyene.

Sette opp et Windows Rust-utviklingsmiljø

Det åpenbare stedet å starte med Rust-utvikling er Visual Studio Code. På Extensions-markedet kan du finne flere utvidelser som installerer Rust Language Server og som har full språkstøtte, samt verktøy for å bygge Rust-appene dine fra Visual Studio Code. Jeg har brukt den offisielle Rust-utvidelsen fra Rust-språklaget. Andre verktøy gir støtte for kodebiter for kickstart-utvikling, samt ekstra feilsøkings- og testverktøy. Det er til og med verktøy for å bygge dokumentasjon for koden din. Det er verdt å installere Rust-utvidelsespakken som en del av Visual Studio Code Ruse-miljøet, da dette legger til ekstra verktøy for å jobbe med Rusts egne utviklingsverktøy.

Du må først installere Rust-kompilatoren og lastepakkeadministratoren. Det offisielle Rust-installasjonsstedet vil oppdage versjonen av Windows du bruker, og gi riktig nedlasting. Det er til og med instruksjoner for å installere Rust på Windows Subsystem for Linux (WSL), hvis du bruker WSL som en del av en Unix utviklingsverktøykjede. Å kjøre Rustup-installasjonsprogrammet laster ned språkkomponentene og setter Windows STI. Du får muligheten til å tilpasse installasjonen, men i praksis er det best å godta standardinnstillingene.

Forståelse av rust og minnesikkerhet

Hvis du programmerte C eller C ++, er overgangen til Rust relativt enkel. Det er mye likhet mellom språkene, selv om det er Rusts konsept om eierskap som gjør det minne-trygt. Eierskap lar Rust administrere omfanget av variabler, slik at de bare kan være gyldige mens de er i omfang. Hvis de ikke blir brukt, er de ikke i minne. Noen variabler er bokstavelige, uforanderlige verdier som er hardkodet i koden din. Men mer komplekse variabeltyper kan be om minne når de er satt, en prosess som på mange andre språk krever at du eksplisitt tildeler minne og deretter frigjør det når variabelen eller objektet ikke lenger er nødvendig. Rust automatiserer dette og håndterer minnebruk som en del av omfangsadministrasjonen.

Teamet på Mozilla som skapte Rust har tenkt dypt om minnesikkerhet og kompromissene som kan skje i trygge omgivelser. Resultatet er et språk som er både trygt og raskt, med verktøy som administrerer både minnestabler og dynger. Å tilordne en verdi til en funksjon endrer eierskapet, og flytter den fra ett omfang til et annet; en lignende prosess administrerer verdier som returneres fra en funksjonsanrop.

Eierskap er et komplekst konsept, men det er viktig. Den beskytter minnet og lar bare funksjonene som eier en verdi endre den, selv når du bruker en referanse til en variabel. Fordi Rust behandler en referanse som å låne variabelen, vil det å prøve å endre den bare generere en feil, med mindre du erklærer at den kan endres.

Fremtiden til Rust i Windows

Det er viktig å huske at Rust fremdeles er et ungt språk, og mye av det du tar for gitt i Windows-utvikling er ikke der. Det er ingen direkte integrasjon med Win32 eller andre kjerne Windows SDK-er, og du finner ingen støtte for Windows GUI-verktøy uten å installere flere biblioteker. Det er imidlertid ikke så mye et problem som du kanskje tror: Rust, som Go, er et systemprogrammeringsspråk. Det er et verktøy på lavt nivå, raskt og trygt. Det gjør det ideelt for å bygge kode som manipulerer dataene dine, knaser tall og behandler matriser. I stedet for å bruke C ++ - rutiner der du jobber med store mengder minne, kan du bruke Rust i stedet for å redusere risikoen forbundet med minnekorrupsjon.

Hvis du ønsker å utvikle GUI-applikasjoner i Rust, har du muligheten til å bruke en av flere UI-biblioteker. Kanskje den enkleste å bruke er Kiss-ui, som støtter både Windows og Linux GUI-utvikling, med Win32 API-tilgang samt støtte for GTK på tvers av plattformer. Andre biblioteker legger til dypere Win32 API-støtte.

Selv om Microsoft ikke ender opp med å støtte Rust direkte, er det rikelig med fellestøtte. Mens det å samle en fullverktøykjede fortsatt kan være et spørsmål om å velge de forskjellige elementene du trenger og bruke verktøy som Rustup for å installere dem, ser ankomsten av Visual Studio Code-utvidelser og utvidelsespakker ut til å forenkle prosessen. Regelmessige oppdateringer viser at dette er veldig mye et live-prosjekt, med Rust-teamet og en rekke tredjepartsbidragere som jobber med det.

Det underliggende prinsippet om å bruke hukommelsessikre språk er viktig, og det er absolutt godt å se folkene på MSRC ta opp problemet. Inntil det er en offisiell utgivelse av et minnesikkert systemprogrammeringsnivå på lavt nivå, er det absolutt verdt å gi Rust en gang om gangen. Hvis Microsoft velger det, kommer du til å være langt foran spillet.

Utenfor Windows er Rust et nøkkelspråk for utvikling av WebAssembly og bør bidra til å levere mye kraftigere webapplikasjoner i den kommende Chromium-drevne utgivelsen av Edge - en annen grunn til å gi den et nøye utseende.