Rust è uno dei linguaggi di programmazione che si stanno più facendo largo tra appassionati e addetti ai lavori. Realizzato da Mozilla, Rust permette di programmare in ambiti diversi, garantendo un livello di sicurezza superiore a quello di C++ e di tanti altri competitor.
Uno degli elementi maggiormente distintivi di Rust (e più apprezzati dallo sviluppatore) è la sua natura di linguaggio memory safe. Un presupposto che permette di ridurre al minimo le vulnerabilità più diffuse figlie delle operazioni legate alla memoria.
Caratteristiche distintive di Rust, il linguaggio di programmazione di Mozilla
Shutterstock
Tutti sanno che Rust è un linguaggio di programmazione sviluppato da Mozilla Foundation: più precisamente dal reparto Research. Quello che però viene spesso ignorato, è che Rust è il frutto della volontà e l’impegno di un singolo dipendente.
Tutto nasce infatti dal progetto personale di Graydon Hoare. Poi, nel 2009, Mozilla nota la qualità del suo lavoro e decide di sostenerlo, arrivando ad annunciare Rust dopo neanche un anno.
Col passare del tempo e degli aggiornamenti, Rust ha aggiunto paradigmi, estensioni e tipizzazioni. Arrivando addirittura a una versione compilatore che ha compilato sé stesso.
Inoltre, per volontà di Mozilla, l’intero progetto è opensource. E dunque ha potuto contare sul supporto della comunità internazionale.
Non a caso in diverse occasioni Rust è stato premiato come uno dei linguaggi di programmazione più amati in assoluto. E in questo momento storico capita spesso che uno sviluppatore scelga di far migrare a Rust progetti realizzati con Go o C++.
Rust è un linguaggio memory safe, che tutela lo sviluppatore dalle vulnerabilità più comuni, permettendogli di programmare software sicuri
Le ragioni dietro questa scelta variano di caso in caso, ma in molti casi Rust viene scelto per la sua natura di linguaggio memory safe. Il problema delle vulnerabilità legate alla memoria è comune a molti linguaggi di programmazione.
Un linguaggio memory safe è un linguaggio progettato appositamente per provare a prevenire questo genere di vulnerabilità. O quanto meno per minimizzarle.
Gli errori più diffusi legati alla gestione della memoria sono legati ai riferimenti a dati non validi, piuttosto che ad accessi non legali alla memoria stessa.
Un linguaggio memory safe garantisce che le principali operazioni legate alla memoria siano controllate. E in questo modo riduce sensibilmente il rischio di errori critici: quelle problematiche che possono portare a vulnerabilità della sicurezza, o a crash completi del programma.
Grazie alle sue caratteristiche, Rust è in grado di tutelare uno sviluppatore dagli errori di programmazione più comuni. Mettendolo nella condizione di poter programmare software più stabili e meno esposti ad attacchi esterni.
Come è stato progettato Rust
Shutterstock
Rust è stato progettato da Mozilla per garantire un livello adeguato di prestazioni. Puntando sul controllo dell’allocazione di memoria e tenendo conto delle impostazioni dei programmi competitor: ad esempio C, C++ o Python.
Nei capoversi precedenti si è già parlato di come Rust garantisca una sicurezza mediamente superiore rispetto a quella di C++, per via della sua natura di linguaggio memory safe.
Allo stesso tempo C++ è (almeno ad oggi) più veloce di Rust. Soprattutto se si prendono in considerazione i tempi di compilazione, al di là della semplice esecuzione delle applicazioni.
Un altro elemento peculiare di Rust è l’allocazione di memoria. Il linguaggio di programmazione prevede infatti un numero di bit definito. Anche se lo sviluppatore ha la possibilità di definire l’allineamento.
Parallelamente Rust rinuncia alla cosiddetta garbage collection: la modalità che porta i sistemi operativi e i compilatori a liberare automaticamente determinati slot di memoria, nel momento in cui viene chiusa un’applicazione.
Dal punto di vista della sintassi e della programmazione, Rust presenta diversi elementi comuni ai linguaggi C e C++
In questo modo lo sviluppatore ha la possibilità di deallocare deterministicamente tutta la memoria a disposizione. Un processo reso possibile dall’intervento del compilatore ogni qual volta una variabile esca dal suo ambito di visibilità.
Dal punto di vista sintattico, Rust non è molto diverso dal linguaggio C. Entrambi racchiudono istruzioni o strutture all’interno di graffe. Lo stesso discorso vale per le parole chiave di controllo e per i diversi operatori logici o aritmetici.
Allo stesso tempo programmare con Rust è molto diverso da programmare con C o C++: soprattutto dal punto di vista della semantica. Il linguaggio infatti non consente l’ereditarietà di implementazione.
Al contrario le classi (struct) possono essere parametrizzate in maniera simile a come accade in C++. Con la differenza che in Rust i parametri devono essere vincolati ai cosiddetti trait: costrutti ispirati dal celebre linguaggio di programmazione Haskell.
Cosa si può programmare con Rust
Shutterstock
Rust può essere considerato un linguaggio di programmazione object-oriented, ma presenta diverse scelte progettuali caratteristiche, che lo rendono particolarmente interessante agli occhi di uno sviluppatore. Ad esempio permette di programmare il tempo di vita (lifetime) degli oggetti gestiti.
Così come permette di definire la loro proprietà (ownership) o il loro prestito (borrowing). Inoltre Rust non prevede l’esistenza delle metaclassi. E le stesse classi non sono dotate di eredità implicita a partire dall’interfaccia.
Questi presupposti aiutano a capire come mai Rust venga utilizzato in tanti ambiti differenti: a partire dallo sviluppo web, fino ad arrivare alle applicazioni server, l’implementazione di back-end o di interpreti TCP/IP.
Rust viene poi usato da tanti professionisti che stanno imparando a programmare videogiochi. Così come può contribuire allo sviluppo di interi sistemi operativi e al cosiddetto sviluppo embedded: la scrittura e la compilazione per target vari (ad esempio il core ARM Cortex-M) ricorrendo al codice binario.
Per saperne di più: I linguaggi di programmazione più usati