Salta ai contenuti

Introduzione a Rust

Rust è un linguaggio di programmazione di sistema, cioè del tipo che useresti per gli stessi lavori di C o C++: sistemi operativi, motori di gioco, browser, database e strumenti da riga di comando, dove contano velocità e controllo.

La sua particolarità è che ti dà quelle prestazioni di basso livello senza le classiche trappole. In C è facile leggere per sbaglio memoria già liberata o scatenare una data race (due thread che modificano gli stessi dati nello stesso momento). In Rust, codice del genere di solito non compila nemmeno: il compilatore ti ferma prima.

Rust è nato come progetto personale di Graydon Hoare, che in seguito lo ha portato in Mozilla per farlo sponsorizzare, ed è arrivato alla versione stabile 1.0 nel 2015. Oggi è mantenuto dalla Rust Foundation (in inglese) e da una grande comunità open source.

Storicamente dovevi scegliere tra due compromessi:

  • Linguaggi di basso livello (C, C++): veloci e vicini all’hardware, ma la memoria la gestisci tu a mano. Gli errori portano a crash e falle di sicurezza.
  • Linguaggi di alto livello (Python, Java, Go): sicuri e semplici, ma si appoggiano a un garbage collector, che costa in prestazioni e prevedibilità.

La grande idea di Rust è una terza strada: garantisce la sicurezza della memoria in fase di compilazione grazie a un sistema chiamato ownership (possesso), che imparerai più avanti in questo corso. Niente garbage collector, niente free() manuale: è il compilatore a capire quando la memoria non serve più.

Una mappa approssimativa di dove si colloca Rust rispetto ai linguaggi che forse conosci:

Linguaggio Velocità Sicurezza della memoria Garbage collector
C / C++ Veloce Manuale, soggetta a errori No
Go Buona Sicura Sì
Python Più lento Sicura Sì
Rust Veloce Sicura (controllata in compilazione) No

In sintesi: Rust punta alla velocità del C e alla sicurezza dei linguaggi di alto livello, tutte e due insieme. Per un confronto più da vicino, con codice vero affiancato, guarda Rust vs C++, Go e Python.

Probabilmente stai già usando Rust senza saperlo:

  • Firefox: parti del suo motore di rendering sono scritte in Rust
  • Cloudflare e Discord: servizi di backend dove le prestazioni sono critiche
  • Il kernel Linux: ora accetta driver scritti in Rust
  • Strumenti da riga di comando: preferiti velocissimi come ripgrep (in inglese), bat e fd
  • WebAssembly: Rust è una delle scelte migliori per eseguire codice a velocità nativa nel browser

Non devi ancora capire ogni dettaglio: nota solo quanto è leggibile:

fn main() {
let name = "Rustacean";
println!("Ciao, {name}!");
}

Output:

Ciao, Rustacean!
▶ Provalo tu

«Sicurezza della memoria» suona astratto, quindi ecco un caso concreto. Supponi di avere una lista di tre punteggi e di chiedere il decimo, che non esiste.

In C si può fare. Il programma legge in silenzio qualunque cosa si trovi in memoria dopo la tua lista. Potresti ottenere un numero a caso, un crash o una falla di sicurezza, e niente ti avvisa.

Rust non lascia correre. Se il compilatore vede l’errore, si rifiuta di compilare il programma:

fn main() {
let scores = [90, 85, 77];
println!("{}", scores[9]);
}
error: this operation will panic at runtime
--> src/main.rs:3:20
|
3 | println!("{}", scores[9]);
| ^^^^^^^^^ index out of bounds: the length is 3 but the index is 9

Il messaggio (in inglese, come tutti quelli del compilatore) dice che questa operazione andrebbe in panic durante l’esecuzione: l’indice 9 è fuori dai limiti, perché la lunghezza è 3.

E quando non sei sicuro che un elemento esista, Rust ti dà un modo educato per chiederlo. .get() risponde «eccolo» oppure «non c’è niente» (None), invece di restituirti dati spazzatura:

fn main() {
let scores = [90, 85, 77];
println!("primo punteggio: {}", scores[0]);
println!("decimo punteggio: {:?}", scores.get(9));
}

Output:

primo punteggio: 90
decimo punteggio: None
▶ Provalo tu

Non preoccuparti ancora di [...], .get() o None. Li imparerai per bene in Array e Option. Per ora conta questo: un’intera classe di bug del tipo «leggo memoria che non dovrei» viene bloccata prima che il programma parta, oppure gestita in modo sicuro mentre gira.

Risposta onesta: la prima o le prime due settimane possono essere frustranti. Concetti come ownership (possesso) e borrowing (prestito) sono davvero nuovi, e il compilatore rifiuterà codice che secondo te dovrebbe funzionare. Ma quell’attrito è il compilatore che ti insegna a scrivere codice più sicuro, e tutto va a posto prima di quanto la maggior parte delle persone si aspetti.

Questo corso è pensato per rendere la salita più dolce: piccoli passi, esempi reali e un pulsante Provalo tu dappertutto.

Modifica il programma del «primo assaggio» in modo che saluti te per nome, e aggiungi una seconda riga che dica Benvenuto in Rust!. Suggerimento: ogni println! stampa una riga, quindi te ne servono due.

Mostra la soluzione
fn main() {
let name = "Sam";
println!("Ciao, {name}!");
println!("Benvenuto in Rust!");
}

Output:

Ciao, Sam!
Benvenuto in Rust!
▶ Provalo tu

Salva la parola Rust e l’anno 2015 in due nomi, poi stampa la frase Rust 1.0 è uscito nel 2015. usandoli entrambi. Suggerimento: puoi mettere più di un {name} nello stesso println!.

Mostra la soluzione
fn main() {
let language = "Rust";
let year = 2015;
println!("{language} 1.0 è uscito nel {year}.");
}

Output:

Rust 1.0 è uscito nel 2015.
▶ Provalo tu
  • Rust è un linguaggio di sistema veloce e sicuro: velocità da C, niente garbage collector.
  • Previene i bug di memoria in fase di compilazione grazie all’ownership.
  • Si usa in browser, kernel, servizi cloud, strumenti da riga di comando e WebAssembly.
  • La curva di apprendimento c’è, ma è breve: il compilatore è dalla tua parte.

Prossimo passo: installare Rust ed eseguire il tuo primo programma sul tuo computer.

Verifica veloce

1. Come ottiene Rust la sicurezza della memoria senza garbage collector?

2. Secondo la tabella di confronto, cosa hanno in comune Rust e Go?

3. Come si chiamano tra loro gli sviluppatori Rust?

Punteggio: 0 / 3

  • Introduction — The Rust Book (in inglese): a chi si rivolge il libro ufficiale e come è organizzato. È il miglior compagno gratuito di questo corso.
  • rust-lang.org: la home page ufficiale in italiano, con i motivi per scegliere Rust (prestazioni, affidabilità, produttività) e le storie delle aziende che lo usano.
  • Impara Rust: l’elenco ufficiale delle risorse per imparare, tra cui Rust by Example e gli esercizi Rustlings.
  • Announcing Rust 1.0 — Rust Blog (in inglese): l’articolo del 2015 che ha dichiarato Rust stabile, e cosa promette la «stabilità» per il tuo codice.
  • Rust Foundation (in inglese): l’organizzazione no-profit che sostiene il progetto Rust e chi lo mantiene.