Ninja

Программные средства разработки

Модераторы: Olej, vikos

Аватара пользователя
Olej
Писатель
Сообщения: 14300
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Ninja

Непрочитанное сообщение Olej » 14 фев 2021, 12:36

Система сборки Ninja.
Предложена Google взамен много десятилетней системе make.
Аргументация: значительное ускорение сборки крупных проектов (первоначально была применена в сборке Chromium/Chrome, компиляция-сборка которого может идти и часы).

Аватара пользователя
Olej
Писатель
Сообщения: 14300
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Ninja

Непрочитанное сообщение Olej » 14 фев 2021, 12:41

В 2-х словах, "на пальцах", описана в не очень свежей публикации (2012-2013) Ninja:
(перевод) от автора разработки Ninja:
Ninja является системой сборки проектов, аналогичной системе Make. В качестве ее входных данных используются команды, необходимые для преобразования исходных файлов в целевые файлы. Ninja использует эти команды для поддержания целевых файлов в актуальном состоянии. В отличие от многих других систем сборки проектов, главная цель процесса проектирования системы Ninja заключалась в достижении максимальной скорости работы.

Я разрабатывал Ninja во время работы над Google Chrome. Работа над Ninja была начата в рамках эксперимента, нацеленного на установление того, может ли быть ускорена сборка Chrome. Для возможности успешной сборки Chrome была добавлена дополнительная цель процесса проектирования: система Ninja должна была без лишних сложностей интегрироваться в состав более масштабной системы сборки проектов.
Я работал над Chrome с 2007 до 2012 года, а разработку системы Ninja начал в 2010 году. Существует множество факторов, влияющих на производительность процесса сборки такого значительного проекта, как Chrome (на сегодняшний день исходный код проекта состоит из 40000 файлов кода на языке C++, на основе которых генерируется бинарный файл размером около 90МБ). Во время работы я исследовал многие из них, начиная от распределения процесса компиляции между несколькими машинами и заканчивая различными приемами, направленными на оптимизацию процесса связывания. Система Ninja в большей степени использует единственный фактор - фронт сборки. Этот параметр характеризует период времени ожидания с начала сборки до момента выполнения первой операции компиляции. Для понимания важности этого фактора необходимо понять сформулированные нами принципы достижения высокой производительности самого браузера Chrome.
Действительно ли миллисекунды имеют такое большое значение? При рассмотрении более важных проблем программного обеспечения беспокойство о них может оказаться глупым. Однако, после работы над проектами, которые собираются долго, мне показалось, что повышается не только продуктивность работы; быстрый цикл сборки придает ощущение легкости, которое доставляет радость при работе с проектом. А наличие кода, с которым приятно работать, является главной причиной разработки мною программного обеспечения. В этом смысле скорость имеет первоочередное значение.

Аватара пользователя
Olej
Писатель
Сообщения: 14300
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Ninja

Непрочитанное сообщение Olej » 14 фев 2021, 12:56

Полное описание системы от разработчиков - более чем "необходимо и достаточно" для использования, The Ninja build system :
v1.10.2, Nov 2020

Аватара пользователя
Olej
Писатель
Сообщения: 14300
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Ninja

Непрочитанное сообщение Olej » 14 фев 2021, 13:36

Olej писал(а):
14 фев 2021, 12:56
Полное описание системы от разработчиков - более чем "необходимо и достаточно" для использования, The Ninja build system :
Простейший пример использования ... который я допишу в уже существующий ранее тест с Makefile ... содержимое файла build.ninja:

Код: Выделить всё

olej@nvme:~/2021/OWN_TEST.codes/VLA$ cat build.ninja 
cppflags = -Wall -pedantic -std=c++17

rule cpp
  command = g++ $cppflags -c $in -o $out

build vla: cpp vla.cc
P.S. Тут же, для сравнения, аналогичный файл более привычного Makefile, применявшийся раньше для сборки теста:

Код: Выделить всё

CXX += -Wall -pedantic -std=c++17

all: vla

vla:    vla.cc
        $(CXX) $< -o $@
Аналогия очевидная...

Аватара пользователя
Olej
Писатель
Сообщения: 14300
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Ninja

Непрочитанное сообщение Olej » 14 фев 2021, 13:44

Olej писал(а):
14 фев 2021, 13:36
Простейший пример использования
Сборка:

Код: Выделить всё

olej@nvme:~/2021/OWN_TEST.codes/VLA$ ninja
[1/1] g++ -Wall -pedantic -std=c++17 -c vla.cc -o vla
vla.cc: In function ‘int main(int, char**)’:
vla.cc:17:6: warning: ISO C++ forbids variable length array ‘arr_num’ [-Wvla]
   17 |  int arr_num[ num ]; // Variable-Length Arrays (ISO/IEC 9899:1999)
      |      ^~~~~~~
vla.cc:27:7: warning: ISO C++ forbids variable length array ‘arr_log’ [-Wvla]
   27 |  bool arr_log[ num2 ];
      |       ^~~~~~~
Результат:

Код: Выделить всё

olej@nvme:~/2021/OWN_TEST.codes/VLA$ ls -l vla
-rw-rw-r-- 1 olej olej 26104 фев 14 12:20 vla

olej@nvme:~/2021/OWN_TEST.codes/VLA$ ./vla 30
< -74  51  -8  7  -56  -91  36  36  87  -23  4  67  -94  -90  6  34  -99  -23  -87  -17  38  18  87  70  5  -82  31  -17  40  82 >
< -  +  -  +  -  -  +  +  +  -  +  +  -  -  +  +  -  -  -  -  +  +  +  +  +  -  +  -  +  + >
(это не важно что оно там считает ;-) )

Аватара пользователя
Olej
Писатель
Сообщения: 14300
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Ninja

Непрочитанное сообщение Olej » 14 фев 2021, 13:49

Olej писал(а):
14 фев 2021, 13:44
Сборка:
Варианты запуска:

Код: Выделить всё

olej@nvme:~$ ninja -h
usage: ninja [options] [targets...]

if targets are unspecified, builds the 'default' target (see manual).

options:
  --version      print ninja version ("1.10.0")
  -v, --verbose  show all command lines while building

  -C DIR   change to DIR before doing anything else
  -f FILE  specify input build file [default=build.ninja]

  -j N     run N jobs in parallel (0 means infinity) [default=3 on this system]
  -k N     keep going until N jobs fail (0 means infinity) [default=1]
  -l N     do not start new jobs if the load average is greater than N
  -n       dry run (don't run commands but act like they succeeded)

  -d MODE  enable debugging (use '-d list' to list modes)
  -t TOOL  run a subtool (use '-t list' to list subtools)
    terminates toplevel options; further flags are passed to the tool
  -w FLAG  adjust warnings (use '-w list' to list warnings)
Указание конкретной цели, которых внутри build.ninja может быть много:

Код: Выделить всё

olej@nvme:~/2021/OWN_TEST.codes/VLA$ ninja vla
[1/1] g++ -Wall -pedantic -std=c++17 -c vla.cc -o vla
vla.cc: In function ‘int main(int, char**)’:
vla.cc:17:6: warning: ISO C++ forbids variable length array ‘arr_num’ [-Wvla]
   17 |  int arr_num[ num ]; // Variable-Length Arrays (ISO/IEC 9899:1999)
      |      ^~~~~~~
vla.cc:27:7: warning: ISO C++ forbids variable length array ‘arr_log’ [-Wvla]
   27 |  bool arr_log[ num2 ];
      |       ^~~~~~~
То же самое, но в 4 параллельных потока сборки:

Код: Выделить всё

olej@nvme:~/2021/OWN_TEST.codes/VLA$ ninja -j4 vla
[1/1] g++ -Wall -pedantic -std=c++17 -c vla.cc -o vla
vla.cc: In function ‘int main(int, char**)’:
vla.cc:17:6: warning: ISO C++ forbids variable length array ‘arr_num’ [-Wvla]
   17 |  int arr_num[ num ]; // Variable-Length Arrays (ISO/IEC 9899:1999)
      |      ^~~~~~~
vla.cc:27:7: warning: ISO C++ forbids variable length array ‘arr_log’ [-Wvla]
   27 |  bool arr_log[ num2 ];
      |       ^~~~~~~

Ответить

Вернуться в «Инструменты программирования»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость