Ninja (sistema de construcción)

ninja
Tipo de herramienta de automatización de compilación [d] yutilidad
Desarrollador Evan Martín [d] [1][2]
Escrito en C++ [3] y Python
Interfaz CLI
Sistema operativo Sistema operativo similar a Unix [4] y Microsoft Windows [4]
Idiomas de la interfaz inglés
Primera edición 8 de mayo de 2012 [5] [6]
plataforma de hardware multiplataforma
ultima versión
Estado activo
Licencia Licencia Apache 2.0 [2]
Sitio web ninja-build.org
 Archivos multimedia en Wikimedia Commons

Ninja ( MFA [ n ˈ i ɪ n ʤ ə ]; del  inglés  -  " ninja ") es una utilidad de consola multiplataforma que es un sistema para crear software a partir del código fuente . La utilidad Ninja fue desarrollada por Evan Martin de Google [8] [9] .

Ninja es una versión mejorada y mejorada de la utilidad Make . El objetivo principal es automatizar la compilación y acelerarla, así como acelerar las reconstrucciones posteriores en función de los archivos generados por la utilidad y resolver problemas típicos en el desarrollo multiplataforma.

Historia

El sistema de compilación Ninja fue diseñado para reemplazar los sistemas de compilación heredados que no fueron diseñados para grandes proyectos con mucho código. El código base de proyectos como el navegador Google Chrome y el sistema operativo Android ya en ese momento (2007-2012) ascendía a varios millones de líneas de código y más de 40 mil entradas. Inicialmente, los desarrolladores utilizaron el sistema de compilación SCons basado en Python , pero según Evan Martin, SCons resultó ser demasiado lento y tardó unos 40 segundos en ejecutarse justo antes de que comenzara la compilación. Después de eso, se intentó transferir proyectos al sistema Make, pero después de realizar las siguientes pruebas , resultó que Make también tardó unos 10 segundos en iniciarse y entre 10 y 20 segundos en compilaciones incrementales. Además, Make y SCons a menudo causaron varios problemas con el desarrollo multiplataforma. Esto no convenía a Evan y lo impulsó a desarrollar un nuevo sistema de compilación que no tiene tales deficiencias [8] [10] .

Evan Martin anunció por primera vez los planes y las razones detrás del desarrollo de Ninja en su blog el 6 de febrero de 2011 [11] . Al año siguiente (8 de mayo de 2012) tuvo lugar el primer lanzamiento de Ninja [12] versión 120508 y se colocó en el repositorio de GitHub [12] .

Sobre el sistema de compilación

Durante el desarrollo, el sistema de compilación Ninja adquirió muchas características nuevas que aumentaron la velocidad de compilación [13] [14] [15] . Estas características incluyen:

Evan mismo no recomienda escribir scripts de compilación Ninja a mano, por la sencilla razón de que la sintaxis del script Ninja sigue siendo similar a la sintaxis Make. Lo más probable es que esto se haya hecho para simplificar la traducción de programas de Make a Ninja y en aras de la velocidad de ejecución, ya que Make tiene una estructura sintáctica bastante simple y es similar al lenguaje ensamblador . Por esta razón, escribir scripts en él por parte de un humano puede ser difícil, mientras que leer y analizar la sintaxis por parte de los programas sigue siendo trivial. En lugar de escribirlo a mano, se recomienda usar Ninja en combinación con sistemas de metaconstrucción más inteligentes ( GYP , CMake , Meson , etc.) que tienen un generador de archivos Ninja incorporado [18] .

Filosofía

Traducción aproximada de la sección de filosofía del manual Ninja.

Eva Martín. "El manual del sistema de compilación Ninja: descripción general filosófica" [19] :

Donde otros sistemas de ensamblaje son lenguajes de alto nivel, Ninja pretende ser un ensamblador.

Los sistemas de compilación son lentos cuando necesitan tomar decisiones. Cuando se encuentra en un ciclo de edición y compilación, desea que sea lo más rápido posible: desea que el sistema de compilación haga el trabajo mínimo necesario para determinar exactamente lo que se debe compilar de inmediato.

Ninja contiene la funcionalidad mínima necesaria para describir gráficos de dependencia arbitrarios. La ausencia de su sintaxis hace que sea imposible expresar soluciones complejas.

Texto original  (inglés)[ mostrarocultar]

Donde otros sistemas de compilación son lenguajes de alto nivel, Ninja pretende ser un ensamblador.

Los sistemas de compilación se vuelven lentos cuando necesitan tomar decisiones. Cuando se encuentra en un ciclo de edición y compilación, desea que sea lo más rápido posible: desea que el sistema de compilación haga el trabajo mínimo necesario para descubrir qué se debe compilar de inmediato.

Ninja contiene la funcionalidad mínima necesaria para describir gráficos de dependencia arbitrarios. Su falta de sintaxis hace que sea imposible expresar decisiones complejas.

Código de ejemplo

El siguiente es un ejemplo de un archivo ".ninja" básico que demuestra la parte principal de la sintaxis [20] .

cflags = -Pared regla cc comando = gcc $cflags -c $in -o $out construir foo.o : cc foo . C

Crítica

Ninja ejecuta la compilación en paralelo de forma predeterminada y utiliza todos los recursos disponibles en la máquina. En determinadas condiciones, esto puede provocar problemas críticos, como el desbordamiento del búfer de memoria o el sobrecalentamiento de un dispositivo informático, lo que sucede con las interfaces térmicas que no pueden eliminar grandes cantidades de calor. Como resultado, aumenta el riesgo de errores de software debido al sobrecalentamiento del procesador y, como resultado, puede provocar un apagado de emergencia del dispositivo.

Ninja no muestra un registro detallado sobre el proceso de construcción, en aras de la velocidad de ejecución, lo que dificulta el análisis al construir y compilar de forma cruzada programas tan complejos como el kernel del sistema operativo , el compilador y similares.

Véase también

Notas

  1. ↑ Grupos de Google : construcción ninja 
  2. 1 2 GitHub:  COPIAR
  3. ↑ The Ninja (sistema de compilación ) en Open Hub: página de idiomas 
  4. 1 2 https://ninja-build.org/manual.html#_using_ninja_for_your_project  _
  5. GitHub: release-120508  (ing.) - 2013.
  6. lanzamiento: ninja v120508  (ing.) - 2012.
  7. Versión 1.11.1 - 2022.
  8. 1 2 Desarrolladores de Google de código abierto del sistema de compilación Ninja . OpenNET (8 de febrero de 2011). Consultado el 15 de enero de 2022. Archivado desde el original el 16 de enero de 2022.
  9. Primera publicación  . GitHub (8 de mayo de 2012). Consultado el 15 de enero de 2022. Archivado desde el original el 16 de enero de 2022.
  10. Evan Martín. Ninja  (inglés) . aosabook.org . Consultado el 15 de enero de 2022. Archivado desde el original el 3 de octubre de 2019.
  11. Evan Martín. Notas de cromo : Ninja, un nuevo sistema de compilación  . neugierig.org (6 de febrero de 2011). Consultado el 15 de enero de 2022. Archivado desde el original el 30 de septiembre de 2019.
  12. 1 2 Evan Martín. Grupos de Google: ninja-build  (inglés) . Grupos de Google (8 de mayo de 2012). Consultado el 15 de enero de 2022. Archivado desde el original el 18 de enero de 2022.
  13. Ninja: sistema de compilación pequeño similar a make . OpenNET (18 de febrero de 2011). Consultado el 15 de enero de 2022. Archivado desde el original el 16 de enero de 2022.
  14. Evan Martín. El manual del sistema de compilación Ninja : Comparación con Make  . ninja-build.org _ Consultado el 15 de enero de 2022. Archivado desde el original el 16 de enero de 2022.
  15. David Rothlis. Evaluación comparativa del sistema de compilación Ninja  . rothlis.net (2016-11-4). Consultado el 15 de enero de 2022. Archivado desde el original el 18 de enero de 2022.
  16. ↑ Puntos de referencia  . _ www.re2c.org . Consultado el 31 de enero de 2022. Archivado desde el original el 31 de enero de 2022.
  17. Ulia Trofimovich. RE2C: un generador lexer basado en lookahead-TDFA  (inglés) (PDF). www.re2c.org (2020). Consultado el 31 de enero de 2022. Archivado desde el original el 27 de enero de 2022.
  18. Evan Martín. El manual del sistema de compilación Ninja: uso de Ninja para su  proyecto . ninja-build.org _ Consultado el 15 de enero de 2022. Archivado desde el original el 16 de enero de 2022.
  19. Evan Martín. El manual del sistema de compilación Ninja: descripción general filosófica  (inglés) . ninja-build.org _ Consultado el 15 de enero de 2022. Archivado desde el original el 16 de enero de 2022.
  20. Evan Martín. El manual del sistema de compilación Ninja: ejemplo de sintaxis  (inglés) . ninja-build.org _ Consultado el 15 de enero de 2022. Archivado desde el original el 16 de enero de 2022.

Enlaces