Note su Rust 1.0.0 alpha

In questo periodo apprezzo molto MeteorJS, tuttavia un altro progetto molto interessante sta raggiungendo la fatidica versione 1.0.0: Rust.

Cos’é Rust

Rust è un linguaggio di programmazione di “basso livello”, definito anche “di sistema”. Tanto per capirci ha l’ambizione di soppiantare C/C++ nonostante sia simile a un linguaggio dinamico di alto livello (Ruby, Python, Javascript).

Inoltre ha dei costrutti moderni per gestire la concorrenza (come Go/Golang), è funzionale e molto altro. A quanto pare si può usare Rust sia per scrivere kernel e driver, ma anche per fare dei framework web performanti (anche se è ancora presto).

Non mi dilungo, vi lascio con questi post [1][2], la documentazione ufficiale e questo contatore multithread che ha come unico scopo quello di spremere un po’ i core della vostra inutilizzata cpu multicore e restituire un risultato consistente.

Come nota negativa, attualmente siamo a Rust versione rustc 1.0.0-dev e pare che ci siano ancora diverse API “ballerine”, nel senso che nel giro di qualche settimana il vostro codice potrebbe non compilare più.
Fortunatamente, la documentazione e gli errori forniti sono sempre allineati e con poco sforzo dovreste riuscire a sistemare. In questo caso rimangono dei warning perché le API che ho usato sono ancora instabili e quindi viene segnalato, rimando ulteriori riflessioni al rilascio di Rust 1.0.0 stabile (Roadmap).

❯❯❯ rustc rust_counter_atomics.rs
rust_counter_atomics.rs:12:26: 12:41 warning: use of unstable item: awaiting int/uint conventions, types may change, #[warn(unstable)] on by default
rust_counter_atomics.rs:12   let counter = Arc::new(AtomicUint::new(0));
                                                    ^~~~~~~~~~~~~~~
rust_counter_atomics.rs:14:12: 14:17 warning: use of unstable item: will be replaced by range notation, #[warn(unstable)] on by default
rust_counter_atomics.rs:14   for _ in range(0us, NUM_THREADS) {
                                      ^~~~~
rust_counter_atomics.rs:17:16: 17:21 warning: use of unstable item: will be replaced by range notation, #[warn(unstable)] on by default
rust_counter_atomics.rs:17       for _ in range(0us, NUM_INCREMENTS) {
                                          ^~~~~
rust_counter_atomics.rs:18:17: 18:38 warning: use of unstable item: awaiting int/uint conventions, types may change, #[warn(unstable)] on by default
rust_counter_atomics.rs:18         counter.fetch_add(1, Relaxed);
                                           ^~~~~~~~~~~~~~~~~~~~~
rust_counter_atomics.rs:20:7: 20:19 warning: unused result which must be used, #[warn(unused_must_use)] on by default
rust_counter_atomics.rs:20       tx.send(());
                                 ^~~~~~~~~~~~
rust_counter_atomics.rs:16:5: 16:18 warning: use of unstable item: may change with specifics of new Send semantics, #[warn(unstable)] on by default
rust_counter_atomics.rs:16     Thread::spawn(move || {
                               ^~~~~~~~~~~~~
rust_counter_atomics.rs:24:12: 24:17 warning: use of unstable item: will be replaced by range notation, #[warn(unstable)] on by default
rust_counter_atomics.rs:24   for _ in range(0us, NUM_THREADS) { rx.recv(); }
                                      ^~~~~
rust_counter_atomics.rs:24:38: 24:48 warning: unused result which must be used, #[warn(unused_must_use)] on by default
rust_counter_atomics.rs:24   for _ in range(0us, NUM_THREADS) { rx.recv(); }
                                                                ^~~~~~~~~~
❯❯❯ ./rust_counter_atomics
200000000