Uma discussão que já dura alguns anos reapareceu com tudo como uma grande polêmica neste início de 2024: a grande dúvida dos desenvolvedores é se devem converter o kernel Linux de C para o C++ mais moderno.
Uma discussão de seis anos na lista de discussão do kernel Linux foi reacendida sobre as perspectivas de converter o kernel Linux para suportar código C++ moderno.
O kernel Linux é predominantemente composto de código C com vários Assembly escritos à mão, além do crescente trabalho em torno do suporte ao Rust dentro do kernel Linux. Embora ainda não esteja claro se há peso suficiente para torná-lo realidade, uma discussão da lista de discussão do kernel Linux foi reiniciada sobre a possibilidade de ver o código C do kernel Linux convertido em C++ no futuro.
Como tudo começou
Em 1º de abril de 2018 foi um conjunto de 45 patches do engenheiro da Red Hat David Howells para começar a converter o kernel para C++. Isso permitiria que o kernel principal fizesse uso de funções de modelo embutidas, funções sobrecarregadas embutidas, herança de classe e outros recursos atualmente não suportados pelo kernel Linux com seu código C. Um pouco difícil de fazer discussões sérias naquele dia e, finalmente, os patches residiram na lista de discussão do kernel Linux por seis anos sem muita discussão.
Mas ontem o desenvolvedor Linux de longa data H. Peter Anvin respondeu a esse tópico da lista de discussão do kernel. Anvin escreveu um longo post LKML com seu raciocínio sobre por que o C++ para o kernel Linux pode finalmente ser o momento certo:
“Andrew Pinski recentemente tomou conhecimento desse tópico. Percebo que foi lançado em 1º de abril de 2018, e ou era uma piada ou poderia ter sido tomado como um. No entanto, acho que há validade nisso, e vou tentar motivar minha opinião aqui.
Polêmica: desenvolvedores discutem se devem converter o kernel Linux de C para C++
Tanto o C quanto o C++ tiveram muito desenvolvimento desde 1999, e o C++ de fato, na minha opinião pessoal, finalmente “cresceu” para ser um C melhor para o tipo de programação embarcada que um kernel de sistema operacional sintetiza. Estou dizendo isso como autor de um número muito grande de macro e inline assembly hacks no kernel.
O que realmente me faz dizer isso é que muitas coisas que pedimos recentemente para extensões específicas do gcc são, na verdade, relativamente fáceis de implementar no C++ padrão e, em muitos casos, permite a melhoria da infraestrutura sem alterações globais de código (veja abaixo).
C++14 é na minha opção a versão “mínima” que tem suporte razoável a metaprogramação tem a maior parte dele sem o tipo inferno de versões anteriores (C++11 tinha a maior parte dele, mas C++14 preenche algumas partes chave faltando).
No entanto, o C++20 é realmente o principal divisor de águas na minha opinião; embora as versões anteriores pudessem jogar um monte de hacks SFINAE, eles também deram barf absolutamente inútil como mensagens de erro. O C++20 adiciona conceitos, o que torna possível obter erros razoáveis.”
Para aqueles que podem então levantar a questão de “reescrever o código C em Rust!”, Anvin acrescentou em sua mensagem:
“Agora, por que não Ferrugem”? Primeiro de tudo, Rust usa uma sintaxe diferente (muitas vezes, na minha opinião, gratuitamente), e não apenas todos os desenvolvedores de kernel precisariam se tornar intimamente familiarizados ao nível de obter o mesmo tipo de “sensação” que temos para C, mas converter código C para Rust não é algo que pode ser feito aos poucos, enquanto com algumas limpezas o código C existente pode ser compilado como C++.
No entanto, acho que discordo de algumas das conclusões de Davi; na verdade, acredito que David é desnecessariamente pessimista, pelo menos dado o C++ moderno.
Observe que ninguém em sua mente sã esperaria usar todos os recursos do C++. Assim como temos o “kernel C” (atualmente um subconjunto do C11 com um conjunto relativamente grande de extensões específicas do compilador permitido) teríamos o “kernel C++”, que eu sugeriria ser um subconjunto estritamente definido do C++20 combinado com um conjunto semelhante de extensões do compilador.) Percebo que o suporte ao compilador C++20 ainda é muito novo por razões óbvias, então pelo menos parte disso é voltado para o futuro.”
Jiri Slaby da SUSE Lans saiu em apoio a esta iniciativa C++ para o kernel Linux. David Howells, da Red Hat, que originalmente postou os patches do kernel, também voltou a favorecer essa discussão.
Qual será o resultado prático?
Veremos onde essa discussão LKML leva e se finalmente há tração suficiente em 2024+ para suportar código C++ moderno — ou pelo menos algum subconjunto C++14~20 definido — dentro do kernel Linux. Linus Torvalds no passado foi apaixonadamente contra o C++, mas veremos se as marés finalmente viraram, se ele está mais satisfeito com os padrões recentes do C++ ou se ele continua desafiador em manter o kernel Linux em C. Foi apenas em 2022, entretanto, que o kernel Linux começou a mudar de C89 para C11.
Especialmente se houver consenso para permitir um subconjunto de programação C++14/C++20 no kernel, ainda pode levar algum tempo até que seja adotado para permitir que o suporte mais amplo ao compilador seja implementado antes de aumentar os requisitos do compilador base e mesmo que receber o endosso milagroso de Torvalds não seja uma decisão a ser tomada de ânimo leve.
Veremos onde essa discussão LKML leva e se finalmente há tração suficiente em 2024+ para suportar código C++ moderno — ou pelo menos algum subconjunto C++14~20 definido — dentro do kernel Linux. Linus Torvalds no passado foi apaixonadamente contra o C++, mas veremos se as marés finalmente viraram, se ele está mais satisfeito com os padrões recentes do C++ ou se ele continua desafiador em manter o kernel Linux em C. Foi apenas em 2022, entretanto, que o kernel Linux começou a mudar de C89 para C11.
Especialmente se houver consenso para permitir um subconjunto de programação C++14/C++20 no kernel, ainda pode levar algum tempo até que seja adotado para permitir que o suporte mais amplo ao compilador seja implementado antes de aumentar os requisitos do compilador base e mesmo que receber o endosso milagroso de Torvalds não seja uma decisão a ser tomada de ânimo leve.