Come Google personalizza la libreria standard C++ per le proprie esigenze
Immaginate di scrivere codice per sistemi che elaborano miliardi di richieste. La libreria standard C++ (STL) è buona, ma a volte la sua universalità diventa un collo di bottiglia. Da qualche parte manca la performance delle tabelle hash, da qualche altra parte manca una comoda gestione delle date, e alcune funzionalità dei nuovi standard C++20 o C++23 che vorreste usare subito, senza aspettare gli aggiornamenti del compilatore su tutti i server.
È esattamente così che è nato Abseil. Non è un sostituto della STL, ma un'estensione che Google utilizza nei suoi progetti interni come Search, Ads e Maps. Gli sviluppatori hanno semplicemente preso il codice provato nel corso degli anni e lo hanno rilasciato come open source.
Cosa c'è dentro questo coltellino svizzero
Se date un'occhiata al repository abseil-cpp, troverete decine di librerie. Ma io evidenzierò quelle che cambiano davvero lo sviluppo quotidiano.
Swiss Tables: quando std::unordered_map è troppo lento
In Abseil ci sono le famiglie di container absl::flat_hash_map e absl::flat_hash_set. Google le chiama "Swiss tables". A differenza del normale std::unordered_map, che utilizza liste collegate per la risoluzione delle collisioni, Abseil utilizza l'indirizzamento aperto e istruzioni SIMD per la ricerca. In pratica, questo fornisce un notevole incremento di velocità e un risparmio di memoria grazie a una migliore località della cache.
Gestione intelligente delle stringhe
La libreria strings è una manna per chi è stanco di scrivere boilerplate per compiti base. Ad esempio, absl::StrCat e absl::StrAppend funzionano più velocemente dei soliti operatori + o std::stringstream perché precalcolano la dimensione del buffer necessario ed evitano allocazioni non necessarie. E absl::StrSplit vi permette di dividere le stringhe con una sola riga di codice con filtri flessibili.
Gestione degli errori senza eccezioni
Molti progetti di grandi dimensioni disabilitano le eccezioni in C++ per il sovraccarico o problemi di sicurezza. In Abseil ci sono absl::Status e absl::StatusOr<T> per questo. È un modo elegante per restituire da una funzione un risultato o un codice di errore con descrizione testuale. Se avete mai lavorato con Go o Rust, questo approccio vi sembrerà molto familiare e logico.
Sincronizzazione e tempo
Al posto del standard std::mutex, offrono absl::Mutex. È progettato per essere più efficiente sotto alta contesa di thread. E la libreria time rende il lavoro con i fusi orari e gli intervalli molto più semplice rispetto al sovraccarico std::chrono.
Filosofia tecnica: Live at Head
Abseil ha una caratteristica che può either respingere o attrarre. Google promuove il concetto di "Live at Head". Questo significa che raccomandano di buildare sempre il progetto dall'ultima versione master.
Gli sviluppatori si sforzano di non rompere l'API, ma se è necessario migliorare la libreria, lo faranno. Per facilitare la vita agli utenti, Abseil include strumenti per il refactoring automatico del codice verso nuove versioni dell'API. Per chi non è pronto per tali avventure, ci sono rilascii LTS, ma l'attenzione principale è sul muoversi in avanti.
Il progetto supporta la build con Bazel e CMake. Se state già usando Bazel, integrare Abseil richiederà solo un paio di minuti.
A chi è rivolto
Raccomanderei di dare un'occhiata più da vicino ad Abseil in due casi.
Primo, se state scrivendo un backend ad alto carico. Sostituire le mappe standard con absl::flat_hash_map a volte dà un incremento di performance gratis, senza riscrivere la logica.
Secondo, se siete bloccati su un vecchio standard C++ (per esempio, C++17), ma vorreste davvero usare funzionalità del C++20. Abseil spesso backporta nuove capacità del linguaggio, rendendole disponibili su compilatori più vecchi.
Abseil non è solo una raccolta di utility, ma un riflesso di come viene scritto il codice in una delle aziende tecnologicamente più avanzate al mondo. La libreria è enorme, a volte complessa, ma incredibilmente di alta qualità. Se avete bisogno di più di ciò che offre la libreria standard o state lottando per ogni percento di prestazioni, questo è sicuramente uno strumento che vale la pena avere nel vostro arsenale.
Il modo migliore per iniziare ad imparare è con la guida ufficiale, dato che il README nel repository è piuttosto breve e serve più come mappa delle cartelle del progetto.
Progetti correlati