- El proyecto Git anunció oficialmente que de ahora en adelante incorporará Rust en el núcleo y que, a partir de Git 3.0, Rust será un requisito obligatorio de compilación
- Esta serie de parches avanzará con el carácter de una introducción experimental (test balloon), similar a la adopción previa de funciones de C99, con el objetivo de preparar gradualmente la infraestructura para incorporar Rust
- Como primer paso, se convirtió a Rust el módulo varint.c, que casi no tiene dependencias, para validar la interoperabilidad entre C y Rust y el tooling de compilación
- Por ahora solo se admite la compilación con Meson, y más adelante se planea añadir soporte para Makefile y validación de compilaciones con Rust en CI, además de verificaciones de consistencia de formato basadas en
cargo format
- Este es un cambio importante que da tiempo a la comunidad de Git y a los distribuidores para adaptarse a los nuevos requisitos del toolchain de Rust, mientras a largo plazo mejora la seguridad y la capacidad de expansión del código
Contexto de la adopción de Rust
- Git ha estado evaluando una evolución del lenguaje para mejorar la estabilidad y el mantenimiento
- La adopción de Rust implica reforzar la seguridad de memoria, aprovechar un toolchain moderno y asegurar posibilidades de optimización de rendimiento
- Además, busca construir una base de código más robusta mediante la incorporación de un lenguaje moderno
- Al anunciar con antelación que Rust será obligatorio en el momento del lanzamiento de Git 3.0, se busca dar tiempo de preparación al ecosistema
- El plan es ampliar de forma gradual el alcance del código en Rust y, en última instancia, reimplementar también algunas funciones centrales en Rust
Serie experimental de parches
- Se eligió varint.c como el primer módulo al que se aplicará Rust
- Es muy simple y no tiene dependencias
- Permite verificar la interop entre C y Rust
- Se puede experimentar sin afectar el funcionamiento general de Git
- Todas las pruebas pasaron en la versión varint.rs
Cambios en el sistema de compilación
- Actualmente el soporte de Rust solo se añadió al sistema de compilación Meson
- Más adelante se planea añadir soporte de Rust también a Makefile
- También hace falta preparar trabajo relacionado con CI
- Validación de compilación y funcionamiento con Rust
- Consistencia del estilo de código mediante
cargo format
- Otras automatizaciones de tooling y mantenimiento
Próximos pasos
- Este trabajo se enfoca más en experimentar el proceso de adopción que en las funciones de Rust en sí
- Después podrían reescribirse en Rust más funciones internas de Git, incluido el módulo xdiff
- Se prevé expandir Rust de forma gradual para que todo el ecosistema se adapte a un entorno de compilación basado en Rust
Implicaciones
- Git se está preparando para la transición de lenguaje más importante de su historia
- Hacer obligatorio Rust puede asegurar seguridad, mantenibilidad y posibilidades de evolución a largo plazo
- Para distribuidores y desarrolladores, configurar un entorno de desarrollo con Rust pasará a ser un requisito indispensable dentro del ecosistema de Git
1 comentarios
Comentarios en Hacker News
Enlace a la discusión relacionada
También se sospecha que, como Rust es un lenguaje sin un estándar formal, con el tiempo su implementación podría quedarse bastante rezagada, como pasó antes con Java
Git ya parece una herramienta muy madura, y da la impresión de que solo necesita mantenimiento o mejoras, no una gran cantidad de código nuevo que justifique introducir otro lenguaje
A diferencia de Linux, donde continuamente se necesitan drivers nuevos, no parece haber una razón similar en Git
Pide que alguien le explique si se está perdiendo de algo
Los cambios de Git pueden verse en las RelNotes o, de forma más fácil de leer, en la categoría Git del blog de GitHub
En el caso de git-branchless, incluye funciones como merges en memoria escritas en Rust
También se puede buscar más contenido sobre Rust en esa lista de correo
(Aclara que no está emitiendo una valoración a favor o en contra, sino que alguien más seguramente lo hará)
Casi no hay gente interesada en desarrollar Git en C, mientras que sí hay entusiasmo entre quienes quieren participar en una reescritura en Rust
Git está bastante maduro y no parece que vaya a recibir mucho código nuevo
Rust es mucho más complejo que C
Si realmente se necesitan funciones orientadas a objetos, incluso usar solo C++98 sería mucho más simple y fácil de entender que C++ moderno o Rust
Rust no será obligatorio para futuros parches, sino que pasará a ser obligatorio dentro del sistema de compilación
Si está mal, todavía puede volver a corregirlo
Quieren saber si es necesario para compilar el propio sistema de build o si también será obligatorio para compilar la aplicación
Ha invertido mucho en Git y ha creado varios proyectos, así que no quiere perder la posibilidad de hackearlo
De hecho, Rust es más fácil de aprender que C en general (sobre todo que el C lleno de bugs), y desde luego más fácil que familiarizarse con el código fuente de Git o de Linux
Según GitHub, es 50% C, 38% Shell, 4% Perl, y el resto TCL/Python, etc.
Perl y TCL incluso son más excepcionales
A medida que el proyecto creció, se fueron acumulando muchos hacks agregados por todas partes, y ahora hace falta mejorar seguridad/rendimiento y limpiar esos hacks viejos
Rust parece adecuado para eso
Que Git use algo de Rust no debería impedirme desarrollar mi propio cliente o servidor Git
Las notas de lanzamiento de Debian también mencionan problemas relacionados con paquetes Rust/Go
Al compilar paquetes en Rust, por temas de enlace estático, a menudo hay que reconstruirlos con frecuencia, lo cual resulta incómodo en uso real
Si desde Rust se sigue ignorando el problema del ABI estable y de las bibliotecas compartidas, que son esenciales en Linux, podría generar incluso más quejas que C
Cree que en arquitectura de software a gran escala hay que ser más cuidadosos
Si buscas la palabra clave NonStop en este artículo, puedes ver un caso
En RESF y similares se dice que “la plataforma no soporta Rust”, pero en realidad tiene que soportarla el compilador de Rust para que de verdad funcione
git da la impresión de haberse estabilizado en la serie 2.x, así que no parece haber motivos para romper compatibilidad
Existe la duda de si la cultura de desarrollo actual se ha alejado de saber usar este tipo de toolchains
El control de código fuente, la compilación y el entorno de ejecución eran distintos, así que hacían falta copias remotas o ejecución remota, y en las reglas de build también era imprescindible detectar la plataforma objetivo
Con solo la bandera
--targetse puede compilar para cerca de 100 plataformas sin mayores problemasCree que el problema real es que parte del equipo de Git insiste en las limitaciones de sus máquinas de desarrollo antiguas o fijas
La compilación cruzada siempre ha sido ciudadana de segunda categoría y, en proyectos externos, ni siquiera se espera que funcione bien
Incluso hay distribuciones Linux que, para Raspberry Pi y casos similares, hacen que la compilación se realice solo en el hardware real
Por eso nadie se esfuerza en darle buen soporte
Linux está especialmente mal, porque la estructura de glibc ya envejeció tanto que se volvió difícil apuntar siquiera a una glibc mínima en cualquier hardware
La mayoría de los proyectos ni siquiera intentan soportar compilación cruzada
Zig está intentando mejorar esto
Git es una herramienta central del proyecto, así que los cambios implican mucho riesgo, y volverlo una dependencia obligatoria en tan poco tiempo, como seis meses, se considera riesgoso
Esa complejidad busca atrapar más errores en tiempo de compilación, pero como resultado el lenguaje en sí se vuelve bastante complejo
Por eso no recomienda adoptarlo
Entiende que con el kernel pasó lo mismo y que también rechazó Rust
Agregar a un kernel ya complejo un sistema de tipos al nivel de Haskell y un sistema de macros al estilo Lisp aumenta la complejidad
Seguir código Rust a través de serde es difícil
En cambio, en Go,
Unmarshales mucho más fácil de rastrearPorque permiten expresar más información en el compilador
Nunca ha tenido grandes problemas con Serde y, de hecho, le ha tocado depurar más
Unmarshalde GoLa afirmación de que el kernel rechazó Rust tampoco sería exacta: en realidad fue un conflicto entre dos desarrolladores sobre dónde guardar los headers
Rust tiene una barrera de entrada más alta que C, pero la distancia entre el “Rust mínimo” y el “Rust rápido y seguro” es mucho menor que en C
Lo consideran tan importante como el borrow checker
Resulty manejo de errores, Rust es bastante fácil de aprenderLa sintaxis también es tolerante
El kernel de Linux en realidad no rechazó Rust