Door Dustin Hendriks
Freelanceredacteur
Feedback
• 13-04-2022 06:00
Inleiding
Met dit artikel helpen we je op weg bij het programmeren met de taal Rust. We leggen kort uit wat Rust is en waarin de programmeertaal zich onderscheidt, we geven aan wat je nodig hebt om aan de slag te gaan, en lichten het framework Good Game Easily uit, waarmee je een snelle start kunt maken.
Rust is een algemene programmeertaal, begonnen door Graydon Hoare, als zijproject binnen de afdeling Mozilla Research. In 2009 begon Mozilla het project te sponsoren. De naam verwijst naar bepaalde schimmels uit de klasse van roesten en is een verwijzing naar robuust. Tijdens de ontwikkeling van Mozilla's Servo-engine werd de taal geoptimaliseerd en in 2015 verscheen versie 1.0. Sindsdien verschijnt er elke zes weken een nieuwe release.
De groei en toenemende populariteit van Rust maakten dat het project binnen Mozilla tegen grenzen aan liep. Daar kwam bij dat Mozilla in 2020 250 medewerkers ontsloeg vanwege de gevolgen van de coronacrisis en het uitblijven van succesvolle betaalde diensten. Onder hen waren ook Rust-medewerkers. Het Rust Core Team en Mozilla brachten Rust daarom onder in een stichting, waaronder de verschillende merkrechten en domeinnamen rond Rust en packet manager Cargo zouden vallen, evenals de financiële verplichtingen die hiermee gemoeid zijn. Als onafhankelijk project moest Rust ook meer investeringen aantrekken, was de bedoeling.
Rust is een programmeertaal die gericht is op prestaties, betrouwbaarheid en productiviteit, en die onder andere door Mozilla, Discord en Microsoft wordt ingezet. De taal richt zich op het maken van snelle en robuuste applicaties, met ondersteuning voor multi-threaded concurrency, oftewel gedistribueerd annex parallel programmeren. Dit kan de prestaties van programma's ten goede komen.
In de afgelopen jaren is Rust populairder geworden onder ontwikkelaars, volgens de Tiobe-index. De taal staat momenteel op plaats 26 in de ranglijst, tussen Cobol en Prolog. De verwachting is dat Rust voorlopig in populariteit blijft stijgen.
Applicaties met een noodzaak voor hoge prestaties worden vaak geschreven in C of C++. Deze programmeertalen zijn snel, maar vatbaarder voor fouten door de programmeur. Zo is er beperkt automatisch geheugenbeheer aanwezig. Bij C en C++ ligt de verantwoordelijkheid hiervoor bij de programmeur, wat het risico op fouten in applicaties vergroot. Rust is ontworpen met de ideologie om veiligheid te forceren vanuit de taal, met zo weinig mogelijk gevolgen voor de prestaties. Het is daarom vooral bedoeld als substituut voor C en C++.
Onder de motorkap
Rust is een gecompileerde taal. Hierbij wordt broncode rechtstreeks vanuit de doelmachine vertaald in een uitvoerbaar programma. Op een ander systeem hoeft bij het starten van een uitvoerbaar bestand daarom geen Rust geïnstalleerd te worden.
Geheugenbeheer
Veel programmeertalen werken aan de hand van objecten. Een object kan worden gezien als een container die zowel data als logica kan bevatten. Een object kan bijvoorbeeld een vierhoek zijn. Data binnen dit object kan hypothetisch de coördinaten van de hoekpunten bevatten. Mogelijke logica binnen een vierhoek kan bijvoorbeeld verifiëren of er sprake is van een vierkant, rechthoek of parallellogram.
![Object Encapsulatie [9778]](https://tweakers.net/i/XuhYW6070qIuefbsOTPvZxpIOZ8=/656x/filters:strip_exif()/i/2004902936.png?f=imagenormal)
Veel programmeertalen maken gebruik van een garbage collector. Bij automatisch geheugenbeheer probeert de garbage collector geheugen vrij te geven als dat in gebruik is door objecten die niet meer in de applicatie worden aangeroepen. Het principe functioneert daarmee volgens de stappen:
- Indexeer objecten die niet meer benaderd zullen worden.
- Geef het geheugen van deze objecten vrij.
C noch C++ beschikt over een garbage collector. Dit wordt bij C en in veel gevallen ook bij C++ handmatig opgelost binnen het programma. Dat resulteert in een potentieel zeer snel programma, maar de foutgevoeligheid is groter. Als er fouten worden gemaakt bij het opruimen, kan er sprake zijn van een geheugenlek. Dan kan het geheugen niet correct worden opgeruimd en blijft de grootte van het programma oplopen. De garbage collector is in andere programmeertalen geïntroduceerd om deze verantwoordelijkheid bij de programmeur weg te halen. De ontwikkeltijd van gelijkwaardige programma's is daardoor over het algemeen korter, maar de prestaties kunnen hierdoor minder zijn.
Bij Rust ontbreekt net als bij C en C++ een garbage collector. Dit is binnen Rust opgelost door het introduceren van het principe van ownership. Onder de motorkap worden hierbij referenties naar objecten bijgehouden. Als deze referenties buiten bereik raken, worden objecten automatisch opgeruimd en kan geheugen worden vrijgegeven. Om dit mogelijk te maken, forceert Rust het programmeeridioom resource acquisition is initialization, of raii. Raii onderscheidt zich van een garbage collector doordat er geen sprake is van een afzonderlijk proces, dat het geheugen misschien niet op het ideale moment zal vrijgeven. Als je objecten inkapselt en strikt koppelt met het aanmaken en vrijgeven van geheugen bij het construeren respectievelijk afbreken, hoef je niet handmatig op te ruimen. Het geheugengebruik hangt daarom samen met de levensduur van objecten. Dit resulteert in een lagere foutgevoeligheid dan bij het handmatig opruimen van geheugen, zonder dat het gevolgen heeft voor de prestaties van een ontwikkeld programma.
![Object RAII [9778]](https://tweakers.net/i/2UJvkARxSXlF6XiQv3GS86gwlJI=/656x/filters:strip_exif()/i/2004902940.png?f=imagenormal)
Rust kan als moeilijk worden ervaren vanwege dit principe van ownership, waarbij het goed omgaan met geheugen geforceerd is vanuit de taal. Dit kan worden omschreven aan de hand van de volgende regels:
- Iedere variabele heeft één eigenaar.
- Iedere waarde heeft gelijktijdig maximaal één eigenaar.
- Bij het buiten bereik raken van de eigenaar worden toegekende waarden weggegooid.
Geheugenveiligheid
Rust is ontworpen om 'geheugenveilig' te zijn; de taal staat geen null pointers, dangling pointers of data races toe. Dit kan worden toegelicht aan de hand van de volgende eisen, die worden geforceerd door het model van ownership:
- Er moet altijd een correcte waarde toegekend zijn aan geheugenadressen.
- Waarden in het geheugen moeten overeenkomen met een vooraf gespecificeerd type.
- Conflicterende operaties van het schrijven en/of lezen op geheugenadressen zijn niet mogelijk.
Configureren van de ontwikkelomgeving
Om gemakkelijk en snel zonder eigen ontwikkelomgeving te kunnen experimenteren met Rust, is de Rust Playground gemaakt. Dit is een relatief eenvoudige online-editor, geschikt voor het experimenteren met code.
![Rust Playground [9778]](https://tweakers.net/i/C2EINioW2NqNYjRnMyBgt-4EHQw=/i/2004902964.png)
De instructies voor een lokale installatie van Rust kunnen worden gevonden op rust-lang.org/tools/install. Hier vind je de installer 'rustup', die ook het updaten van installaties mogelijk maakt.
![Install Rustup [9778]](https://tweakers.net/i/R1hRz8ZiNHUMMyp54TdXOHIriQE=/i/2004902946.png)
De installatie van rustup kan worden aangepast via een aantal opties die worden weergegeven in het geopende venster. Daarbij hebben wij gekozen voor de standaardinstallatie (1). Na de installatie van de toolchain-installer kan in powershell of command prompt het commando 'rustup' worden ingetypt en uitgevoerd om te verifiëren dat de installatie gelukt is.
![Verify Rust Toolchain [9778]](https://tweakers.net/i/o2e5lyHjREkB5NENMoTdquDx67Y=/i/2004902948.png)
Er zijn verschillende mogelijke ontwikkelomgevingen, of ide's, om uit te kiezen. Dit artikel beschrijft het configureren van een ontwikkelomgeving voor Rust-development. Daarbij behandelen we twee opties: Visual Studio Code in combinatie met de Rust-plug-in en Atom gecombineerd met de rust-analyser-plug-in.
Visual Studio Code
De aangeraden optie betreft Visual Studio Code samen met Rust-support for Visual Studio Code. Deze ontwikkelomgeving is snel in te richten en gratis in gebruik.
Na de installatie van Visual Studio Code kan de Rust-plug-in worden geïnstalleerd.
![VSCode Install Rust [9778]](https://tweakers.net/i/eBZdPq4MMnLYm7Nxe-MlX2lQDiY=/i/2004954612.png)
Atom
Een alternatieve optie is het gebruik van Atom in combinatie met ide-rust. Deze configuratie kost meer tijd dan de Visual Studio Code-omgeving.
Om de installatie van ide-rust compleet te maken, moet nog de rust-analyser worden geïnstalleerd. Dit is een modulaire frontend voor Rust.
![Install Rust Analyser [9778]](https://tweakers.net/i/lWJ5ONnjzXQR6v12tvZzSNYP5ys=/i/2004902950.png)
Tot slot moet het pad naar de executable 'rust-analyser.exe' worden toegevoegd aan Path, via het aanpassen van de omgevingsvariabelen.
![Set Environment Path [9778]](https://tweakers.net/i/BXbE3O_DZCI6Qp_bprL5kfqpy2Y=/980x/filters:strip_exif()/i/2004902956.png?f=imagearticlefull)
Door de installatie van de plug-in en rust-analyser is er een complete ontwikkelomgeving opgezet met zoeksuggesties: IntelliSense.
Aanmaken van een nieuw project
Een nieuw testproject 'Hello World' kan worden aangemaakt via Cargo. Cargo is de package manager van Rust en kan gebruikt worden voor het bouwen, draaien en beheren van Rust-projecten. Deze tool is standaard geïntegreerd in de toolchain-installer van Rust: rustup. Hiervoor is om deze reden geen extra installatie nodig. Het commando cargo new <project naam> --bin
kan worden uitgevoerd voor het aanmaken van een nieuw project.
![Cargo Create Project [9778]](https://tweakers.net/i/HXAUOtfNkKdAterr33D9C747Ffg=/i/2004902952.png)
Nadat je naar de projectfolder bent genavigeerd via cd RustHelloWorld
, kan het project uitgevoerd worden met cargo run
. Zoals hieronder weergegeven verschijnt dan 'Hello, world!' op het scherm.
![Rust Hello World [9778]](https://tweakers.net/i/JNUNTAwnnI5lEAspag-VN17iz0A=/i/2004902960.png)
Deze projectfolder kan in zijn geheel binnen Visual Studio Code of Atom worden geopend, zodat je wijzigingen in de code kunt aanbrengen op een toegankelijke manier.
![Atom Opened Rust Project [9778]](https://tweakers.net/i/kfGoHEQ8DKvVY3K8_-AWR-ZswQw=/i/2004902962.png)
In de praktijk
Er zijn veel toepassingen waarvoor Rust ingezet kan worden. Om een snelle start te maken met Rust, kun je kijken naar het framework Good Game Easily, of ggez. Dit is een lichtgewicht bibliotheek die onder andere implementaties levert voor 2d-graphics, audio, fonts en gebruikersinvoer. Een voordeel van deze bibliotheek zijn de verschillende bijbehorende voorbeelden, waarbij de mogelijkheden van dit framework naar voren komen.
Deze bibliotheek is uitermate geschikt voor het bouwen van (2d-) games, in verband met de aanwezigheid van hardwareacceleratie en geavanceerdere grafische opties (shaders). Hardwareacceleratie betreft het gebruik van specifieke hardware, bijvoorbeeld een grafische kaart, om taken sneller uit te kunnen voeren. Dit leidt tot minder energiegebruik en een hoger aantal frames per seconde.
Dit framework kan direct worden gedownload van de onderstaande link of via het versiebeheersysteem GIT.
![Git Clone Ggez [9778]](https://tweakers.net/i/KwtRvHpboLU-Y-7axkNdn-tsqhM=/656x/filters:strip_exif()/i/2004973072.png?f=imagenormal)
Na het binnenhalen van het framework kan een voorbeeldapplicatie gecompileerd en uitgevoerd worden. Een leuke optie is daarbij het spelletje Astroblasto, een compleet voorbeeld van de mogelijkheden van het gebruikte framework.
![Rust Run Astroblasto [9778]](https://tweakers.net/i/Cqc5q0NgDsi9t0zvNfsq52UI0qg=/656x/filters:strip_exif()/i/2004983862.png?f=imagenormal)
Na de invoer van het bovenstaande commando wordt het spel zichtbaar en geopend op het apparaat. In Astroblasto kan de speler rondvliegen met een schip en objecten vernietigen voordat die het eigen schip beschadigen. Daarbij wordt de invoer van het toetsenbord gekoppeld aan een actie van de speler, zoals vliegen, draaien of schieten. Intussen wordt hierbij audio afgespeeld.
![Rust Play Astroblasto [9778]](https://tweakers.net/i/BXFHMLD6aJgmoJtFQV48hUREIIY=/656x/filters:strip_exif()/i/2004983864.png?f=imagenormal)
De opzet van de game kenmerkt zich doordat deze relatief eenvoudig aangepast kan worden in de code, waarbij de basis van Astroblasto gevonden kan worden in '05_astroblasto.rs'.
Om de game eenvoudiger of moeilijker te maken, kunnen de levens van de speler en de omgeving worden gemanipuleerd op regels 73 tot en met 81.
![Rust Modify Astroblasto Lives [9778]](https://tweakers.net/i/LfaStr_k954ottjnJsCH4BrWSdw=/i/2005037854.png)
De snelheden van de speler, kogels en objecten kunnen eveneens aangepast worden. Deze kunnen worden aangepast op regels 159 tot en met 168.
![Rust Modify Astroblasto Speed [9778]](https://tweakers.net/i/NthEfFnXFCR_R6oMINerEzkg9sU=/656x/filters:strip_exif()/i/2005037856.png?f=imagenormal)
Bij het zoeken tussen de bronbestanden kunnen de plaatjes ook worden aangepast door het overschrijven van de afbeeldingen 'player.png', 'hot.png' en 'rock.png', die relevant zijn voor Astroblasto.
![Rust Modify Astroblasto Images [9778]](https://tweakers.net/i/G7PWNLQybEvdGjWrustbN0ogIfw=/656x/filters:strip_exif()/i/2005037858.png?f=imagenormal)
Het resultaat is een spel waarbij de speler op een statische (gecentreerde) positie de vijanden van het speelveld moet verwijderen.
![Rust Mod Astroblasto [9778]](https://tweakers.net/i/TVAs1U_zQHaoikiGGEk50d2OMW4=/656x/filters:strip_exif()/i/2004983866.png?f=imagenormal)
Doordat er al relatief veel bibliotheken en voorbeelden voor Rust bestaan, kan voldoende ondersteuning gevonden worden. Daarnaast bieden bestaande (opensource-) projecten een laagdrempelige methode om te experimenteren met Rust en zo ervaring op te doen. Voordat je het weet, kun je als Tweaker bugs oplossen.
Tot slot
Rust is een krachtige programmeertaal met veel mogelijkheden. Het aspect waarin Rust in het bijzonder uitblinkt, is de veiligheid, die vanuit de taal wordt geforceerd. De gevolgen voor de prestaties zijn daarbij minimaal. Rust is om deze reden een alternatief voor C++, die veel pijnpunten van deze taal aanpakt. Geheugenveiligheid wordt in Rust gegarandeerd door ownership. Dat vergt tijd om te leren, maar kan tijdens het programmeren voordelen bieden ten opzichte van relatief onveilige talen zoals C en C++.
Rust is in de afgelopen jaren flink in populariteit gestegen en de verwachting is dat die populariteit nog zal groeien. Er bestaan inmiddels diverse plug-ins voor editors, zoals Visual Studio Code en Atom, die ervoor zorgen dat het installatieproces beperkt blijft en er direct genoten kan worden van voordelen als het automatisch aanvullen van code. Een bijkomend voordeel is de hoeveelheid publieke bibliotheken en voorbeelden. Hierdoor zijn het instappen in de taal en experimenteren relatief makkelijk, hoewel sommige principes van de taal een steile leercurve hebben.
In dit artikel hebben we een eerste start beschreven om met Rust aan de slag te gaan. Er is veel materiaal online te vinden waarvan je kunt leren en waarmee je verder kunt experimenteren. Wellicht heb jij al een mooi product gemaakt met Rust of ga je daar in de toekomst mee aan de slag. Laat het ons en je medetweakers weten in de comments.