Rust: presentazione del moderno linguaggio di programmazione
Esistono già tanti linguaggi di programmazione, da C++ a Pascal a Java, eppure ne vengono sviluppati sempre di nuovi, che devono essere più semplici, più sicuri oppure più veloci. Il linguaggio di programmazione Rust soddisfa tutti e tre i requisiti allo stesso tempo e riscuote perciò grande successo. Secondo un sondaggio tra utenti e sviluppatori della piattaforma Stack Overflow nel 2019 Rust è stato il linguaggio di programmazione preferito da tutti.
Cos’è Rust?
Il linguaggio di programmazione Rust è stato sviluppato nel 2010 da Mozilla. All’inizio era considerato più che altro un passatempo per gli sviluppatori di Mozilla, che poi l’hanno utilizzato in modo concreto per sviluppare un nuovo motore di browser per Firefox. Nel frattempo si è evoluto in un progetto open source a cui lavora una community attiva, ma è sempre Mozilla a finanziare il progetto.
Il linguaggio di programmazione si muove tra i linguaggi a basso livello C e quelli più astratti come Java. Ma Rust è principalmente un linguaggio per la programmazione di sistema, vale a dire uno di quei linguaggi con cui realizzare sistemi operativi o applicazioni strettamente collegate a Windows, Linux o macOS. Allo stesso tempo, però, Rust viene utilizzato anche nella programmazione di applicazioni web, e quindi su un livello molto più basso.
Particolarità di Rust
Il più grande vantaggio di Rust rispetto agli altri linguaggi di programmazione risiede nella sicurezza, che si raggiunge, tra le altre cose, con la gestione degli errori. Se durante la compilazione si verifica un errore che non si riesce a riparare, si avvia la cosiddetta macro “panic!” corrispondente, che sistema il tutto e invia una notifica di errore per non provocare danni.
Anche la gestione del salvataggio promette sicurezza. Il vantaggio sta nel fatto che Rust raggiunge la “memory safety” senza un “garbage collector”. Negli anni, in molti linguaggi di programmazione, la memoria è stata un punto d'attacco molto amato dagli hacker. Se una memoria si riempie, lo comunica come errore al sistema evitando così di creare una falla da sfruttare. Un “garbage collector” fa in modo che gli oggetti non necessari non spariscano dal sistema. Tuttavia, questo rallenta l'esecuzione del codice. Il compilatore di Rust rende il “garbage collector” obsoleto. Questo perché, già durante la fase di compilazione, viene verificata l'eventuale possibilità di errori in memoria.
In questo caso, però, le elevate funzioni di sicurezza non compromettono le prestazioni. Rust è un linguaggio per la programmazione di sistema come C/C++ e garantisce anche la stessa velocità durante l'esecuzione. Questo è collegato da una parte alla rinuncia a un “garbage collector” e dall’altra al fatto che gli “zero cost abstractions” garantiscono un’elevata velocità per tutta la durata. Quest’espressione significa semplicemente che si può programmare in astrazione senza dover rinunciare alle prestazioni per questa comodità.
Quest’ultimo fattore rende Rust un mix tra i linguaggi di programmazione ad alto livello e a basso livello. Similmente a C/C++, Rust è molto vicino all’hardware, che garantisce un’elevata velocità, ma può essere programmato in modo relativamente semplice, come noto ai linguaggi ad alto livello.
Inoltre sia i principianti sia i programmatori più avanzati possono orientarsi con Rust. Per quel che riguarda il suo utilizzo, il linguaggio si differenzia di poco dalle sue note alternative. Un grosso vantaggio risiede però nell’impegno con cui sono state concepite le notifiche di errore. Se altri linguaggi di programmazione comunicano solo gli errori criptici, Rust trasmette segnalazioni utili e significative su come riparare l'errore.
Rust è un linguaggio di programmazione fortemente supportato da WebAssembly. Per questo Rust si rivela utile anche per sviluppare applicazioni veloci per il web.
Sintassi di Rust con esempio
La sintassi di Rust, a prima vista, è molto simile a quella di C o C++, altri linguaggi per la programmazione di sistema. Come accade con questi, anche con Rust si lavora con funzioni, cicli, richieste, costanti e variabili. La posizione delle parentesi può variare, come sappiamo dai linguaggi più datati, ma il principio rimane lo stesso. Naturalmente Rust ha le sue particolarità:
- Il comando “fn” definisce le nuove funzioni.
- Il linguaggio lavora con macro, contrassegnate da un punto esclamativo alla fine della funzione.
- Le variabili si definiscono con “let”. La modifica dei dati richiede il consenso esplicito con “mut”.
- Rust ha una concezione particolare di Ownership.
Nella sintassi di Rust, con Ownership s’intende il rapporto di una variabile con il suo valore. La particolarità sta nel fatto che un valore preciso può appartenere a una sola variabile. Se si trasmette il valore, la variabile non è più disponibile.
fn main() {
let hello = String::from("Hello, world!");
let hello1 = hello;
println!("{}", hello);
}
Questo codice non può funzionare così: il contenuto di “hello” è stato trasmesso a “hello1” e perciò non può più essere invocato nella macro. Al suo posto bisogna integrare la nuova variabile nell’ultimo comando per ottenere un risultato corretto.
fn main() {
let hello = String::from("Hello, world!");
let hello1 = hello;
println!("{}", hello1);
}
Rust offre più sicurezza, prestazioni maggiori e un utilizzo più semplice. Ciononostante il linguaggio di programmazione non prende una strada del tutto nuova, ma si costruisce su elementi già noti per esempio da C/C++, offrendo però nuove interessanti caratteristiche. Soprattutto quando si è già pratici con gli altri linguaggi, il passaggio a Rust non è per nulla difficile.
Chi vuole cimentarsi con il moderno linguaggio di programmazione, può trovare nel nostro tutorial di Rust i primi passi da seguire.