Hace 2 años | Por ccguy a zdnet.com
Publicado hace 2 años por ccguy a zdnet.com

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

zentropia

#1 Supongo que es mucho más esfuerzo. Una reescritura completa.

D

#2 Contratamos becarios

meneandro

#3 Lenguaje que promete ser seguro vs programadores sin experiencia escribiendo código que promete ser inseguro. ¿Quién ganará?

D

#6 el compilador (rustc) lol

meneandro

#7 El compilador está diseñado para pillar una serie de errores, pero no puede pillarlos todos. Si fuera así, no habría bugs en ningún software...

D

#36 ya lo sé, pero no has entendido mi broma: me estaba imaginando una exageración en las que los programadores sin experiencia se dan por vencidos y no consiguen compilar nada, como si fuera una batalla de ajedrez contra la máquina.

Disclaimer: no creo que Rust tan complicado o imposible ni que prevenga bugs en la lógica de "negocio", era solo una broma.

meneandro

#37 El compilador siempre ha sido el peor enemigo del programador. Es que hay que darle todo mascadito porque si no, todo el rato poniendo pegas...

l

#1 #2 Creo que se podria hacer por partes. Se pueden hacer partes en C y Rust que interacciones con entre ellas. Esta bien para hacer cosas nuevas que seran mas seguras que si se hicieran en C. Lo antiguo ya debe estar muy probado y vigilado.

#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.

D

#12 Que yo sepa, lo único que no soporta C99 en adelante es la vieja sintaxis de K&R, la que era

nombre_de_funcion(var1, var2, var3)
char *var1;
float var2, *var3;


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.

meneandro

#12 El problema no es simplemente "traducir c a otro lenguaje" el problema es que son muchos problemas:
- 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.

G

#33 Además, acabaría todo oxidado y muy rústico

meneandro

#39 El acero cortén se oxida a si mismo para protegerse, como forma de aislarse de los efectos de la intemperie; igual no es tan malo...

l

#40 No es tan evidente pero el aluminio y el titanio se oxida superficialmente y evita que se oxiden .

Magankie

#4 Seguro? No sería la primera vez que me falla una compilación por usar una versión más moderna de la que se utilizó en el momento que se escribió el código.

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?

D

#13 Por experiencia, lo que comentas de tener fallos en versiones nuevas sí es bastante normal en C++, pero bastante raro en C.

A día de hoy el último estándar es C17, pero C23 está a punto de salir del horno con estos cambios: https://en.cppreference.com/w/c/23

R

#4 C89 forzaba a la declaración de variables al principio del método/región. Hasta hace no mucho trabajaba en un proyecto que para Windows se compilaba en VS2010 (que era C89) y cuando pasabas a probar a compilar en Windows siempre acababas con fallos de ese tipo que ir corrigiendo.

D

#15 Exacto. Es a lo que me refería con lo del FOR.

R

#19 Ahora ya hemos logrado migrar el toolchain de Windows y podemos usar C99, un estandar que solo es mas viejo que el mas joven del equipo, en vez de la mitad

pedrobz

#24 Es en serio, no es un candidato, Rust YA es un lenguaje aceptado en el kernel cc #4

j

#5 Interesante comentario. En demasiadas ocasiones los problemas tecnológicos tienen un trasfondo más humano, derivado de tener a cientos de personas colaborando, que técnico.

meneandro

#8 Simplemente no puedes cambiar 1000 colaboradores por otros (que igual no hay 1000 que tengan el nivel o conocimiento para poder colaborar en algo tan especializado y complejo) así de sopetón y por gusto. Sería un desastre para cualquier proyecto.

z

#5 no se va a reescribir nada en completo, ni siquiera en profundidad
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".
https://lwn.net/ml/linux-kernel/CAHk-=wiyCH7xeHcmiFJ-YgXUy2Jaj7pnkdKpcovt8fYbVFW3TA@mail.gmail.com/

meneandro

#11 Claro, cualquier cambio tiene sus riesgos. Pero en algún momento llegas a un punto donde el beneficio del cambio a corto y largo plazo supera el dolor de realizarlo (que puede ser tan inmediato como corregir algún problemilla aquí o allí o algo que haya que pegarse mucho tiempo depurando hasta averiguar qué pasa y luego buscar soluciones o alternativas que pueden ser más o menos viables o que lleven a más cambios y más disruptivos. Nos enteraremos en breve...

box3d

#1 por que no abandonamos C por algo mejor?
Cien veces preguntado, y la respuesta no cambia.

https://daniel.haxx.se/blog/2017/03/27/curl-is-c/

Y curl es "pequeño" comparado con Linux.

m

#1 no

zeioth

#1 Rust se ha aceptado como un lenguaje valido para el kernel, simplemente no lo necesitas en todas partes.

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.)

P

#1 el código actual seguiría compilando con este cambio y tendrían la posibilidad de programar en C más moderno.

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.

JanSmite

Que use Google Translator, a ver que sale… lol

m

#9: O con el AutoBIC Autopilot de Github.

D

#27 pues me quedo con vbscrpt

D

mejor a javascript, pyton o php

F

#16 Pues no, pero Rust si sería un buen candidato.

D

#18 no hablas en serio, verdad ?

F

#24 Pues hombre, sin ser un experto, parece ser tiene todas las papeletas para serlo en un futuro (tal vez no muy lejano).

y

#24 Rust ha sido pensado como lenguaje de implementación de sistemas operativos, precisamente.

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

F

#27 Y sin embargo PHP es muchísimo más rápido que Python.

skgsergio

#24 Ya se esta abriendo la ventana a Rust como segundo lenguaje del kernel. No para la parte mas nucleo pero si para drivers y otros subsistemas.