Witold Kepinski - 13 november 2019

Microsoft deelt eerste ervaringen rond gebruik Rust in Windows

Microsoft deelt eerste ervaringen rond gebruik Rust in Windows image

Microsoft deelt zijn eerste ervaringen rond het gebruik van development taal Rust in Windows omgevingen. Zo is er een Windows component in Rust herschreven in plaats van C en C ++. De eerste ervaring is positief zo meldt Microsoft software engineer Adam Burch van het Hyper-V team.

Burch meldt:

"Hoewel het project nog niet is afgerond, kan ik zeggen dat mijn ervaring met Rust over het algemeen positief is geweest. Het is een goede keuze voor mensen die veelvoorkomende fouten willen vermijden die vaak leiden tot beveiligingsproblemen in C ++ codebases.

Geweldige ontwikkelaarservaring

Voor C ++ ontwikkelaars die gewend waren complexe systemen te schrijven, is het gebruik van Rust als ontwikkelaar een verademing. De garanties voor geheugen en gegevensveiligheid die door de compiler worden gegeven, geven de ontwikkelaar veel meer vertrouwen dat het compileren van code correct is, verder dan kwetsbaarheden voor geheugenveiligheid. Er wordt minder tijd besteed aan het oplossen van triviale problemen of frustrerende raceomstandigheden. De compilerwaarschuwingen en foutmeldingen zijn zeer goed geschreven, waardoor beginnende Rust-programmeurs snel problemen in hun code kunnen identificeren en oplossen. VSCode heeft al een nuttige extensie ( RLS ), die Intellisense-suggesties en syntaxisaccentuering biedt. Bovendien biedt de Cargo build-tool zeer nuttige functies voor testen, het genereren van documentatie en automatisch formatteren.

Leercurve

Dankzij een overvloed aan online documentatie en zeer nuttige compilerfoutmeldingen, heeft Rust een vrij gemakkelijke leercurve voor iemand zoals ik die C ++ het grootste deel van mijn carrière heeft gebruikt. Er zijn tutorials specifiek gericht op C / C ++ systeemingenieurs. In zijn toespraak op RustConf 2019 merkte Jeremy Fitzhardinge op Facebook op dat hij ervaren C / C ++ -ontwikkelaars in ongeveer vier weken op hun gemak voelde met Rust en redelijk vloeiend in acht. Dit komt overeen met mijn eigen ervaring. Ik heb deelgenomen aan de jaarlijkse interne "One Week" -hackathon van Microsoft met een ervaren Rust-ontwikkelaar en een complete beginner. Binnen drie dagen had de beginnende Rust-ontwikkelaar meer dan 1000 regels idiomatische Rust-code geschreven. Naast de geweldige documentatie zijn er handige tools zoalsClippy waarmee ervaren C ++ -ontwikkelaars meteen in de codering van Rust kunnen springen zonder veel directe hulp van degenen die ervaring hebben met Rust.

Naarmate we het gebruik van Rust binnen Microsoft uitbreiden, denk ik dat het verstandig is om een RustReviewers-groep te starten voor PR's die Rust-code bevatten. Dit helpt nieuwelingen in diverse teams om feedback te krijgen van Rust-experts, ongeacht het specifieke probleemdomein.

Over het algemeen zijn nieuwe componenten of bestaande componenten met schone interfaces het gemakkelijkst te porten naar Rust. De component die ik heb herschreven, is een uitdaging omdat er veel abstracties van de ene naar de andere laag zijn gelekt, wat enige voorafgaande refactoring vereist voordat vooruitgang kon worden geboekt.

Buitenlandse functie-interfaces (FFI)

Het is eenvoudig om Rust-code te koppelen aan de grenzen van C ABI (application binary interface). Er is een minimale hoeveelheid boilerplate-code nodig om te schrijven voor eenvoudige functies met basistypes. Aangezien FFI-functies echter altijd onveilig zijn, is een wikkelfunctie altijd gewenst. Voor functies waarbij gecompliceerdere structuren betrokken zijn, is het wenselijk om automatisch een equivalente roeststructuur te genereren met behulp van bindgen als onderdeel van het bouwproces. Om rechtstreeks met C ++ te kunnen samenwerken, is nog wat onderzoek nodig, hoewel we hier al een aantal teams naar onderzoeken. Microsoft heeft onlangs een COM-bibliotheek geopend die we als de eerste stap hiertoe zien, maar we zullen uiteindelijk geavanceerdere tooling willen voor directe koppeling met complexe C ++ API's.

Houd het veilig

Om de gewenste veiligheidsgaranties van Rust te verkrijgen, moeten strikte richtlijnen worden opgesteld voor het gebruik van het onveilige trefwoord. Alle oproepen naar een FFI-functie moeten plaatsvinden in een wrapperfunctie die een veilige abstractie eromheen biedt. Evenzo moet elke andere code die het onveilige trefwoord moet gebruiken, een wrapperfunctie of -structuur hebben die een veilige abstractie biedt.

In de praktijk is, naast FFI-grenzen, onveilig alleen vereist voor zeer eenvoudige protocolverwerking. In deze gevallen is het eenvoudig om enkele generieke onveilige code te schrijven die grondig door een unit kan worden getest en voor verschillende scenario's kan worden gebruikt, wat resulteert in code die veel veiliger aanvoelt dan C ++. Na het schrijven van Rust-code vind ik het schrijven van C ++ veel frustrerender, omdat ik niet op de compiler kan vertrouwen om de veiligheid van het geheugen te waarborgen.

Naast het waarborgen van veiligheidsgaranties, helpt het hebben van een reeks interne Rust-coderingsstandaarden nieuwe ontwikkelaars om het meeste uit de taal te halen. Best practices voor foutafhandeling, logboekregistratie, vergrendeling en andere taalspecifieke problemen zullen sneller code van hogere kwaliteit opleveren.

Gewenste functies en de Rust-community

Gezien de relatieve jeugd van Rust, zijn er nog enkele ontbrekende taalfuncties die zeer wenselijk zouden zijn voor onze ontwikkeling. De belangrijkste hiervan zijn veilige transmutatie (veilig gegoten 'gewone oude gegevenstypes' van en naar onbewerkte bytes), veilige ondersteuning voor vakbonden in C-stijl en feilbare toewijzing (mislukt sierlijk van mislukte toewijzing in plaats van paniek).

Een andere geweldige mogelijkheid van Rust is de in Cargo ingebouwde unit-testing, waarmee ontwikkelaars unit-tests in hetzelfde bestand kunnen schrijven als de productiecode en deze tijdens het ontwikkelen eenvoudig kunnen uitvoeren. Helaas kunnen we tegenwoordig niet op Cargo vertrouwen als een build-tool binnen ons grote en complexe build-systeem, dus we kunnen niet op deze tests vertrouwen in automatische code-integratiestromen zonder verder werk. Met het Cargo-team is al begonnen over hoe grote bedrijven zoals Microsoft met complexe bestaande build-systemen nog steeds kunnen profiteren van Cargo.

Vanwege de interesse in het gebruik van Rust in microcontrollers en low-level systemen zoals kernels en hypervisors, werkt de community al aan het oplossen van deze problemen. Ik ben ervan overtuigd dat we bij Microsoft kunnen helpen bij deze inspanningen om de toekomst van de taal vorm te geven om het nut in deze scenario's te verbeteren.

Hier vandaan

Over het algemeen was het gebruik van Rust echt een geweldige ervaring. Ik kijk ernaar uit om meer ontwikkelaars bij Microsoft te zien werken met de taal en met de bredere gemeenschap om de taal nog beter te laten aansluiten op sommige van de dingen die we hier bij Microsoft doen."

 

Wil jij dagelijkse updates?

Schrijf je dan in voor onze nieuwsbrief!