Al Summit sulle Tecnologie Open Source (Open Source Technology Summit - OSTS) recentemente svoltosi , ingegnere principale di Intel, ha discusso dell'interesse della sua azienda per un futuro in cui Rust raggiunga il "parità" con il linguaggio C, che continua a dominare nel campo dello sviluppo sistemico e a basso livello. intitolato «Intel e Rust: il futuro della programmazione di sistema» ha analizzato la storia della programmazione di sistema, come il C sia diventato il linguaggio di programmazione di sistema "per difetto", quali vantaggi offre Rust rispetto al C e come in futuro potrebbe sostituire completamente il C in questo ambito di programmazione.

La programmazione di sistema è lo sviluppo e la gestione di software che funge da piattaforma per la creazione di applicazioni, garantendo l'interazione delle ultime con il processore, la memoria, i dispositivi di input/output e l'hardware di rete. Il software di sistema crea un'astrazione speciale sotto forma di interfacce, che aiutano a creare software applicativo senza dover scendere nei dettagli di come funziona effettivamente l'hardware.
Triplet stesso definisce la programmazione di sistema come "tutto ciò che non è un'applicazione". Essa comprende cose come BIOS, firmware, bootloader e kernel dei sistemi operativi, vari tipi di codice integrato di basso livello, nonché implementazioni di macchine virtuali. È interessante notare che Triplet considera anche il browser web come software di sistema, poiché il browser è diventato molto più di "semplice programma", trasformandosi in una vera e propria "piattaforma per siti web e applicazioni web".
In passato, la maggior parte dei programmi di sistema, compresi BIOS, bootloader e firmware, erano scritti in linguaggio assembly. Negli anni '60 iniziarono esperimenti per fornire supporto hardware ai linguaggi di alto livello, che portarono alla creazione di linguaggi come PL/S, BLISS, BCPL e ALGOL 68.
Successivamente, negli anni '70, Dennis Ritchie creò il linguaggio di programmazione C per il sistema operativo Unix. Sviluppato a partire dal linguaggio di programmazione B, che non aveva nemmeno il supporto per la tipizzazione, C era ricco di potenti funzionalità di alto livello, che si adattavano perfettamente alla scrittura di sistemi operativi e driver. Diverse componenti di UNIX, incluso il suo kernel, furono infine riscritte in C. Successivamente, molti altri programmi di sistema, inclusa la base di dati Oracle, gran parte del codice sorgente di Windows e il sistema operativo Linux, furono anch'essi scritti in C.
C ha ricevuto un grande sostegno in questo ambito. Ma cosa ha spinto gli sviluppatori a passare a questo linguaggio? Triplet ritiene che, per motivare gli sviluppatori a cambiare linguaggio di programmazione, quest'ultimo debba innanzitutto offrire nuove funzionalità senza compromettere le capacità esistenti.
Innanzitutto, il linguaggio deve presentare nuove funzioni "abbastanza impressionanti". "Non può essere solo un po' migliore. Deve essere significativamente migliore per giustificare gli sforzi e il tempo che gli ingegneri devono investire per il passaggio", spiega. Rispetto al linguaggio assembly, C poteva offrire molte cose. Supportava, in qualche misura, la tipizzazione sicura, garantiva una migliore portabilità e prestazioni con costrutti di alto livello, e generava in generale codice molto più leggibile.
In secondo luogo, il linguaggio deve garantire il supporto delle funzionalità legacy, il che significa che nella transizione verso C, gli sviluppatori dovevano essere certi che fosse altrettanto funzionale del linguaggio assembly. Triplett spiega: «Un nuovo linguaggio non può essere semplicemente migliore, deve anche essere almeno uguale». Oltre a essere più veloce e supportare qualsiasi tipo di dato utilizzato dal linguaggio assembly, C aveva anche quello che Triplett definì «un'uscita di emergenza», ossia permetteva l'inserimento di codice in assembly al suo interno.

Triplett ritiene che C stia diventando ciò che l'assembly era molti anni fa. «C è il nuovo assembly», afferma. Ora gli sviluppatori cercano un nuovo linguaggio di alto livello che non solo risolva i problemi accumulati in C, problemi che non possono più essere corretti, ma che offra anche nuove e interessanti funzionalità. Un tale linguaggio deve essere abbastanza convincente da indurre gli sviluppatori a migrarvi, deve essere sicuro, garantire la gestione automatica della memoria e molto altro.
«Qualsiasi linguaggio che desideri essere migliore del C deve offrire molto di più della semplice protezione contro il buffer overflow, se vuole davvero diventare un'alternativa convincente. Gli sviluppatori sono interessati alla facilità d'uso e alle prestazioni, a scrivere codice che non richiede spiegazioni e che svolge più lavoro con meno righe. È anche fondamentale affrontare i problemi di sicurezza. La semplicità d'uso e le prestazioni sono indissolubilmente legate. Meno codice devi scrivere per raggiungere un obiettivo, minori sono le possibilità di commettere errori legati alla sicurezza», spiega Triplett.
Confronto tra Rust e C
Nel 2006, Graydon Hoare, un collaboratore di Mozilla, iniziò a scrivere Rust come progetto personale. Nel 2009, Mozilla iniziò a sponsorizzare lo sviluppo di Rust per le proprie esigenze e ampliò il team per ulteriori sviluppi del linguaggio.
Uno dei motivi per cui Mozilla si è interessata a un nuovo linguaggio è che Firefox è stato scritto in oltre 4 milioni di righe di codice C++ e presentava un numero significativo di vulnerabilità critiche. Rust è stato progettato tenendo conto della sicurezza e del parallelismo, rendendolo la scelta ideale per riscrivere molti componenti di Firefox nell'ambito del progetto Quantum, volto a una completa riprogettazione dell'architettura del browser. Inoltre, Mozilla utilizza Rust per sviluppare Servo, un motore di rendering HTML che in futuro sostituirà l'attuale motore di rendering di Firefox. Molte altre aziende hanno iniziato a utilizzare Rust per i loro progetti, tra cui Microsoft, Google, Facebook, Amazon, Dropbox, Fastly, Chef, Baidu e molte altre.
Rust affronta uno dei problemi più importanti del linguaggio C: offre una gestione automatica della memoria, eliminando la necessità per gli sviluppatori di allocare e poi liberare manualmente la memoria per ogni oggetto nell'applicazione. Ciò che distingue Rust da altri linguaggi moderni è l'assenza di un garbage collector, il quale rimuove automaticamente gli oggetti non utilizzati dalla memoria, e di un ambiente di esecuzione come il Java Runtime Environment per Java. Invece, Rust integra concetti di proprietà, prestiti, riferimenti e durata. "In Rust esiste un sistema di dichiarazione delle chiamate agli oggetti, che permette di indicare se un oggetto è posseduto o è semplicemente in prestito. Se si sta solo prendendo in prestito un oggetto, il compilatore monitorerà la situazione e garantirà che l’originale rimanga intatto fino a quando ci si fa riferimento. Inoltre, Rust si assicurerà che l'oggetto venga rimosso dalla memoria subito dopo il suo utilizzo, inserendo la chiamata appropriata nel codice durante la compilazione, senza costi aggiuntivi," racconta Triplett.
L'assenza di un proprio ambiente di esecuzione può essere vista come un aspetto positivo di Rust. Triplet afferma che i linguaggi eseguiti tramite di esso sono difficili da utilizzare come strumenti per la programmazione di sistema. Come spiega: «Devi inizializzare questo ambiente di esecuzione prima di poter chiamare qualsiasi codice, devi utilizzare questo ambiente di esecuzione per invocare le funzioni, e l'ambiente stesso può eseguire codice aggiuntivo alle tue spalle in momenti inaspettati».
Inoltre, Rust mira a garantire una programmazione parallela sicura. Le stesse funzionalità che lo rendono sicuro per la memoria tracciano cose come a quale thread appartiene un determinato oggetto e quali oggetti possono essere scambiati tra i thread e quali necessitano di blocchi.
Tutte queste caratteristiche rendono Rust abbastanza convincente affinché gli sviluppatori lo scelgano come nuovo strumento per la programmazione di sistema. Tuttavia, per quanto riguarda i calcoli paralleli, Rust è ancora un po' indietro rispetto al C.
Triplet intende creare un gruppo di lavoro speciale dedicato all'implementazione in Rust delle funzioni necessarie affinché possa eguagliare, superare e sostituire C nel campo della programmazione di sistema. In , relativo alla sua presentazione, ha detto che «il gruppo FFI/C Parity è in fase di creazione e non ha ancora iniziato a lavorare», ma è disponibile a rispondere a qualsiasi domanda e in futuro pubblicherà sicuramente piani di sviluppo per Rust nell'ambito della sua iniziativa per tutti gli interessati.
Si può ipotizzare che, in primo luogo, il gruppo FFI/C Parity si concentrerà sul miglioramento del supporto per il multithreading in Rust, sull'implementazione del supporto per BFLOAT16, un formato di rappresentazione dei numeri in virgola mobile introdotto nei nuovi processori Intel Xeon Scalable, e sulla stabilizzazione delle inserzioni di codice in Assembly.
Fonte: 3dnews.ru
