C++ en Linux, el tema se reaviva después de 6 años
Tal parece que la introduccion de Rust como segundo lenguaje de programación en el Kernel de Linux ha representado uno de los cambios más importantes que ha tenido Linux y no hablando en el ámbito de características y funcionalidades, sino que ha marcado un punto de partida muy importante en el cómo Linus torvalds y el equipo de desarrollo han dado un paso significativo hacia la modernización de Linux para bien.
Esto se puede notar, ya que hace poco, en las listas de correo del kernel de Linux se ha reavivado una discusión que fue iniciada hace seis años, presentando en broma un 1 de abril del 2018.
Y es que nuevamente se ha vuelto a poner sobre la mesa el asunto sobre «la viabilidad de adoptar el código C++ moderno en el kernel de Linux», yendo más allá del tradicional uso del lenguaje C con fragmentos de ensamblador y la promoción del lenguaje Rust.
La propuesta inicial fue lanzada en el 2018, por un ingeniero de Red Hat a modo de broma por la ya conocida celebración de april’s fool, en la cual muchos aprovechan para crear bromas a la comunidad y en ese momento fue asi, ya que supuestamente había lanzado un conjunto de 45 parches que incluían el uso de plantillas, herencia de clases y sobrecarga de funciones de C++.
En mi opinión, C++ 14 es la versión “mínima” que tiene un soporte de metaprogramación razonable y tiene la mayoría sin los tipos de versiones anteriores (C++ 11 tenía la mayoría, pero C++ 14 completa algunas piezas clave faltantes). Sin embargo, en mi opinión, C++20 es realmente el mayor cambio de juego; Aunque las versiones anteriores podían ejecutar muchos hacks de SFINAE, también daban mensajes de error absolutamente inútiles.
Hacemos mucha metaprogramación en el kernel de Linux, implementada mediante trucos de macros a menudo realmente horribles. Estos también son prácticamente imposibles de depurar. Tomemos el ejemplo de los hacks de tipo uaccess.h, algunos de los cuales diseñé y escribí. En C++, diferentes conversiones y declaraciones de casos se pueden dividir en instancias de plantilla separadas y, con un poco de ingenio, también se pueden aplicar estrictamente cosas como los punteros de espacio de usuario versus los punteros de espacio de usuario del kernel, así como los punteros de espacio de usuario ya marcados, versus aquellos que no lo son, sin mencionar el fácil manejo del caso de tipos de espacio de usuario de 32 bits en un kernel de 64 bits y la aplicación de la conversión endian.
Ahora, casi después de 6 años de ello, Hans Peter Anvin, un desarrollador clave del kernel de Intel y creador de proyectos como syslinux, klibc y LANANA, ha retomado la iniciativa de continuar la discusión. Según Anvin, desde 1999, los lenguajes C y C++ han experimentado avances significativos en su desarrollo, y el lenguaje C++ ha demostrado ser más adecuado que C para el desarrollo del kernel de sistemas operativos.
Anvin menciona que las funciones que antes requerían extensiones específicas de GCC, ahora pueden implementarse fácilmente en C++ estándar, y en muchos casos, el uso de C++ mejorará la infraestructura sin necesidad de cambiar completamente el código.
Además de ello, se propone utilizar al menos la especificación C++ 14, que incluye herramientas de metaprogramación, y se alienta el uso de la especificación C++ 20, que introduce soporte para conceptos que pueden reducir la incidencia de errores.
Se argumenta que C++ es más preferible que Rust, ya que este último difiere significativamente en sintaxis del lenguaje C, es poco común para los desarrolladores actuales del kernel y no permite la reescritura gradual del código. En el caso del lenguaje C++, es posible traducir partes del código del lenguaje C gradualmente, similar a cómo se puede compilar el código C como C++.
Si bien, el kernel de Linux es principalmente código C con varias partes escritas en ensamblador y un trabajo creciente en torno al soporte de Rust en el kernel de Linux, todavía no está claro si hay suficiente peso para que esto sea una realidad, sobre la posibilidad de ver el código C del kernel de Linux convertido a C++ en el futuro.
Finalmente si estás interesado en poder conocer más al respecto, puedes consultar los detalles en el siguiente enlace.