Rust, chi era costui?
Avevo già sentito nominare Rust come linguaggio di programmazione di sistema ma un colloquio al recente GuITmeeting a Roma, ha innescato la mia curiosità.
Tornato dallo splendido weekend romano tra passione storia e viaggio, ho consultato il sito ufficiale di Rust e la pagina corrispondente di Wikipedia.
Con questo post mostrerò i miei primi contatti con il linguaggio dopo aver letto il tutorial dal sito.
Installazione
Al momento, per Windows è disponibile un pacchetto pronto per l’installazione scaricabile dal sito ufficiale, ma per Linux o OS X è necessario compilare i sorgenti. L’operazione non è poi troppo difficile ma richiede un calcolatore con una discreta dotazione hardware (almeno 2GB di RAM), altrimenti si rischia di fare cosa “buona per riscaldare la stanza d’inverno” cit.
Per fortuna esistono un paio di repository su Launchpad da cui si possono installare le versioni del compilatore e degli strumenti necessari, adatti alla nostra versione di Ubuntu.
Per esempio quello di Hans Jørgen Hoel più aggiornato o quello di Kevin Cantu.
Io ho scelto quest’ultimo accontentandomi della versione 0.6 perché la mia Ubuntu è Lucid e nel primo repo non è presente la versione dedicata più recente: la 0.8. Ho installato Rust con i seguenti tre comandi:
$ sudo add-apt-repository ppa:kevincantu/rust $ sudo apt-get update $ sudo apt-get install rust
Prove
In Lua la keyword per definire una funzione è function, in Go è func ed in Rust è fn! Ecco quindi il classico Hello World!:
fn main() { println("Hello world!") }
Il sorgente inserito in un file di testo va compilato con il comando (presupponendo di chiamare il sorgente ‘hello.rs’):
$ rust build hello.rs
Altro piccolissimo esempio: implementiamo la funzione gradino che restituisce 1 se l’argomento è positivo, 0 se zero e -1 se negativo:
fn main() { println(signum(123).to_str()); } fn signum(x: int) -> int { if x < 0 { -1 } else if x > 0 { 1 } else { 0 } }
Perché manca il ‘return’?
In Rust l’istruzione condizionale if come gli altri costrutti del linguaggio, è un’espressione ciò significa che il condizionale produce un valore, che poi è preso come valore di ritorno della funzione.
Il simbolo del punto e virgola ; NON è il terminatore di riga necessario alla sintassi, ma bensì il modo per annullare l’espressione. In altre parole, con il punto e virgola istruiremo Rust a considerare l’espressione come uno statement. Il valore dell’espressione risulterà così non significativo.
Se infatti si inserisce il ; al termine del blocco dell’if (riga 12) si riceve questo errore:
0: 13:1 error: not all control paths return a value
La creazione di una variabile in Rust non è un’espressione, cioè in essa non viene restituito un valore ma viene compiuta un’azione. Ne segue che il ; finale risulta obbligatorio:
// creiamo una variabile intera let a = 1000; // ok let b = 2000 // error: expected `;`
Come avrete notato serve la chiave ‘let’ per creare una variabile (con la terminologia di Rust si dovrebbe dire: per creare uno slot), ma non è tutto.
Per default le variabili sono immutabili, ovvero non possono essere riassegnate. Solo aggiungendo il modificatore ‘mut’ la variabile diventa tale. In questo modo si deve esprimere nel codice cosa è destinato a cambiare, evitando errori:
let a = 1000; let mut b = 2000; a += 1; // error: re-assignment of immutable variable b += 1; // ok
Prime impressioni
Rust è un linguaggio di programmazione sviluppato sotto l’egida di Mozilla Foundation che mira a diventare un C/C++ migliore. Per questo si confronta con il Go che viene giudicato in un’intervista allo stesso Autore di Rust, un buon linguaggio.
Il Go può attrarre sviluppatori dal mondo Python/Ruby. Nonostante che Rust disponga di più strutture dati del Go, sembra essere più tecnico, meno semplice da imparare, e forse potenzialmente migliore. Staremo a vedere se finalmente un nuovo linguaggio sostituirà od almeno affiancherà il C, ancora oggi saldamente sul trono dal 1978.
Commenti
Molto interessante. Si sa perchè si prediligono le costanti (le variabili immutabili non sono che costanti) alle variabili?
Semplice. Se dichiari una variabile come immutabile il compilatore ti segnala l’errore se tenti di riassegnarla.
Comunque i manuali di Rust non parlano di costanti ma di variabili mutabili e immutabili.
Le costanti sono altri oggetti ancora definiti con la parola chiave static, ma nel tutorial ne parlano pochissimo.
R.
Quindi è funzionale, come “va di moda” adesso. Altra cosa di moda ritornare il risultato dell’ultima espressione valutata come il Lisp (l’ho detto!).
Tutto questo avendo letto solo questo post. E, confessione: Rust mi sembra intrigante! Chissà 😉
Si. Rust è funzionale ma anche procedurale ed ad oggetti… E concorrente.
Non è ancora semplice trovare documentazione.
Peró a differenza del Go gli utenti non hanno l’ingombrante presenza di uno dei colossi mondiali di internet.
R.
Interessante. Come programmatore hobbista (di molto basso livello) non riesco ad abituarmi alle “fisime” del C. Avevo già incrociato Go, ma anche questo Rust sembra interessante. Ma questi linguaggi con una user base sempre molto ristretta… E sempre questa sintassi C-like…
Il numero degli utenti di Rust decreterà o meno il suo successo.
Nell’ultimo anno molto lavoro è stato fatto sul linguaggio e sulla libreria standard e sembra quindi che abbia raggiunto un certo interesse.
Ma si tratta solo di un tentativo ovviamente, come risulta chiaro se si va a leggere le FAQ sul progetto.
Quanto alla sintassi C-like, penso sia una scelta corretta visto che Rust vuole essere un C migliore e gli sviluppatori arriverranno — forse — proprio dal C.
Del resto anche il Go ha una sintassi C-like…
E visto che anch’io sono un hobbista dilettante, posso permettermi di imparare Rust e sostituire Lua o Go per le mie necessità professionali.
R.
La sintassi C-like è una quasi necessità, tutti la conoscono e sono abituati a quella. Anche perché la gente trova spesso a ridire sulla migliore esistente, quella del Lisp.
Quando mi passa l’influenza magari ne scrivo qualcosa, mettendoci dentro anche Lua e Go.