Ninja
The Performance of Open Source Application
devgrapher@gmail.com
2014. 6. 28.
Ninja Overview
A small build system with a focus on speed
Ninja
Make ์™€ ๊ฐ™์€ ๋นŒ๋“œ ์‹œ์Šคํ…œ
์ž‘๊ณ  ์†๋„์— ์ตœ์ ํ™”
Google Chrome ์šฉ์œผ๋กœ ์‹œ์ž‘
ํƒ„์ƒ ๋ฐฐ๊ฒฝ
Google Chome์˜ ์†Œ์Šค ํŒŒ์ผ ํฌ๊ธฐ๋Š” 4๋งŒ๊ฐœ ์ด์ƒ
์ „์ฒด๋นŒ๋“œ ์†Œ์š”์‹œ๊ฐ„ 1์‹œ๊ฐ„ (i7, 16GB, SSD)
์†Œ์Šค ํ•œ ์ค„ ์ˆ˜์ •ํ›„ ์ฆ๋ถ„ ๋นŒ๋“œ ์‹œ๊ฐ„ 5๋ถ„
๋Œ€๋ถ€๋ถ„ Link ์ž‘์—…์— ์†Œ์š”๋จ
Chrome์˜ ๋นŒ๋“œ๊ตฌ์กฐ
GYP, ํ”Œ๋žซํผ ๋…๋ฆฝ์ ์ธ ํƒ€๊ฒŸ ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ
Visual Studio, Xcode, Ninja
๋นŒ๋“œ์— ํฌํ•จํ• , .cc, .h ๋“ฑ์˜ ํŒŒ์ผ๋“ค์˜ ๋‚˜์—ด
Ninja, ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ๋นŒ๋“œํ•  ํŒŒ์ผ์„ ์ƒ์„ฑ
์ปค๋งจ๋“œ๋ผ์ธ ๋ช…๋ น์˜ ๋‚˜์—ด
gcc -c foo.c -o foo.o
Compiler, ์‹ค์ œ ๋นŒ๋“œ ์ž‘์—…์„ ์ˆ˜ํ–‰
GYP Ninja Compiler
Ninja๊ฐ€ ํ•˜๋Š” ์ผ
Rule ์ƒ์„ฑ
!
!
๋ณ€์ˆ˜
cflags = -Wall
rule compile
command = gcc $cflags -c $in -o $out
rule compile
command = gcc -Wall -c $in -o $out
build out/foo.o: compile src/foo.c
build out/bar.o: compile src/bar.c
์ถ”์ƒํ™”
ํ…์ŠคํŠธ ๊ธฐ๋ฐ˜, ๊ฐ€๋…์„ฑ์ด ์ค‘์š”
Ninja๊ฐ€ ํ•˜๋Š” ์ผ
๋นŒ๋“œ๊ฐ€ ํ•„์š”ํ•œ ๋Œ€์ƒ์„ ์ฐพ๊ธฐ
๋นŒ๋“œ ์˜์กด์„ฑ ๊ทธ๋ž˜ํ”„ ์ƒ์„ฑ
ํŠน์ • ๋…ธ๋“œ๊ฐ€ ์ˆ˜์ •๋˜์—ˆ์œผ๋ฉด ์˜์กด์„ฑ ๊ทธ๋ž˜ํ”„์— ๋”ฐ๋ผ ๋นŒ๋“œํ•ด์•ผํ•  ์ง‘ํ•ฉ ์ƒ์„ฑ
์‹คํ–‰
๋นŒ๋“œ๊ฐ€ ํ•„์š”ํ•œ ๊ทธ๋ž˜ํ”„ ๊ฐ„์„ ์„ ๋”ฐ๋ผ๋‹ค๋‹ˆ๋ฉฐ ๋นŒ๋“œ ์‹คํ–‰
Optimizing Ninja
A small build system with a focus on speed
๋ฌธ์ž์—ด ํŒŒ์‹ฑ
Chrome์€ 10MB ์ด์ƒ์˜ Ninja ์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์„ ์ƒ์„ฑํ•จ
static bool IsIdentifierCharacter(char c) {
return
('a' <= c && c <= 'z') ||
('A' <= c && c <= 'Z') ||
// and so on...
}
cs = set()
for c in string.ascii_letters + string.digits + r'+,-./_$':
cs.add(ord(c))
for i in range(256):
print '%d,' % (i in cs),
Lookup Table ์ด์šฉ
์ •๊ทœํ™”
Ninja๋Š” ์ˆ˜๋งŽ์€ ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ๋‹ค๋ฃจ๋ฏ€๋กœ ์ตœ์ ํ™”๋œ ๊ฒฝ๋กœ ์‹๋ณ„ ๋ฐฉ๋ฒ• ํ•„์š”
/bar.h
/foo/../bar.h
/bar.h
/bar.cc
/abc.h
/abc.c
๊ฒฝ๋กœ ๊ฐ์ฒด ๊ฒฝ๋กœ ๋น„๊ต
0x2000
0x3000
Memory Addr
๋‹จ์ˆœ ํฌ์ธํ„ฐ ๋น„๊ต์—ฐ์‚ฐ
โ‰ 
๋นŒ๋“œ ๋กœ๊ทธ
์ด์ „ ๋นŒ๋“œ์™€ ์ƒˆ๋กœ์šด ๋นŒ๋“œ๊ฐ„์˜ ๋กœ๊ทธ๋ฅผ ๋น„๊ตํ•ด์•ผํ•จ
์ด ์—ญ์‹œ ๋‹ค๋Ÿ‰์˜ ๋ฌธ์ž์—ด ๋น„๊ต์ด๋ฏ€๋กœ ๋ณ‘๋ชฉ์ง€์ ์ž„
๋ฌธ์ž์—ด ๋Œ€์‹  ๋ช…๋ น์˜ ํ•ด์‹œ๋ฅผ ๊ธฐ๋กํ•˜๊ณ  ๋น„๊ต
200MB -> 2MB ๋ฏธ๋งŒ, 20๋ฐฐ ์‹œ๊ฐ„ ๋‹จ์ถ•
์˜์กด์„ฑ ํŒŒ์ผ ๋ถ„์„
#include โ€œbar.hโ€
โ€ฆ
foo.c
#include โ€œbaz.hโ€
โ€ฆ
bar.h
class foo; baz.h
#include โ€œbar.hโ€
โ€ฆ
#include โ€œbaz.hโ€
โ€ฆ
class bar;
baz.h ์ˆ˜์ •
๋ชจ๋‘ ์žฌ๋นŒ๋“œ ํ•„์š”
์˜์กด์„ฑ ํŒŒ์ผ ๋ถ„์„
๋ฐฉ๋ฒ•๋“ค
ํ—ค๋” ์Šค์บ๋„ˆ ์‚ฌ์šฉ, ๋А๋ฆฌ๊ณ  ๋ถ€์ •ํ™•
์˜์กด์„ฑ์„ ์ผ์ผ์ด ๋นŒ๋“œํŒŒ์ผ์— ์ˆ˜์ž‘์—…์œผ๋กœ ๋ช…์‹œ, ์œ ์ง€๋ณด์ˆ˜ ์–ด๋ ค์›€
์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ปดํŒŒ์ผ์‹œ์ ์— ์ถœ๋ ฅํ•˜๊ฒŒ ํ•จ.(gcc, visual studio ๋ชจ๋‘์ง€์›)
gcc -> Makefile ํ˜•์‹์œผ๋กœ ์˜์กด์„ฑ ์ถœ๋ ฅ
์ด ์šฉ๋Ÿ‰ ์•ฝ 90MB. ๋นŒ๋“œ์‹œ์ž‘ํ• ๋•Œ ์ด๊ฑธ ๋ชจ๋‘ ๋ถ„์„ํ•œ ๋’ค์— ๋นŒ๋“œ๋ฅผ ์‹œ์ž‘ํ•˜๊ธฐ์—” ์‹œ๊ฐ„์†Œ๋ชจ๊ฐ€ ํผ
์˜์กด์„ฑ ์ฒ˜๋ฆฌ์‹œ์ ์„ ์ง€์—ฐ
์ปดํŒŒ์ผ์ด ์ด๋ค„์ง€๋Š” ๋™์•ˆ Ninja๊ฐ€ ํ•˜๋Š” ์ผ์€ ์ปดํŒŒ์ผ๋Ÿฌ ํ”„๋กœ์„ธ์Šค ์ข…๋ฃŒ๋ฅผ ๋Œ€๊ธฐํ•˜๋Š” ๊ฒƒ ๋ฟ, ์ด์‹œ๊ฐ„์„ ์ด์šฉ
๋Œ€๊ธฐ์‹œ๊ฐ„๋™์•ˆ ์˜์กด์„ฑ ์ •๋ณดํŒŒ์ผ์„ ํŒŒ์‹ฑ, ์ •๊ทœํ™”, ์˜์กด์„ฑ ์ฒ˜๋ฆฌ
๋นŒ๋“œ์˜ ์‹คํ–‰
๋นŒ๋“œ ์‹คํ–‰์„ฑ๋Šฅ์€ ์ „์ ์œผ๋กœ ์ปดํŒŒ์ผ๋Ÿฌ์— ์˜์กด
๋ณ‘๋ ฌ์‹คํ–‰์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฒ„ํผ์— ์ €์žฅํ›„ ์ˆœ์ฐจ์ ์œผ๋กœ ์ถœ๋ ฅ
๋ช…๋ นํ–‰ ๋ฒ„ํผ๋ง.
๋นŒ๋“œ ์„ฑ๊ณต์‹œ ์ถœ๋ ฅ์€ ๋‹จ ํ•œ์ค„
Ninja๊ฐ€ ๋น ๋ฅด๋‹ค๋Š” ๋А๋‚Œ์„ ์ฃผ๋Š”๋ฐ ์ผ์กฐ.
์กฐ์šฉํžˆ ๋น ๋ฅด๊ฒŒ ์น˜๊ณ  ๋น ์ง„๋‹ค๋Š” ํŠน์ง•์—์„œ Ninja์˜ ์ด๋ฆ„์ด ๋น„๋กฏ๋จ
Windows ์ด์Šˆ
๋ช…๋ น์ค„์˜ ์ตœ๋Œ€ ๊ธธ์ด๊ฐ€ ๋น„๊ต์  ์งง์Œ (8191 chars)
ํŒŒ์ผ์—ฐ์‚ฐ์ด ๋А๋ฆผ
GetFileAttributesEx()๋Š” ๋ฆฌ๋ˆ…์Šค์˜ stat()๋ณด๋‹ค 100๋ฐฐ๋Š” ๋А๋ฆผ
ํŒŒ์ผ ์˜์กด์„ฑ ์ถœ๋ ฅ ์ด์Šˆ
Visual Studio ์˜์กด์„ฑ ํŒŒ์ผ
gcc
Makefile ํ˜•์‹
๋ณ€ํ™˜ํŒŒ์ผ ์ƒ์„ฑ
Windows ์ด์Šˆ
๋ช…๋ น์ค„์˜ ์ตœ๋Œ€ ๊ธธ์ด๊ฐ€ ๋น„๊ต์  ์งง์Œ (8191 chars)
ํŒŒ์ผ์—ฐ์‚ฐ์ด ๋А๋ฆผ
GetFileAttributesEx()๋Š” ๋ฆฌ๋ˆ…์Šค์˜ stat()๋ณด๋‹ค 100๋ฐฐ๋Š” ๋А๋ฆผ
ํŒŒ์ผ ์˜์กด์„ฑ ์ถœ๋ ฅ ์ด์Šˆ
Visual Studio ์˜์กด์„ฑ ํŒŒ์ผ
gcc
Makefile ํ˜•์‹
๋ณ€ํ™˜ํŒŒ์ผ ์ƒ์„ฑ
๋ณ‘๋ชฉ์ง€์ 
Windows ์ด์Šˆ
๋ช…๋ น์ค„์˜ ์ตœ๋Œ€ ๊ธธ์ด๊ฐ€ ๋น„๊ต์  ์งง์Œ (8191 chars)
ํŒŒ์ผ์—ฐ์‚ฐ์ด ๋А๋ฆผ
GetFileAttributesEx()๋Š” ๋ฆฌ๋ˆ…์Šค์˜ stat()๋ณด๋‹ค 100๋ฐฐ๋Š” ๋А๋ฆผ
ํŒŒ์ผ ์˜์กด์„ฑ ์ถœ๋ ฅ ์ด์Šˆ
Visual Studio
Ninja ๋ช…๋ นํ–‰
๋ฒ„ํผ๋ง ๊ธฐ๋Šฅ
gcc
Makefile ํ˜•์‹
๋ณ€ํ™˜๋ช…๋ นํ–‰ ์ถœ๋ ฅ
๊ธฐ์กด์˜ ๋ช…๋ นํ–‰ ๋ฒ„ํผ๋ง ๊ธฐ๋Šฅ์„ ์žฌ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ผ์ž‘์—… ์ œ๊ฑฐ
Design Principles
A small build system with a focus on speed
Design Principles
๋” ์ตœ์ ํ™” ํ•˜๊ธฐ, Ninja Daemon
PC์— ํ•ญ์ƒ ์ƒ์ฃผํ•˜์—ฌ ํŒŒ์ผ์ˆ˜์ •๊ฐ์‹œ, ์„ฑ๋Šฅ ํ–ฅ์ƒ ๊ฐ€๋Šฅ
ํ•˜์ง€๋งŒ Ninja์˜ ์„ค๊ณ„ ์›์น™์€ Simplicity
๋‹จ์ˆœํ•จ์€ ์†Œํ”„ํŠธ์›จ์–ด ์„ค๊ณ„์˜ ๋ฏธ๋•
์ค‘์š”ํ•œ๊ฑด ์–ผ๋งˆ๋‚˜ ๋‹จ์ˆœํ•จ์„ ์˜ค๋ž˜ ์œ ์ง€ํ•˜๋Š”๊ฐ€
๋ณต์žกํ•œ ์ž‘๋™๋ฐฉ์‹์„ ๋™์›ํ•˜๋Š” ๋Œ€์‹  ์ž‘์—…์„ ์ค„์ž„์œผ๋กœ์จ ์†๋„๋ฅผ ์˜ฌ๋ฆฐ๋‹ค๋Š” ์›์น™
Design Principles
์ตœ๋Œ€ํ•œ ๋งŽ์€ ๊ธฐ๋Šฅ๋“ค์„ ๋‹ค๋ฅธ ๋„๊ตฌ์— ์œ„์ž„
GYP, CMake
Ninja ์ž์‹ ์€ ๋นŒ๋“œ๋ฅผ ๋งŒ๋“ค์–ด๋‚ด๋Š” ๋ชฉํ‘œ ํ•˜๋‚˜์—๋งŒ ์ง‘์ค‘
๋•๋ถ„์— ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ์—์„œ ๊ฐ€์ ธ๋‹ค ์กฐ๋ฆฝํ•ด ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฌ์›€
๋น ๋ฅธ ๋นŒ๋“œ์˜ ์˜๋ฏธ
ํ”„๋กœ์ ํŠธ๊ฐ€ ๊ฐ€๋ณ๋‹ค๋Š” ์ธ์ƒ์„ ์ฃผ๋ฉด ํ”„๋กœ์ ํŠธ๋ฅผ ๊ฐ€์ง€๊ณ  ๋…ธ๋Š” ๊ฒƒ์ด ์ฆ๊ฑฐ์›Œ์ง„๋‹ค
๊ฐ€์ง€๊ณ  ๋†€๊ธฐ ์ข‹์€ ์ฝ”๋“œ๊ฐ€ ์†Œํ”„ํŠธ์›จ์–ด ์ž‘์„ฑ์˜ ๋ชฉํ‘œ
References
http://martine.github.io/ninja/
http://aosabook.org/en/posa/ninja.html

Ninja

  • 1.
    Ninja The Performance ofOpen Source Application devgrapher@gmail.com 2014. 6. 28.
  • 2.
    Ninja Overview A smallbuild system with a focus on speed
  • 3.
    Ninja Make ์™€ ๊ฐ™์€๋นŒ๋“œ ์‹œ์Šคํ…œ ์ž‘๊ณ  ์†๋„์— ์ตœ์ ํ™” Google Chrome ์šฉ์œผ๋กœ ์‹œ์ž‘
  • 4.
    ํƒ„์ƒ ๋ฐฐ๊ฒฝ Google Chome์˜์†Œ์Šค ํŒŒ์ผ ํฌ๊ธฐ๋Š” 4๋งŒ๊ฐœ ์ด์ƒ ์ „์ฒด๋นŒ๋“œ ์†Œ์š”์‹œ๊ฐ„ 1์‹œ๊ฐ„ (i7, 16GB, SSD) ์†Œ์Šค ํ•œ ์ค„ ์ˆ˜์ •ํ›„ ์ฆ๋ถ„ ๋นŒ๋“œ ์‹œ๊ฐ„ 5๋ถ„ ๋Œ€๋ถ€๋ถ„ Link ์ž‘์—…์— ์†Œ์š”๋จ
  • 5.
    Chrome์˜ ๋นŒ๋“œ๊ตฌ์กฐ GYP, ํ”Œ๋žซํผ๋…๋ฆฝ์ ์ธ ํƒ€๊ฒŸ ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ Visual Studio, Xcode, Ninja ๋นŒ๋“œ์— ํฌํ•จํ• , .cc, .h ๋“ฑ์˜ ํŒŒ์ผ๋“ค์˜ ๋‚˜์—ด Ninja, ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ๋นŒ๋“œํ•  ํŒŒ์ผ์„ ์ƒ์„ฑ ์ปค๋งจ๋“œ๋ผ์ธ ๋ช…๋ น์˜ ๋‚˜์—ด gcc -c foo.c -o foo.o Compiler, ์‹ค์ œ ๋นŒ๋“œ ์ž‘์—…์„ ์ˆ˜ํ–‰ GYP Ninja Compiler
  • 6.
    Ninja๊ฐ€ ํ•˜๋Š” ์ผ Rule์ƒ์„ฑ ! ! ๋ณ€์ˆ˜ cflags = -Wall rule compile command = gcc $cflags -c $in -o $out rule compile command = gcc -Wall -c $in -o $out build out/foo.o: compile src/foo.c build out/bar.o: compile src/bar.c ์ถ”์ƒํ™” ํ…์ŠคํŠธ ๊ธฐ๋ฐ˜, ๊ฐ€๋…์„ฑ์ด ์ค‘์š”
  • 7.
    Ninja๊ฐ€ ํ•˜๋Š” ์ผ ๋นŒ๋“œ๊ฐ€ํ•„์š”ํ•œ ๋Œ€์ƒ์„ ์ฐพ๊ธฐ ๋นŒ๋“œ ์˜์กด์„ฑ ๊ทธ๋ž˜ํ”„ ์ƒ์„ฑ ํŠน์ • ๋…ธ๋“œ๊ฐ€ ์ˆ˜์ •๋˜์—ˆ์œผ๋ฉด ์˜์กด์„ฑ ๊ทธ๋ž˜ํ”„์— ๋”ฐ๋ผ ๋นŒ๋“œํ•ด์•ผํ•  ์ง‘ํ•ฉ ์ƒ์„ฑ ์‹คํ–‰ ๋นŒ๋“œ๊ฐ€ ํ•„์š”ํ•œ ๊ทธ๋ž˜ํ”„ ๊ฐ„์„ ์„ ๋”ฐ๋ผ๋‹ค๋‹ˆ๋ฉฐ ๋นŒ๋“œ ์‹คํ–‰
  • 8.
    Optimizing Ninja A smallbuild system with a focus on speed
  • 9.
    ๋ฌธ์ž์—ด ํŒŒ์‹ฑ Chrome์€ 10MB์ด์ƒ์˜ Ninja ์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์„ ์ƒ์„ฑํ•จ static bool IsIdentifierCharacter(char c) { return ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z') || // and so on... } cs = set() for c in string.ascii_letters + string.digits + r'+,-./_$': cs.add(ord(c)) for i in range(256): print '%d,' % (i in cs), Lookup Table ์ด์šฉ
  • 10.
    ์ •๊ทœํ™” Ninja๋Š” ์ˆ˜๋งŽ์€ ํŒŒ์ผ๊ฒฝ๋กœ๋ฅผ ๋‹ค๋ฃจ๋ฏ€๋กœ ์ตœ์ ํ™”๋œ ๊ฒฝ๋กœ ์‹๋ณ„ ๋ฐฉ๋ฒ• ํ•„์š” /bar.h /foo/../bar.h /bar.h /bar.cc /abc.h /abc.c ๊ฒฝ๋กœ ๊ฐ์ฒด ๊ฒฝ๋กœ ๋น„๊ต 0x2000 0x3000 Memory Addr ๋‹จ์ˆœ ํฌ์ธํ„ฐ ๋น„๊ต์—ฐ์‚ฐ โ‰ 
  • 11.
    ๋นŒ๋“œ ๋กœ๊ทธ ์ด์ „ ๋นŒ๋“œ์™€์ƒˆ๋กœ์šด ๋นŒ๋“œ๊ฐ„์˜ ๋กœ๊ทธ๋ฅผ ๋น„๊ตํ•ด์•ผํ•จ ์ด ์—ญ์‹œ ๋‹ค๋Ÿ‰์˜ ๋ฌธ์ž์—ด ๋น„๊ต์ด๋ฏ€๋กœ ๋ณ‘๋ชฉ์ง€์ ์ž„ ๋ฌธ์ž์—ด ๋Œ€์‹  ๋ช…๋ น์˜ ํ•ด์‹œ๋ฅผ ๊ธฐ๋กํ•˜๊ณ  ๋น„๊ต 200MB -> 2MB ๋ฏธ๋งŒ, 20๋ฐฐ ์‹œ๊ฐ„ ๋‹จ์ถ•
  • 12.
    ์˜์กด์„ฑ ํŒŒ์ผ ๋ถ„์„ #includeโ€œbar.hโ€ โ€ฆ foo.c #include โ€œbaz.hโ€ โ€ฆ bar.h class foo; baz.h #include โ€œbar.hโ€ โ€ฆ #include โ€œbaz.hโ€ โ€ฆ class bar; baz.h ์ˆ˜์ • ๋ชจ๋‘ ์žฌ๋นŒ๋“œ ํ•„์š”
  • 13.
    ์˜์กด์„ฑ ํŒŒ์ผ ๋ถ„์„ ๋ฐฉ๋ฒ•๋“ค ํ—ค๋”์Šค์บ๋„ˆ ์‚ฌ์šฉ, ๋А๋ฆฌ๊ณ  ๋ถ€์ •ํ™• ์˜์กด์„ฑ์„ ์ผ์ผ์ด ๋นŒ๋“œํŒŒ์ผ์— ์ˆ˜์ž‘์—…์œผ๋กœ ๋ช…์‹œ, ์œ ์ง€๋ณด์ˆ˜ ์–ด๋ ค์›€ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ปดํŒŒ์ผ์‹œ์ ์— ์ถœ๋ ฅํ•˜๊ฒŒ ํ•จ.(gcc, visual studio ๋ชจ๋‘์ง€์›) gcc -> Makefile ํ˜•์‹์œผ๋กœ ์˜์กด์„ฑ ์ถœ๋ ฅ ์ด ์šฉ๋Ÿ‰ ์•ฝ 90MB. ๋นŒ๋“œ์‹œ์ž‘ํ• ๋•Œ ์ด๊ฑธ ๋ชจ๋‘ ๋ถ„์„ํ•œ ๋’ค์— ๋นŒ๋“œ๋ฅผ ์‹œ์ž‘ํ•˜๊ธฐ์—” ์‹œ๊ฐ„์†Œ๋ชจ๊ฐ€ ํผ ์˜์กด์„ฑ ์ฒ˜๋ฆฌ์‹œ์ ์„ ์ง€์—ฐ ์ปดํŒŒ์ผ์ด ์ด๋ค„์ง€๋Š” ๋™์•ˆ Ninja๊ฐ€ ํ•˜๋Š” ์ผ์€ ์ปดํŒŒ์ผ๋Ÿฌ ํ”„๋กœ์„ธ์Šค ์ข…๋ฃŒ๋ฅผ ๋Œ€๊ธฐํ•˜๋Š” ๊ฒƒ ๋ฟ, ์ด์‹œ๊ฐ„์„ ์ด์šฉ ๋Œ€๊ธฐ์‹œ๊ฐ„๋™์•ˆ ์˜์กด์„ฑ ์ •๋ณดํŒŒ์ผ์„ ํŒŒ์‹ฑ, ์ •๊ทœํ™”, ์˜์กด์„ฑ ์ฒ˜๋ฆฌ
  • 14.
    ๋นŒ๋“œ์˜ ์‹คํ–‰ ๋นŒ๋“œ ์‹คํ–‰์„ฑ๋Šฅ์€์ „์ ์œผ๋กœ ์ปดํŒŒ์ผ๋Ÿฌ์— ์˜์กด ๋ณ‘๋ ฌ์‹คํ–‰์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฒ„ํผ์— ์ €์žฅํ›„ ์ˆœ์ฐจ์ ์œผ๋กœ ์ถœ๋ ฅ ๋ช…๋ นํ–‰ ๋ฒ„ํผ๋ง. ๋นŒ๋“œ ์„ฑ๊ณต์‹œ ์ถœ๋ ฅ์€ ๋‹จ ํ•œ์ค„ Ninja๊ฐ€ ๋น ๋ฅด๋‹ค๋Š” ๋А๋‚Œ์„ ์ฃผ๋Š”๋ฐ ์ผ์กฐ. ์กฐ์šฉํžˆ ๋น ๋ฅด๊ฒŒ ์น˜๊ณ  ๋น ์ง„๋‹ค๋Š” ํŠน์ง•์—์„œ Ninja์˜ ์ด๋ฆ„์ด ๋น„๋กฏ๋จ
  • 15.
    Windows ์ด์Šˆ ๋ช…๋ น์ค„์˜ ์ตœ๋Œ€๊ธธ์ด๊ฐ€ ๋น„๊ต์  ์งง์Œ (8191 chars) ํŒŒ์ผ์—ฐ์‚ฐ์ด ๋А๋ฆผ GetFileAttributesEx()๋Š” ๋ฆฌ๋ˆ…์Šค์˜ stat()๋ณด๋‹ค 100๋ฐฐ๋Š” ๋А๋ฆผ ํŒŒ์ผ ์˜์กด์„ฑ ์ถœ๋ ฅ ์ด์Šˆ Visual Studio ์˜์กด์„ฑ ํŒŒ์ผ gcc Makefile ํ˜•์‹ ๋ณ€ํ™˜ํŒŒ์ผ ์ƒ์„ฑ
  • 16.
    Windows ์ด์Šˆ ๋ช…๋ น์ค„์˜ ์ตœ๋Œ€๊ธธ์ด๊ฐ€ ๋น„๊ต์  ์งง์Œ (8191 chars) ํŒŒ์ผ์—ฐ์‚ฐ์ด ๋А๋ฆผ GetFileAttributesEx()๋Š” ๋ฆฌ๋ˆ…์Šค์˜ stat()๋ณด๋‹ค 100๋ฐฐ๋Š” ๋А๋ฆผ ํŒŒ์ผ ์˜์กด์„ฑ ์ถœ๋ ฅ ์ด์Šˆ Visual Studio ์˜์กด์„ฑ ํŒŒ์ผ gcc Makefile ํ˜•์‹ ๋ณ€ํ™˜ํŒŒ์ผ ์ƒ์„ฑ ๋ณ‘๋ชฉ์ง€์ 
  • 17.
    Windows ์ด์Šˆ ๋ช…๋ น์ค„์˜ ์ตœ๋Œ€๊ธธ์ด๊ฐ€ ๋น„๊ต์  ์งง์Œ (8191 chars) ํŒŒ์ผ์—ฐ์‚ฐ์ด ๋А๋ฆผ GetFileAttributesEx()๋Š” ๋ฆฌ๋ˆ…์Šค์˜ stat()๋ณด๋‹ค 100๋ฐฐ๋Š” ๋А๋ฆผ ํŒŒ์ผ ์˜์กด์„ฑ ์ถœ๋ ฅ ์ด์Šˆ Visual Studio Ninja ๋ช…๋ นํ–‰ ๋ฒ„ํผ๋ง ๊ธฐ๋Šฅ gcc Makefile ํ˜•์‹ ๋ณ€ํ™˜๋ช…๋ นํ–‰ ์ถœ๋ ฅ ๊ธฐ์กด์˜ ๋ช…๋ นํ–‰ ๋ฒ„ํผ๋ง ๊ธฐ๋Šฅ์„ ์žฌ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ผ์ž‘์—… ์ œ๊ฑฐ
  • 18.
    Design Principles A smallbuild system with a focus on speed
  • 19.
    Design Principles ๋” ์ตœ์ ํ™”ํ•˜๊ธฐ, Ninja Daemon PC์— ํ•ญ์ƒ ์ƒ์ฃผํ•˜์—ฌ ํŒŒ์ผ์ˆ˜์ •๊ฐ์‹œ, ์„ฑ๋Šฅ ํ–ฅ์ƒ ๊ฐ€๋Šฅ ํ•˜์ง€๋งŒ Ninja์˜ ์„ค๊ณ„ ์›์น™์€ Simplicity ๋‹จ์ˆœํ•จ์€ ์†Œํ”„ํŠธ์›จ์–ด ์„ค๊ณ„์˜ ๋ฏธ๋• ์ค‘์š”ํ•œ๊ฑด ์–ผ๋งˆ๋‚˜ ๋‹จ์ˆœํ•จ์„ ์˜ค๋ž˜ ์œ ์ง€ํ•˜๋Š”๊ฐ€ ๋ณต์žกํ•œ ์ž‘๋™๋ฐฉ์‹์„ ๋™์›ํ•˜๋Š” ๋Œ€์‹  ์ž‘์—…์„ ์ค„์ž„์œผ๋กœ์จ ์†๋„๋ฅผ ์˜ฌ๋ฆฐ๋‹ค๋Š” ์›์น™
  • 20.
    Design Principles ์ตœ๋Œ€ํ•œ ๋งŽ์€๊ธฐ๋Šฅ๋“ค์„ ๋‹ค๋ฅธ ๋„๊ตฌ์— ์œ„์ž„ GYP, CMake Ninja ์ž์‹ ์€ ๋นŒ๋“œ๋ฅผ ๋งŒ๋“ค์–ด๋‚ด๋Š” ๋ชฉํ‘œ ํ•˜๋‚˜์—๋งŒ ์ง‘์ค‘ ๋•๋ถ„์— ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ์—์„œ ๊ฐ€์ ธ๋‹ค ์กฐ๋ฆฝํ•ด ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฌ์›€ ๋น ๋ฅธ ๋นŒ๋“œ์˜ ์˜๋ฏธ ํ”„๋กœ์ ํŠธ๊ฐ€ ๊ฐ€๋ณ๋‹ค๋Š” ์ธ์ƒ์„ ์ฃผ๋ฉด ํ”„๋กœ์ ํŠธ๋ฅผ ๊ฐ€์ง€๊ณ  ๋…ธ๋Š” ๊ฒƒ์ด ์ฆ๊ฑฐ์›Œ์ง„๋‹ค ๊ฐ€์ง€๊ณ  ๋†€๊ธฐ ์ข‹์€ ์ฝ”๋“œ๊ฐ€ ์†Œํ”„ํŠธ์›จ์–ด ์ž‘์„ฑ์˜ ๋ชฉํ‘œ
  • 21.