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