2 puntos por GN⁺ 2024-11-30 | 1 comentarios | Compartir por WhatsApp
  • 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

 
GN⁺ 2024-11-30
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

    • Dicen que esto expresa muy bien una idea que han tenido en mente durante mucho tiempo
  • Ninja tiene un papel importante en el sistema de compilación de Android

    • Al principio se usaban makefiles, pero luego se volvió más complejo con soong, un sistema de compilación declarativo personalizado
    • Google desarrolló kati, que convierte Makefiles en archivos de compilación de Ninja
    • La transición a Ninja toma tiempo, pero una vez hecha funciona rápido
  • Hay 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

    • Consideran que un sistema de compilación necesita calcular el hash de todas las entradas y comprobar si existen en el registro
  • Hay quienes opinan que hace falta un equilibrio entre exactitud, comodidad y rendimiento, y que hay que elegirlo de forma intencional

    • Dicen que una herramienta que sacrifica exactitud por comodidad puede crear un ecosistema más preciso
  • 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

    • Se pregunta si existe un tutorial paso a paso para crear tu propio sistema de compilación
  • Piensan que el nombre de Ninja es bueno y dicen que hay formas de hacerlo más rápido

    • Explican que la herramienta intencionalmente no conserva el estado de ejecuciones anteriores