-
El éxito y el fracaso de Ninja
- Hace unos 9 años, el autor presentó Ninja, un sistema de compilación similar a Make. Al principio le daba vergüenza, pero ahora se usa ampliamente.
- Entre los proyectos principales que usan Ninja están Chrome, Android y el proyecto Meson.
- Ninja es el proyecto de código abierto más exitoso del autor: fue presentado en 2011, su propiedad se transfirió en 2014 y actualmente ya pasó a su tercer mantenedor.
- Aprendió que en programación la arquitectura es más importante que escribir código, y que los problemas sociales son aún más importantes que la arquitectura.
-
Detalles técnicos
- Ninja es un sistema simple que ejecuta comandos según los requisitos dados.
- Ninja recibe archivos
ninja.build, verifica las marcas de tiempo de modificación de los archivos y ejecuta en paralelo los comandos necesarios.
- En comparación con Make, Ninja tiene menos funciones en su lenguaje de entrada para builds y se enfoca en la ejecución rápida.
- Ninja optimiza la comparación de rutas al mapear las rutas de archivos a objetos en memoria.
-
Notas de arquitectura
- La representación del grafo de Ninja usa un grafo bipartito entre archivos y comandos para capturar mejor la estructura del build.
- Usa datos adicionales de dependencias para manejar las dependencias de encabezados de C.
- Ninja no es un proceso demonio persistente; en cada ejecución trabaja desde cero.
- Como el kernel ya almacena en caché el estado de los archivos, casi no hace falta volver a cachearlo en espacio de usuario.
- Ninja fue diseñado con base en la compilación de Chrome y está enfrentando problemas de escalabilidad en proyectos grandes.
-
La metáfora del 'ensamblador'
- Ninja no implementa las funciones de distintos sistemas de compilación; solo implementa el grafo de acciones para que el usuario elija otros programas generadores.
- Este diseño hace que Ninja sea rápido y flexible.
-
La importancia de los valores predeterminados
- Ninja ejecuta comandos en paralelo de forma predeterminada, lo que permite builds paralelos más seguros que con Make.
-
Velocidad
- Ninja se enfocó en el rendimiento de builds incrementales en bases de código grandes, lo que influye mucho en la satisfacción de los usuarios.
- Ninja usa menos CPU, por lo que también mejora el rendimiento general del build.
-
CMake
- Ninja se integró bien con CMake, y gracias a esa integración se usó en el trabajo con LLVM.
-
Soporte para Windows
- Ninja también funciona en Windows, y muchos de sus primeros usuarios eran usuarios de Windows.
-
Trabajo relacionado
- El diseño de Ninja estuvo inspirado en blaze/bazel, el sistema de compilación de Google.
-
Mantenimiento de código abierto
- Mantener un proyecto de código abierto no es divertido, y hubo muchas exigencias y críticas por parte de los usuarios.
- El autor quería impresionar a otros hackers colegas a través del software.
-
Agradecimiento final
- Expresa su agradecimiento a los mantenedores y contribuidores de Ninja.
1 comentarios
Comentarios de Hacker News
Hay quienes opinan que en programación la arquitectura es más importante que escribir código, y que los temas sociales son aún más importantes que la arquitectura
Ninja tiene un papel importante en el sistema de compilación de Android
makefiles, pero luego se volvió más complejo consoong, un sistema de compilación declarativo personalizadokati, que convierteMakefilesen archivos de compilación de NinjaHay quien comenta que Google realizó investigaciones sobre la latencia y espera que esas investigaciones se hagan públicas
Hay quienes opinan que, al usar CMake, Ninja seguirá en uso por un tiempo porque es necesario para los módulos de C++20
Cambiaron de Ninja a Samurai y dicen que mejoró en todos los aspectos
Hay quienes opinan que hace falta un equilibrio entre exactitud, comodidad y rendimiento, y que hay que elegirlo de forma intencional
Hay quien tiene experiencia con sistemas de compilación y comenta que Ninja es lo bastante pequeño como para implementarlo en su lenguaje de programación favorito
Piensan que el nombre de Ninja es bueno y dicen que hay formas de hacerlo más rápido