Todos sabemos que Linux está escrito en C. Lo que quizás no sepa es que está escrito en un dialecto C obsoleto: la versión de 1989 del estándar del lenguaje C, C89. Esto también se conoce como ANSI X3.159-1989, o ANSI C. Linus Torvalds ha decidido que ya es suficiente y moverá el C oficial de Linux al estándar C11 de 2011.
Esta no es una transición tan grande como puede parecer. C89 todavía tiene soporte casi universal. Debido a que cualquier compilador de C es compatible con versiones anteriores, no tendrá problemas para compilar o ejecutar un programa C89. Por lo tanto, un compilador compatible con C11 no tendrá ningún problema con ningún código heredado de C89.
¿Entonces, para qué molestarse? El cambio que se está realizando no incluye funciones útiles que aparecen en las versiones más recientes.
La situación llamó la atención de Torvald cuando, con el fin de parchear un posible problema de seguridad con las funciones de ejecución especulativa primitivas de lista enlazada del kernel, se reveló otro problema en el parche. Mientras solucionaba esto, Torvalds se dio cuenta de que en C99 el iterador pasado a las macros de recorrido de lista debe declararse en un ámbito fuera del bucle mismo.
Torvalds escribió a la Lista de correo del kernel de Linux (LKML) que «la razón principal por la que este tipo de error no especulativo puede ocurrir es que históricamente no teníamos variables de declaración de estilo C99 en bucles». Así que list_for_each_entry() – y todos los demás – fundamentalmente siempre filtran la última entrada HEAD fuera del ciclo, simplemente porque no pudimos declarar la variable del iterador en el ciclo mismo».
¿La respuesta? Finalmente, pase de C89 a un C estándar más nuevo que hace que este tipo de problema no pueda ocurrir. Entonces, «había llegado el momento de considerar pasar al estándar C99; todavía tiene más de 20 años, pero al menos es lo suficientemente reciente como para permitir declaraciones de variables a nivel de bloque».
El desarrollador del kernel de Linux, Arnd Bergmann, estuvo de acuerdo en que esto era factible. Agregó que debería ser posible pasar al estándar C11 de 2011. Dado que C99 nunca fue tan popular y C11 introdujo el soporte estandarizado de subprocesos múltiples e hizo que el lenguaje fuera un poco más seguro, esto suena como un buen movimiento.
Esto también sería un movimiento fácil de hacer. El compilador C mínimo del kernel de Linux, GCC versión 5.1 ya es compatible con C11. Esto funciona para Torvalds. «Realmente me encantaría finalmente avanzar en esto, considerando que se ha estado gestando durante muchos años».
Entonces, después de asegurarse de que el nuevo estándar C debería funcionar sin problemas en el kernel, Torvalds decidió apretar el gatillo. «Probemos esto al principio de la ventana de fusión 5.18». Dado que la ventana de combinación 5.18 ya casi está aquí, es posible que tengamos el código C11 en el kernel a partir de marzo.
O no. El desarrollador y periodista del kernel de Linux, Jonathan Corbet, advierte: «Sin embargo, vale la pena tener en cuenta que pueden suceder muchas cosas entre la ventana de combinación y la versión 5.18. Pasar a una nueva versión del estándar de lenguaje podría revelar muchas sorpresas. en lugares oscuros en el kernel; no se necesitarían muchos de ellos para que el cambio se revierta por ahora. Pero, si todo va bien, el cambio a C11 ocurrirá en la próxima versión del kernel».
Historias relacionadas: