Komme i gang med Rust

Reidar Sollid

Hvorfor Rust?

Trenger vi virkelig et nytt programeringsspråk ?

Nei, vi trenger egentlig ikke et nytt programmeringsspråk, men vi trenger en minnemodell som fungerer.

Rydd etter deg

C og C++ sine minnemodeller er tanken at man skal rydde opp etter seg etter bruk, dette har vist seg å fungere dårlig. Det er stort sett bare en garanti med C og C++ og det er at det alltid er minnelekasje.

Dette resulterer igjen at vi må restarte server, mobiler etc når de går tomme for minne. Store selskaper har egne team som bare driver med dette.

Vi rydder for deg

Java og .Net med venner, har garbage collector, tanken er at den skal rydde etter deg. Problemet her er jo at vi må stoppe verden for at GC skal kjøre.

Store selskaper har egne team som bare driver med GC, tuner GC og ruter trafikk til server som ikke kjører GC.

Rydd opp mens du holder på

Compileren til Rust tvinger deg til å rydde etter deg, ellers får du ikke compilert. Alt er compile-time, så får du compilert så kjører det.

Hvordan kommer jeg i gang med Rust

Ok, først og fremst så trenger du Rust compileren og byggesystemet til Rust, alt dette kommer i en pakke.

Vi bruker rustup og anbefaler det på det varmeste.

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

Og når vi skal oppgradere, bruker vi bare:

rustup upgrade

Rustup fikser alle avhengiger i tooling osv, for oss.

Cargo

Cargo er så langt det beste byggesystemet jeg har vært borti, og jeg har prøvd en del. Cargo følger mer Rust og de to er som ett.

Din første Rust app

Ja, det blir selvsagt Hello World.

cargo new hello_world

Default for cargo new er applikajson, for å lage bibliotek legger du på --lib

cargo new mitt_biblio --lib

Cargo genererer katalogen hello_world som inneholder Cargo.toml og en src katalog med hello_world.rs for deg.

Plantuml Diagram

Cargofila di ser da noe sånt ut.

[package]
name = "hello_world"
version = "0.1.0"
edition = "2021"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]

Hello world

Den genererte hello_world.rs har en interessant feature og det er println! hvor ! på slutten, forteller oss at det er en makro.

fn main(){
    // utropstegnet forteller oss at det er en macro
    println!("Hello, world");
}

For å kjøre den, bruker vi cargo

$cargo run
   Compiling hello_world v0.1.0 (/home/reidars/github/rustblogg/hello_world)
    Finished dev [unoptimized + debuginfo] target(s) in 0.89s
     Running `target/debug/hello_world`
Hello, world!

Hello world uten makro, går også an, her er ett eksempel på det.

use std::io::Write;

fn main() {
    std::io::stdout().write(b"Hello, world!\n").unwrap();
}

Som du ser, så hjelper makroene i Rust deg med mye, det er litt rart til å begynne med, men du blir nok veldig glad i de etterhvert.

#![feature(prelude_import)]
#[prelude_import]
use std::prelude::rust_2021::*;
#[macro_use]
extern crate std;
fn main() {
    {
        ::std::io::_print(::core::fmt::Arguments::new_v1(
            &["Hello world\n"],
            &match () {
                () => [],
            },
        ));
    }
}