hoe begin je best te coderen in rust?

volg onze best practices!

Na het lezen van onze vorige artikels over de voordelen van Rust en Rust in Embedded Systems, heb je besloten dat je ook met deze programmeertaal aan de slag wilt. Er is maar 1 ding dat je tegenhoudt: de gedachte aan die gigantische berg werk die je zal moeten verzetten wanneer je al je code wilt migreren naar Rust…

Gelukkig hebben wij goed nieuws voor je! Een van de grootste voordelen aan Rust, is dat je niet onmiddellijk al je oude code hoeft te migreren naar deze taal. Rust valt perfect te combineren met bijvoorbeeld C, dus je kan beginnen met de meest belangrijke/foutgevoelige code en zo rustig aan verder werken tot al je code gemigreerd is. Klinkt goed, toch?

van c naar rust.

Stel nu: al je code is vandaag geschreven in C, en je wilt migreren naar een Rust omgeving. Hoe begin je daar aan?

Eerst en vooral: ga zéker niet al je miljoenen lijnen code herschrijven. Dat is een titanenwerk waar niemand tijd voor heeft. Begin met kritieke software. Deze kan je omzetten in Rust en gemakkelijk integreren met je C software. 

Natuurlijk is er wel een catch... C code is inherent ‘onveilig’: je zal dus niet zomaar een 1 op 1 mapping kunnen doen van je C code naar Rust code zonder aanpassingen te maken in verband met geheugenveiligheid. En veiligheid is vaak net de grootste reden waarom developers willen migreren naar Rust.

het c2rust project.

Begin je toch aan het vertalen of omzetten van lijnen code van C naar Rust, dan zijn er gelukkig enkele handige tools die je daarbij kunnen helpen. Denk bijvoorbeeld aan c2rust. C2rust is een project van Galois en Immunant: deze tool vertaalt C modules naar semantisch gelijkaardige code in Rust. Dat kan dienen als eerste stap in het proces om veilige Rust code te bekomen.

Om C files te vertalen naar Rust files met c2rust, zal je de c2rust tool moeten uitvoeren met het transpile subcommando samen met het compile_commands.json bestand. Dat bestand kan je genereren met cmake door middel van het volgende commando:

cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=1

Van daaruit krijg je een compile_commands.json file. Je vertaalt de C code naar Rust met het commando: 

c2rust transpile path/to/compile_commands.json

De Rust files die je uiteindelijk krijgt, zien er net iets anders uit dan normale Rust modules. Ze exporteren en importeren functies via de C API. Uiteindelijk kunnen deze modules worden samengevoegd in een statische Rust library of binary. Het handige hier is dat de functionaliteit behouden blijft en test cases blijven slagen. De vertaalslag van gegenereerde Rust code naar veilige en idiomatische Rust code blijft een manuele stap.

bindgen.

Naast C code vervangen door Rust code, kan je ook beide talen laten interfacen met elkaar. Via de handige bindgen tool kunnen developers snel en efficiënt boilerplate code genereren om Rust functies te gebruiken in een C omgeving (en omgekeerd).

Bindgen maakt het bijvoorbeeld relatief gemakkelijk om een driver binary blob van een silicon vendor met een C interface te gebruiken, en ermee te interageren vanuit Rust code.

2 women and a man sitting behind their computers at a desk.

onderhoud.

Voor het onderhoud van hun Rust omgeving, gebruiken de meeste developers de tool Cargo. Cargo is de package manager van Rust, en downloadt, compileert, distribueert en uploadt Rust packages.

Omdat het ecosysteem van Rust nog niet zo uitgebreid is als dat van andere talen, heeft de taal ook nog niet zo veel libraries (of crates). Leden van de Rust community voegen dagelijks nieuwe crates toe aan crates.io. Cargo en crates.io zorgen er dan weer samen voor dat developers deze zonder al te veel problemen kunnen incorporeren in hun project.

Bovendien zijn er nog andere handige tools zoals Rust Clippy, die veelvoorkomende fouten in je Rust code kan opmerken waardoor je uiteindelijk betere Rust code zal bekomen.

Voel je dat je nog wat hulp nodig hebt bij je migratie naar Rust? Neem dan snel contact op met onze Rust-expert Devon, dan bekijken we samen wat we voor je kunnen doen.

over de auteur

devon kerkhove

project manager

Elke dag meewerken aan de (onzichtbare) technologie van morgen, samen met onze klanten, da’s waar we het voor doen. Gebeten door embedded systems, gebrand om te innoveren.