Ninja (система сборки) — Википедия
Ninja | |
---|---|
![]() | |
Тип | система сборки[вд] и утилита |
Разработчик | Эван Мартин[вд][2][3] |
Написана на | C++[4] и Python |
Интерфейс | CLI |
Операционные системы | Unix-подобная операционная система[5] и Windows[5] |
Языки интерфейса | английский |
Первый выпуск | 8 мая 2012[6][7] |
Аппаратная платформа | кроссплатформенность |
Последняя версия | |
Репозиторий | github.com/ninja-build/n… |
Состояние | активное |
Лицензия | Apache License 2.0[3] |
Сайт | ninja-build.org (англ.) |
![]() |
Ninja (МФА [nˈiɪnʤə]; с англ. — «ниндзя») — это кроссплатформенная консольная утилита, представляющая из себя систему сборки программного обеспечения из исходного кода. Утилита Ninja была разработана Эваном Мартином, сотрудником компании Google[8][9].
Ninja представляет собой улучшенную и доработанную версию утилиты Make. Главная цель которой — автоматизация сборки и её ускорение, а также ускорение последующих пересборок, на основе сгенерированных утилитой файлов и решение типовых проблем при кроссплатформенной разработке.
История
[править | править код]Система сборки Ninja была разработана с целью заменить устаревшие системы сборки, не рассчитанные на крупные проекты с большим количеством кода. Кодовая база таких проектов как браузер Google Chrome и операционная система Android уже на то время (2007—2012) составляла несколько миллионов строк кода и более 40 тыс. вхождений. Первоначально разработчики использовали систему сборки SCons, основанную на Python, но по заверению Эвана Мартина, SCons оказался слишком медленным и отнимал около 40 секунд на один лишь только запуск, перед тем как начиналась сама сборка. После чего была предпринята попытка перевода проектов на систему Make, но после проведения очередных тестов оказалось, что Make также отнимал около 10 секунд на запуск и 10—20 секунд на инкрементальную сборку. Помимо этого, Make и SCons зачастую вызывали различные проблемы с кроссплатформенной разработкой. Это не устраивало Эвана и сподвигло его к разработке новой системы сборки, не имеющей таких недостатков[8][10].
Впервые Эван Мартин сообщил о планах и причинах разработки Ninja в своём блоге 6 февраля 2011 года[11]. На следующий год (8 мая 2012) состоялся первой выпуск Ninja[12] версии 120508 и был размещён на GitHub репозитории[12].
О системе сборки
[править | править код]В ходе разработки система сборки Ninja приобрела множество новых особенностей, увеличивших скорость сборки[13][14][15]. Из таких особенностей можно отметить:
- Сокращение многократного и частого использования системы ввода-вывода (вывод всегда буферизируется);
- Процесс сборки по умолчанию запускается в параллельном режиме (задействуются все ядра доступных процессоров);
- Улучшена инкрементальная сборка (что значительно ускорило сборку проектов с большим количеством файлов и их дальнейшую пересборку);
- Добавлена специальная поддержка для обнаружения дополнительных зависимостей во время сборки (что позволяет легко корректировать зависимости заголовочных файлов для кода Си и C++)
- Использован re2c — генератор быстрых и легко встраиваемых лексеров, использующийся в разных проектах с целью ускорения лексического анализа[16][17].
Сам Эван не рекомендует писать сборочные скрипты Ninja вручную, по той простой причине, что синтаксис скриптов Ninja остался подобен Make синтаксису. Скорее всего, это было сделано, ради упрощения перевода программ с Make на Ninja и в угоду скорости исполнения, так как Make имеет довольно простую синтаксическую структуру и подобен языку ассемблера. По этой причине, написание на нём скриптов человеком, может быть затруднительным, а чтение и анализ синтаксиса программами, остаются тривиальными. Вместо ручного написания, рекомендуется использовать Ninja в сочетании с более «умными» системами мета-сборки (GYP, CMake, Meson и т. п.), имеющими встроенный генератор файлов Ninja[18].
Философия
[править | править код]Примерный перевод раздела о философии из руководства Ninja.
Эван Мартин. «The Ninja build system manual: Philosophical overview»[19]:
Там, где другие системы сборки являются языками высокого уровня, Ninja стремится быть ассемблером.
Системы сборки работают медленно, когда им нужно принимать решения. Когда вы находитесь в цикле редактирование-компиляция, вы хотите, чтобы он был как можно быстрее — вы хотите, чтобы система сборки выполняла минимальную работу, необходимую для определения именно того, что необходимо немедленно собрать.
Ninja содержит минимальную функциональность, необходимую для описания произвольных графов зависимостей. Отсутствие их синтаксиса делает невозможным выражение сложных решений.
Оригинальный текст (англ.)Where other build systems are high-level languages, Ninja aims to be an assembler.
Build systems get slow when they need to make decisions. When you are in a edit-compile cycle you want it to be as fast as possible — you want the build system to do the minimum work necessary to figure out what needs to be built immediately.
Ninja contains the barest functionality necessary to describe arbitrary dependency graphs. Its lack of syntax makes it impossible to express complex decisions..
Пример кода
[править | править код]Далее, приведён пример базового «.ninja» файла, демонстрирующего основную часть синтаксиса[20].
cflags = -Wall rule cc command = gcc $cflags -c $in -o $out build foo.o: cc foo.c
Критика
[править | править код]Ninja по умолчанию запускает сборку в параллельном режиме и задействует все доступные ресурсы компьютера. При определённых условиях это может привести к таким критичным проблемам, как переполнение буфера памяти или к перегреву вычислительного устройства, что случается с термоинтерфейсами, неспособными отводить большие объёмы тепла. Вследствие чего повышается риск программных ошибок из-за перегрева процессора и в итоге, может привести к аварийному отключению устройства.
Ninja не выводит подробный лог о процессе сборки, в угоду скорости исполнения, что затрудняет анализ при сборке и кросскомпиляции таких сложных программ, как ядро операционной системы, компилятор и им подобных.
См. также
[править | править код]Примечания
[править | править код]- ↑ Release 1.12.1 — 2024.
- ↑ Google Groups: ninja-build (англ.)
- ↑ 1 2 GitHub: COPYING (англ.)
- ↑ The Ninja (build system) on Open Hub: Languages Page (англ.)
- ↑ 1 2 https://ninja-build.org/manual.html#_using_ninja_for_your_project (англ.)
- ↑ GitHub: release-120508 (англ.) — 2013.
- ↑ release: ninja v120508 (англ.) — 2012.
- ↑ 1 2 Разработчики из компании Google открыли код системы сборки Ninja . OpenNET (8 февраля 2011). Дата обращения: 15 января 2022. Архивировано 16 января 2022 года.
- ↑ First release (англ.). GitHub (8 мая 2012). Дата обращения: 15 января 2022. Архивировано 16 января 2022 года.
- ↑ Эван Мартин. Ninja (англ.). aosabook.org. Дата обращения: 15 января 2022. Архивировано 3 октября 2019 года.
- ↑ Эван Мартин. Chromium Notes: Ninja, a new build system (англ.). neugierig.org (6 февраля 2011). Дата обращения: 15 января 2022. Архивировано 30 сентября 2019 года.
- ↑ 1 2 Эван Мартин. Google Groups: ninja-build (англ.). Google Groups (8 мая 2012). Дата обращения: 15 января 2022. Архивировано 18 января 2022 года.
- ↑ Ninja - small build system similar to make . OpenNET (18 февраля 2011). Дата обращения: 15 января 2022. Архивировано 16 января 2022 года.
- ↑ Эван Мартин. The Ninja build system manual: Comparison to Make (англ.). ninja-build.org. Дата обращения: 15 января 2022. Архивировано 16 января 2022 года.
- ↑ Дэвид Ротлис. Benchmarking the Ninja build system (англ.). rothlis.net (4 ноября 2016). Дата обращения: 15 января 2022. Архивировано 18 января 2022 года.
- ↑ Benchmarks (англ.). re2c.org. Дата обращения: 31 января 2022. Архивировано 31 января 2022 года.
- ↑ Ulya Trofimovich. RE2C: A lexer generator based on lookahead-TDFA (англ.) (PDF). re2c.org (2020). Дата обращения: 31 января 2022. Архивировано 27 января 2022 года.
- ↑ Эван Мартин. The Ninja build system manual: Using Ninja for your project (англ.). ninja-build.org. Дата обращения: 15 января 2022. Архивировано 16 января 2022 года.
- ↑ Эван Мартин. The Ninja build system manual: Philosophical overview (англ.). ninja-build.org. Дата обращения: 15 января 2022. Архивировано 16 января 2022 года.
- ↑ Эван Мартин. The Ninja build system manual: Syntax example (англ.). ninja-build.org. Дата обращения: 15 января 2022. Архивировано 16 января 2022 года.
Ссылки
[править | править код]- Официальный сайт (англ.)
- Руководство (англ.)
- Репозиторий проекта (англ.)
- Часто задаваемые вопросы (англ.)
- Расчёты скорости (англ.)
- Список генераторов, создающих файлы сборки ninja (англ.)