Nuovi linguaggi per il Kernel Linux: dopo Rust è giunto il momento di C++?

7

Negli ultimi mesi abbiamo avuto modo di discutere piuttosto spesso del C++, il linguaggio ideato a inizio anni ottanta per fornire il C del supporto alla programmazione ad oggetti. Oggi ne riparleremo, perché Peter Anvin (Kernel hacker di lungo corso), ha resuscitato un post nella KML (la mailing list del Kernel Linux) vecchio di sei anni per dire che, anche se il 2024 non sarà l’anno di Linux nel Desktop, forse sarà quello di C++ nel Kernel.

Ma procediamo con ordine.

Linus e C++ non sono mai andati molto d’accordo: celebre è il suo messaggio nella mailing-list di Git, in cui si lasciava andare definendo C++ un orribile linguaggio. Un’opinione che, nonostante Linus si sia addolcito parecchio, continua a ribadire.

A dispetto di questo, nel 2018 David Howells, un ingegnere di Red Hat, preparò una patch per compilare il Kernel in C++, supportando funzioni inline, la meta-programmazione con i template e (soprattutto!) l’ereditarietà tra classi. Questo lavoro non attirò molte attenzioni fino a qualche giorno fa, quando Anvin ha come descritto fatto quello che in gergo viene chiamato necro-posting.

“Andrew Pinski recently made aware of this thread. I realize it was released on April 1, 2018, and either was a joke or might have been taken as one. However, I think there is validity to it[..]Both C and C++ has had a lot of development since 1999, and C++ has in fact, in my personal opinion, finally “grown up” to be a better C for the kind of embedded programming that an OS kernel epitomizes. [..]C++14 is in my option the “minimum” version that has reasonable metaprogramming support has most of it without the type hell of earlier versions […]However C++20 is really the main game changer in my opinion; […] C++20 adds concepts, which makes it possible to actually get reasonable errors.”

Andrew Pinski ha riportato in considerazione quel post. Quando ho capito era stato scritto il primo Aprile del 2018 ho pensato a uno scherzo o che poteva essere preso per tale. Tuttavia, credo ci sia della validità […] Sia C che C++ si sono sviluppati parecchio dal 1999 e C++ è, a parer mio, “cresciuto” per essere un C migliorato per il tipo di programmazione embedded che un Kernel per sistemi operativi incarna. […].C++14 è la versione “minima” che fornisce un ragionevole supporto alla meta-programmazione senza l’inferno della tipizzazione delle prime versioni. […] Tuttavia, a parer mio, C++20 è il vero punto di svolta; […] C++20 aggiunge i concepts, che rendono possibile ottenere errori ragionevoli.

Come vedete, le motivazioni tecniche per utilizzare C++ ci sono e sono parecchio valide: simulare in C concetti come la gestione delle eccezioni o l’ereditarietà è un’impresa e il codice risultante è, di solito, una combinazione di macro e goto di difficile lettura. Inoltre, un altro forte argomento, è che abbiamo diversi compilatori C++ per un gran numero di architetture e questi sono già stati ottimizzati dopo anni di uso e sviluppo (gcc e LLVM su tutti).

Significativo, poi, è quello che dice Anvin riguardo Rust, recentemente aggiunto come linguaggio supportato dal Kernel.

“Now, “why not Rust”? First of all, Rust uses a different (often, in my opinion, gratuitously so) syntax, and not only would all the kernel developers need to become intimately familiar to the level of getting the same kind of “feel” as we have for C, but converting C code to Rust isn’t something that can be done piecemeal, whereas with some cleanups the existing C code can be compiled as C++.
However, I find that I disagree with some of David’s conclusions; in fact I believe David is unnecessarily pessimistic at least given modern C++.

Ora, “perché non Rust”? Prima di tutto, Rust usa una sintassi diversa (spesso, a parer mio, inutilmente), e non solo tutti gli sviluppatori del Kernel dovrebbero diventare profondamente familiari al punto di avere lo stessa confidenza che hanno col C, ma anche perché convertire codice C in Rust non è qualcosa che si può fare un po’ per volta, mentre con qualche aggiustamento il codice C esistente può venire compilato come C++.

Se avete provato a scrivere qualcosa in Rust ammetterete che c’è del vero in queste parole: i concetti di borrowing, ownership e lifetime sono parte integrante del linguaggio e, benché il compilatore fornisca un’eccellente aiuto per individuare i problemi, bisogna comunque acquisire dimestichezza con queste regole. In C++, al contrario, se si conoscono le basi del C e si ha un background in C# o Java, le uniche richieste per rendere il linguaggio sicuro è ricorrere agli smart-pointer, utilizzare la RAII e prestare molta attenzione a quando si lavora con l’esecuzione parallela.

Inoltre, come già raccontavamo qui, C++ è lungi dal morire e presto vedremo una nuova release.

Vedremo come andrà questo nuovo tentativo, soprattutto considerando come gli ultimi anni abbiano visto l’apertura dello sviluppo del Kernel agli standard C99 e,ovviamente, a Rust. E voi, cosa ne pensate? Il fatto che il Kernel possa diventare multi-linguaggio sarà un’opportunità o una fonte di caos?

Appassionato di GNU/Linux dal 2000, tento disperatamente di tenermi distante dalla programmazione web e di sviluppare in C/C++ e Python i software che mi vengono commissionati.

7 risposte a “Nuovi linguaggi per il Kernel Linux: dopo Rust è giunto il momento di C++?”

  1. Avatar Giacomo Perin
    Giacomo Perin

    Le critiche al c++ erano che permette di nascondere i bug anche quando il codice sembra scritto bene: operator overloading ed ereditarietà possono rendere la lettura del codice molto complicata. Il pregio del c è l’assenza di sovrastutture.

  2. Avatar JaK
    JaK

    Vero, questo è il motivo per cui molti progetti in C++ impongono l’uso di determinati standard quando si scrive codice. Mi vengono in mente:

    1. evitare i template;
    2. evitare la sovrapposizione degli operatori, a meno di entità matematiche (e.g. operazioni su matrici o numeri complessi);
    3. non usare l’ereditarietà multipla, a meno di classi completamente virtuali;
    4. usare SOLO smart-pointer.

    Insomma, si tratta di “buone maniere” che il l’amministratore del software richiede 🙂 dopotutto Linus non vuole si usi la typedef per le struct, ma mi pare ironico, visto che l’esempio che riporta non è sul typedef ma sull’uso di nomi criptici.

    LLVM è scritto in C++ e anche GCC ha fatto il grande salto nel 2015 con la release 4.8, quindi non è così folle utilizzarlo in software di sistema. O forse ho capito male la tua osservazione?

  3. Avatar kabal
    kabal

    Mi sembra la scelta più saggia usare c++ anziché rust.

  4. Avatar Kib
    Kib

    Credo che il mancato uso del C++ sia più dovuta ad un’avversione di Linus più che mancanze tecniche.

    Rust se non ricordo male era nato per sopperire ad alcune complessità del C++ e onestamente non credo che le persone coinvolte nello sviluppo del kernel abbiano tutte queste difficoltà nel passare da C C++ Rust

  5. Avatar Alessandro Scarozza
    Alessandro Scarozza

    visto che è possibile limitare c++ escludendo alcune funzionalità (come i template) non trovo il senso ad oggi di non usare il c++ nel kernel, andando anche a convertire in modo massivo anche il codice attuale.

    per rust condivido “l’inutilmente” con anche un aggravante. ad oggi il re indiscusso dei linguaggi di basso livello è c/c++, se volessi quindi creare un altro linguaggio di basso livello come sintassi la farei c-like in modo da permettere a tutta l’utenza un passaggio comodo. con rust questa cosa non è stata fatta, e non capisco il motivo

  6. Avatar JaK
    JaK

    Credo che il mancato uso del C++ sia più dovuta ad un’avversione di Linus più che mancanze tecniche.

    Precisamente. Di fatto, quello che non gli garba sembra essere che i programmatori C++ tendono a fare troppe astrazioni per problemi semplici.

    Rust se non ricordo male era nato per sopperire ad alcune complessità del C++

    Pressapoco sì: a Mozilla si iniziò a usare Rust perché era più veloce scrivere in Rust che in C++ e il compilatore segnalava memory-leaks e race-conditions a tempo di compilazione.

    Ma, effettivamente, la sintassi richiede davvero un po’ di pratica 🙂

  7. Avatar Ferdinando Benati
    Ferdinando Benati

    Ciao a tutti, premetto che non programmo in c e c++ da molti anni, e solo a livello scolastico ( quindi manca tutto) e ho letto di rust, e che a parte soluzioni a difficoltà di conoscerlo, ha alcuni punti a favore..ma se sull’esempio di android (tutto fuorché ottimale), e probabilmente di molti altri SW , perché non usare sia rust che c++, unire la diffusione molto ampia, i pregi e la sua familiarità con moduli ( api, funzioni, ecc) in rust abbracciando le caratteristiche alternative fatte un po’ meglio .
    Poi sarà a chi fa manutenzione al kernel, come affidare una determinata soluzione con quale linguaggio sia più congeniale

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *