Rust_anguage1_large

Introduzione al linguaggio Rust

Il ragazzo nuovo del quartiere

Rust continua a essere in cima alle classifiche dei linguaggi più ammirati e desiderati dagli sviluppatori. In questo articolo cercheremo di capire perché il linguaggio Rust, il “nuovo ragazzo del quartiere”, sta suscitando crescente interesse negli ambienti della programmazione di sistemi e non solo.

Ma innanzitutto una timeline per capire come è nato e come si è evoluto il linguaggio:

2006
Graydon Hoare inizia a lavorare ad un nuovo linguaggio di programmazione chiamato Rust, dalla “ruggine delle piante“, un fungo parassita della vegetazione.
June 16, 2010Primo commit git pubblico di Rust; Rust diventa un progetto Mozilla.
2015viene rilasciata la versione 1.0 di Rust ed il progetto diventa indipendente da Mozilla, anche se questi rimane il principale finanziatore del progetto.
11 Agosto 2020Mozilla annuncia una ristrutturazione ed il licenziamento di circa 250 persone, inclusi molti del team Rust, in parte dovuto agli effetti economici della pandemia da COVID-19.
8 Febbraio 2021Viene lanciata la Rust Foundation con il supporto di Amazon Web Services (AWS), Huawei, Google, Microsoft e Mozilla per evolvere il linguaggio Rust ed il suo ecosistema.
29 Aprile 2021Facebook aderisce alla Rust Foundation.

Piacere, Rust!

Rust è un linguaggio di programmazione statico e fortemente tipizzato che permette la scrittura di software performante ed affidabile. Il linguaggio pone infatti come principale obiettivo la scrittura di codice veloce ed esente da possibili problemi di allocazione di memoria. Problemi che invece sovente capitano quando si usa un linguaggio tradizionale, dovendo il programmatore gestire la deallocaziome della memoria manualmente. La grande differenza rispetto ad altri linguaggi è che Rust è sicuro per impostazione predefinita; tutti gli accessi alla memoria sono controllati.

Il linguaggio è progettato per rendere più difficile scrivere programmi afflitti da bug di memoria ed il sistema dei tipi implementato ne è la maggiore evidenza, come vedremo nel prosieguo, quando entreremo nel dettaglio dei meccanismi di “prestito” delle variabili. Rust è un linguaggio’ statico. Tutti i tipi sono noti al momento della compilazione.

L’uso elettivo di Rust è quindi quello di un linguaggio di programmazione “di sistema”, ovvero un linguaggio che permette la scrittura di software a basso livello. Ad esempio parti del sistema operativo o applicazioni e driver che interagiscono direttamente con l’hardware e necessitano di tempi di esecuzione misurabili. In questa categoria di linguaggi il nuovo arrivato si pone come contendente di C e C++.
Cionondimeno Rust permette una programmazione anche di alto livello, grazie alle sue peculiari caratteristiche di gestione della memoria e ad una forte tipizzazione, riuscendo in questo a coniugare le necessità dei due mondi: ergonomia e controllo.

L’uso elettivo di Rust è quindi quello di un linguaggio di programmazione “di sistema”

Le caratteristiche del linguaggio

Vediamo quindi in breve le caratteristiche salienti di questo linguaggio. Su ognuna di loro ritorneremo successivamente per approfondirne il significato.

  • Memory Safety: Rigoroso meccanismo di rispetto della sicurezza nel prendere in prestito i dati in memoria.
  • Performance: Rust è stato pensato per essere efficiente e veloce. Il linguaggio è ottimizzato per una programmazione a basso livello e viene compilato in codice nativo.
  • Manipolazione dei dati: Funzioni, metodi e closure per operare su tuple, strutture ed enum per aggregare i dati, pattern matching per selezionare e destrutturare i dati.
  • Traits: definizione del comportamento di tipi di dato mediante tratti (traits in inglese).
  • Cross-platform: permette di compilare il codice per diverse piattaforme, tra le quali Windows, Linux, and macOS.
  • Concorrenza: Rust, grazie ai concetti di ownership e prestito dei dati assicura che eventuali esecuzioni concorrenti che accedano agli stessi dati non generino condizioni di errore. Il linguaggio fornisce un supporto di prim’ordine alla programmazione concorrente.
  • Error Handling: Strong focus on explicit error handling
  • Sintassi: Modern, expressive syntax
  • Ecosistema: Growing ecosystem and package manager (Cargo)
  • Interoperabilità: Good interoperability with C code

Alcuni chiarimenti su cosa invece Rust non è :

  • Non è Object Oriented: Rust non dispone di costrutti atti a creare oggetti, nel senso proprio del termine, benchè tramite i traits si possa strutturare il codice in modo che i tipi di dato dispongano di “metodi” propri.
  • Non è facile: La curva di apprendimento di Rust risulta certamente più ripida di altri linguaggi (Java, C#, Python), ma comparabile con quella di linguaggi della stessa fascia (C e C++).

Rust è stato pensato per essere sicuro, efficiente e veloce. Il linguaggio fornisce un supporto di prim’ordine alla programmazione concorrente.

Installazione

Per iniziare a mettere le “mani in pasta” dobbiamo installare Rust localmente.
Per fortuna installare Rust è semplicissimo :

$ curl https://sh.rustup.rs -sSf | sh

Per iniziare, limitiamoci ad accettare i default e ad installare la versione stabile di Rust.

default host triple: x86_64-unknown-linux-gnu
default toolchain: stable (default)
profile: default
modify PATH variable: yes

1) Proceed with installation (default)
2) Customize installation
3) Cancel installation
>

In questo modo si ottengono il compilatore, il gestore di pacchetti Cargo, la documentazione delle API e il Rust Book.
Al termine un messaggio ci annuncia il completamento dell’installazione.

Rust is installed now. Great!

$ rustup component add rust-docs

rustup è il comando che si usa per gestire l’installazione di Rust.
Quando è disponibile una nuova versione stabile di Rust, sarà sufficiente scrivere rustup update per aggiornare l’installazione.

$ rustup update

rustup doc aprirà invece la documentazione offline nel browser di sistema.

$ rustup doc

La documentazione completa può essere inoltre trovata sul sito ufficiale di Rust alla pagina https://www.rust-lang.org/learn

Nel prossimo articolo

Parleremo di come Rust riesca a garantire la sicurezza dell’allocazione di memoria e quindi entreremo nel dettaglio dei meccanismi di Proprietà (Ownership), Prestito (Borrowing) e Vita (Lifetime) dei dati.