199 meneos
1376 clics
Linus Torvalds se prepara para pasar el núcleo de Linux a C moderno [ENG]
Todos sabemos que Linux está escrito en C. Lo que tal vez no sepas es que está escrito en un dialecto de C obsoleto: La versión de 1989 del estándar del lenguaje C, C89. También se conoce como ANSI X3.159-1989, o ANSI C. Linus Torvalds ha decidido que ya es suficiente y trasladará el C oficial de Linux al estándar C11 de 2011. [...] Para parchear un posible problema de seguridad con las funciones de ejecución especulativa primitiva de listas enlazadas del núcleo, se reveló otro problema en el parche.
|
comentarios cerrados
En segundo lugar, "pasar el núcleo a C moderno" sólo implica cambiar una opción de compilación, pero no hace falta cambiar ni una sola línea de las fuentes. Lo que ocurre es que, a partir de añadir esa opción de compilación, se podrán "utilizar cosas" que antes no se permitían. Hasta ahora el compilador asumía que el código era C89, y no se permitían cosas como definir una variable en la definición de un FOR, por ejemplo.
Sería el equivalente a decir: eh, compilemos con gcc 6, porque gcc 5.1 cada vez nos está restringiendo más lo que podemos hacer y además nos facilita mucho la vida con esto y esto y nos permite esto otro.
O sea: no se va a reescribir nada en completo, ni siquiera en profundidad. No es un cambio de ese tipo.
Sobre si es mejor o peor reescribir todo en rust... la respuesta es: ahora mismo la mano de obra principal domina C, ha trabajado toda su vida en C, gran parte del éxito del kernel de linux se basa en la portabilidad del C, la cantidad de lineas de código que hay escritas en C es abismal... luego portar todo a rust sería tirar por la ventana muchísimo trabajo y trabajadores a la basura (en experiencia, recursos y sobre todo en tiempo) y eso sólo para llegar al mismo sitio. Ventajas tiene, sin duda, pero cuando el núcleo de linux llegara a estar tan consolidado, estable y funcional como el actual, a saber todo lo que hubiera cambiado, evolucionado y mejorado en ese tiempo. Aparte de que muchas arquitecturas se quedarían fuera por no tener soporte de rust, y el hecho de que aún rust sólo es soportado por un único compilador, lo suyo sería que tuviera soporte para al menos dos (los chicos de gcc están en ello)
Por ahora, el soporte rust que se está introduciendo en el kernel es para drivers de dispositivos nuevos y específicos, que se sepan que no van a poder necesitarse en arquitecturas donde rust no está soportado y como pruebas de concepto y poco a poco se irá expandiendo a otras cosas (rust brilla mucho sobre todo a la hora de hacer parsers y manejar datos de fuentes no seguras, cosas ambas que se realizan en muchos drivers, así que ahí tiene mucho que aportar).
Cien veces preguntado, y la respuesta no cambia.
daniel.haxx.se/blog/2017/03/27/curl-is-c/
Y curl es "pequeño" comparado con Linux.
Si todo va bien, claro. En un proyecto tan tremendamente inmenso no sería de extrañar que surgieran sorpresas o comportamientos inesperados. El propio Torvalds indica que no lo hicieron antes "because we had some odd problem with some ancient gcc versions that broke documented initializers".
lwn.net/ml/linux-kernel/CAHk-=wiyCH7xeHcmiFJ-YgXUy2Jaj7pnkdKpcovt8fYbV
#4 Pense que habria cosas que no cumplirian el standar nuevo, pero entiendo que el nuevo es compatible con el viejo, pero codigo nuevo, no tiene por que cumplir el standar viejo.
#5 Ya que se rehace el codigo, a lo mejor se podria hacer una reestructuracion porque despues haber hecho un codigo, uno se da cuenta que deberia haber hecho las cosas de otra forma y aveces rehacer el trabajo cuesta mucho. Pero si ya hay que rehacerlo por otro motivo es un momento para mejorarlo.
Tambien se puede esperar a que la IA colaboren en programar y aprendan convertir un lenguaje en otro o encontras y resolver problemas en el codigo.
Otra duda que tengo: la versión de C de 2011 es la más actual? Y si no es así, por qué quedarse en algo de hace 11 años?
AutoBICAutopilot de Github.La versión más moderna de C es la C2x ( en.wikipedia.org/wiki/C2x ). Sin embargo, decidieron quedarse en la C11 porque está bien soportada en la versión 5 de GCC, que es la más antigua con la que garantizan que se puede compilar el kernel. Si usasen un estándar más reciente obligarían a la gente a utilizar un compilador más moderno, y para algunos sistemas puede ser problemático.
nombre_de_funcion(var1, var2, var3)
char *var1;
float var2, *var3;
{
// codigo
}
y donde si alguna variable o retorno no tenía definido el tipo, era un INT.
Respecto a lo de hacer con RUST por partes, es justo lo que ya están haciendo desde hace unos meses.
Por otro lado, no se "rehace el código", sino que hay un par de cosas que ahora se pueden hacer más sencillas porque, por ejemplo, en C99 y adelante puedes definir variables casi donde te de la gana, en lugar de tener que hacerlo al principio del código. No se van a reescribir grandes trozos de código, sino, por lo que he leído, un par de macros.
Tambien puede ser que portar C a una versión distinta es infinitamente mas facil que reescribir de cero en otro lenguaje (que ademas está pensado para multi hilo.)
javascript es una broma, que te puede dar un sueldo pero no pasa de chapuza.
python es más lento que el caballo del malo
php es más interpretado que python
A día de hoy el último estándar es C17, pero C23 está a punto de salir del horno con estos cambios: en.cppreference.com/w/c/23
Reescribir el kernel que se usa actualmente en la mayoría de servidores del mundo, por nombrar solo una de las muchas implicaciones, me imagino que será bastante inviable.
- Hay muchas funcionalidades que tiran de preprocesador (hay un fuerte (ab)uso de macros y opciones compilación condicional entre otras cosas). Simplemente cambiar esto ya es un mundo en si mismo (y no, en rust se maneja de manera muy diferente; entre otras cosas, para evitar tener un precompilador en primer lugar).
- Convenciones de funcionamiento que pueden (y deben) cambiar drásticamente si usas otro lenguaje (evidentemente, usar c++ para programar a la c no es lo más adecuado, usar java para programar a la c es imposible y usar rust para programar a la c... es de chapuzas).
- La gestión de memoria cambiaría completamente (al menos si quieres usar rust por sus características de seguridad propias del lenguaje... usar rust para hacer todo en rust inseguro "no tiene sentido").
- La gestión de procesos cambia completamente (rust tiene en el lenguaje su propia forma de gestionar esto).
- La gestión del propio proyecto cambia completamente. Habría que repensar cómo montar toda la estructura del kernel, qué módulos, submódulos, etc. serían necesarios, cómo jerarquizar, etc.
Vamos, que realmente sería diseñar y programar un kernel nuevo. Terminas antes tomando uno que ya funcione (redox, por ejemplo) y creando capas de compatibilidad con linux.
Disclaimer: no creo que Rust tan complicado o imposible ni que prevenga bugs en la lógica de "negocio", era solo una broma.