cromo La guida di Cromo
PDF EN

Appendice C: Cromo per chi programma in C++, Go e Rust

Cromo prende qualcosa da ciascuno di questi linguaggi. Questa appendice elenca, per ognuno, che cosa ti risulterà familiare e che cosa invece è diverso.

#Dal C++

Familiare: la sintassi, le graffe e i tipi prima dei nomi; le struct con costruttori, metodi, metodi const e distruttori; RAII e l'ordine di distruzione; le eccezioni con try, catch e throw; i generici compilati per ogni tipo, come i template; std::format per la formattazione.

Diverso:

C++Cromo
returnret
; alla fine delle istruzionila fine della riga
puntatori, nullptr, new, deleteniente puntatori e niente null; l'heap solo attraverso i contenitori
T&, const T&un parametro è in lettura per default; ref modifica; nessun riferimento al di fuori dei parametri
costruttori di copia, copie implicitecopy(), sempre esplicito per i tipi che possiedono risorse
std::movemove, controllato: una variabile spostata non può più essere usata
class, ereditarietà, virtualstruct e interfacce
template con qualsiasi tipogenerici vincolati da interfacce, controllati una volta sola
while, dofor (condition), for { }
switch con fall-throughniente fall-through; sugli enum ogni case va gestito
#include, headerimport di moduli; nessun preprocessore
int, long, size_ti32, i64, u64: dimensioni fisse; le lunghezze sono i64
comportamento indefinito per overflow e accessi fuori dai limitiun panic nelle build di debug; i limiti sono sempre controllati
variabili non inizializzateogni variabile ha il suo valore predefinito
std::thread, std::mutexthread.Thread, thread.Mutex<T> che contiene i suoi dati

#Da Go

Familiare: un solo strumento che compila, esegue, testa e formatta; task leggeri che si bloccano senza bisogno di async; i canali; una libreria standard per le reti e per HTTP; eseguibili statici con la cross-compilazione; e, quando arriveranno i pacchetti, dipendenze indicate dall'URL del loro repository, con la selezione della versione minima.

Diverso:

GoCromo
garbage collectorpossesso e distruttori; la memoria viene liberata quando finisce la vita del proprietario
go f()thread.Task o thread.Group, di cui il compilatore controlla le catture
deferdistruttori, e finally
valori error e if err != nileccezioni
nilniente null; ogni variabile ha un valore
x := 1i64 x = 1: il tipo si scrive sempre
iniziali maiuscole per i nomi esportatipublic
selectnon ancora
slice che condividono la memorialiste che possiedono i loro elementi; slice() crea una copia

#Da Rust

Familiare: il possesso controllato dal compilatore, lo spostamento come comportamento predefinito per i tipi che possiedono risorse, niente null, niente data race; gli enum con dati e il match esaustivo; i generici vincolati da interfacce, come i trait; LLVM; i test integrati nello strumento.

Diverso:

RustCromo
riferimenti con lifetime, il borrow checkerref solo per i parametri: un riferimento non sopravvive mai a una chiamata, e non ci sono lifetime
&T, &mut Tun parametro in lettura, un parametro ref
Clone, .clone()copy()
tipi Copytipi semplici: numeri, bool, struct composte solo da questi
Result<T, E> e ?eccezioni; enum con dati per i risultati che sono valori
Option<T>un valore convenzionale, un bool con un parametro ref, oppure un enum
match con patternswitch sui case, dando un nome ai dati; niente pattern annidati
Dropdistruttori
impl Trait for Typestruct Type : Interface, con i metodi dentro la struct
async/.awaittask che si bloccano, come in Go
Arc<Mutex<T>>thread.Mutex<T> catturato dai task che lo usano
macronon disponibili

#In breve

Cromo si scrive come il C++, gestisce la memoria come Rust ma con meno regole, ed esegue il codice concorrente come Go. Nel dubbio, vince la regola più semplice.