Een zes jaar oude discussie over de Linux-kernelmailinglijst is opnieuw opgelaaid over het vooruitzicht om de Linux-kernel te converteren om moderne C++-code te ondersteunen. De bestaande Linux-kernel bestaat voornamelijk uit C-code en verschillende handgeschreven assembleertalen, en het werk van de ondersteuning van Rust in de Linux-kernel neemt ook toe. Hoewel het onduidelijk is of er voldoende kracht zal zijn om dit werkelijkheid te maken, heeft de mailinglijst van de Linux-kernelgemeenschap de discussies over de mogelijkheid om de C-code van de Linux-kernel in de toekomst naar C++ te converteren, opnieuw opgestart.

Al op 1 april 2018 stelde Red Hat-ingenieur David Howells een set van 45 patches voor om te beginnen met het converteren van de kernel naar C++. Hierdoor kan de hoofdkernel inline-sjabloonfuncties, inline-overbelaste functies, klassenovererving en andere functies gebruiken die momenteel niet worden ondersteund door de C-code van de Linux-kernel. Het was moeilijk om die dag een serieuze discussie te voeren, en uiteindelijk bleven de patches zes jaar lang zonder veel discussie op de Linux-kernelmailinglijst staan.

Maar gisteren reageerde de ervaren Linux-ontwikkelaar H. Peter Anvin op het onderwerp van de kernelmailinglijst. Anvin schreef een lange LKML-post waarin hij zijn redenering uiteenzette waarom C++ voor de Linux-kernel eindelijk het juiste moment zou kunnen zijn:

"Andrew Pinski werd zich onlangs bewust van dit onderwerp. Ik begrijp dat het op 1 april 2018 werd gepost en dat het een grap was of dat het als een grap had kunnen worden opgevat. Ik denk echter dat het de moeite waard is en ik zal proberen mijn perspectief hier te inspireren."

Zowel C als C++ hebben een lange weg afgelegd sinds 1999, en naar mijn persoonlijke mening is C++ eindelijk "volwassen" geworden en is het een betere C-taal voor embedded programmeren, belichaamd in de kernel van het besturingssysteem. Ik zeg dit als auteur van talloze macro- en inline-assemblagehacks in de kernel.

De echte reden dat ik dit zeg is dat veel van de recente verzoeken die we hebben gedaan voor gcc-extensies eigenlijk heel eenvoudig te implementeren zijn in standaard C++, en in veel gevallen de infrastructuur verbeteren zonder de globale code te wijzigen.

Naar mijn mening is C++14 de "minimale" versie met redelijke ondersteuning voor metaprogrammering. Het heeft de meeste ondersteuning voor metaprogrammering, zonder het soort hel van eerdere versies (C++11 heeft de meeste ondersteuning voor metaprogrammering, maar C++14 vult een aantal belangrijke hiaten op).

Naar mijn mening is C++20 de echte gamechanger; Hoewel er tal van SFINAE-hacks beschikbaar zijn voor eerdere versies, bieden deze ook volkomen nutteloze foutmeldingen. C++20 voegt enkele concepten toe die het mogelijk maken om daadwerkelijk redelijke foutmeldingen te krijgen."

Voor degenen die misschien vragen "herschrijf C-code in Rust!", voegde Anvin proactief toe in zijn bericht:

"Waarom zouden we Rust niet gebruiken? Ten eerste gebruikt Rust een andere syntaxis (vaak onnodig, naar mijn mening) waar niet alleen alle kernelontwikkelaars goed bekend mee moeten zijn om hetzelfde 'gevoel' te krijgen als C, maar het converteren van C-code naar Rust is niet iets dat stukje bij beetje kan worden gedaan, terwijl bestaande C-code met wat opruimwerk kan worden gecompileerd naar C++."

Jiri Slaby van SUSELans sprak zijn steun uit voor het C++-initiatief van de Linux-kernel. David Howells van Red Hat, die oorspronkelijk de kernelpatch uitbracht, sprak ook zijn steun uit voor deze discussie.

We zullen de uitkomst van de LKML-discussies afwachten en zien of er in 2024 eindelijk genoeg momentum is om moderne C++-code (of op zijn minst een gedefinieerde subset van C++14~20) in de Linux-kernel te ondersteunen. Linus Torvalds is in het verleden een fervent tegenstander van C++ geweest, maar als hij zich meer op zijn gemak voelt met de recente C++-standaard, of als hij er nog steeds op staat C te gebruiken om de Linux-kernel te onderhouden, dan kunnen we zien of het tij eindelijk zal keren.

Het zal pas in 2022 zijn voordat de Linux-kernel van C89 naar C11 begint te bewegen. Vooral als consensus wordt bereikt om een ​​subset van C++14/C++20-programmering in de kernel toe te staan, kan het nog enige tijd duren voordat de basisvereisten voor de compiler worden verhoogd, zodat bredere compilerondersteuning kan worden uitgerold.