Story-time: C++, bounds checking, performance, and compilers
Story-time: C++, bounds checking, performance, and compilers ๋ฅผ ์ฝ๊ณ .
์์ฝ
์ ์๋ Chandler Carruth์ด๊ณ Google์์ Distinguished Software Engineer๋ก ์ผํ๊ณ ์๋ค๊ณ ํ๋ค.
-
๊ณผ๊ฑฐ ๊ฒฝ๊ณ ๊ฒ์ฌ์ ์ฑ๋ฅ ์ค๋ฒํค๋์ ๋ํ ์คํด ์์ฑ์๋ ์ด๊ธฐ์๋ ๊ฒฝ๊ณ ๊ฒ์ฌ๋ก ์ธํด ์ฑ๋ฅ์ด ํฌ๊ฒ ์ ํ๋ ๊ฒ์ด๋ผ๋ ํ์์ ์ธ ์ ์ฅ. ์ด๋ ๊ณผ๊ฑฐ ๋ณด๊ณ ์๋ค๊ณผ ๊ฐ๋จํ ์คํ ๊ฒฐ๊ณผ์์ ๋น๋กฏ๋ ๋ฏฟ์์ด์์ผ๋ฉฐ, ๋น์ ์ปดํ์ผ๋ฌ๋ ๊ฒฝ๊ณ ๊ฒ์ฌ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ต์ ํํ์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ฑํํ๋ ๊ฒ์ด ๋นํ์ค์ ์ด๋ผ๊ณ ์๊ฐ. ํ์ง๋ง ์ต๊ทผ ๊ฒฐ๊ณผ๋ฅผ ํตํด, ๊ฒฝ๊ณ ๊ฒ์ฌ์ ์ฑ๋ฅ ์ค๋ฒํค๋๊ฐ ์์๋ณด๋ค ๋งค์ฐ ๋ฎ๋ค๋ ์ฌ์ค์ ํ์ธํ์ผ๋ฉฐ, 0.3% ์์ค์ ์ค๋ฒํค๋๋ก๋ ์ ์ฒด ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ์ ์์ ๊ฒฝ๊ณ ๊ฒ์ฌ๊ฐ ์คํ ๊ฐ๋ฅํ๋ค๋ ์ ์ ๊ฐ์กฐ.
-
๊ฒฝ๊ณ ๊ฒ์ฌ์ ํ์์ฑ์ ๋ํ ์ ํ ๊ณผ๊ฑฐ์๋ ๊ฒฝ๊ณ ๊ฒ์ฌ๊ฐ ๋น์ฉ์ด ํฌ๋ค๊ณ ๋ฏฟ์๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ๊ตฌํํ๋ ค๋ ๋ ธ๋ ฅ์ด ๋ถ์กฑํ์ง๋ง, ํ์ฌ๋ ์์ ์ฑ์ ์ํด ํ์์ ์ธ ์์๋ก ์ฌํ๊ฐ. ๊ฒฝ๊ณ ๊ฒ์ฌ๊ฐ ์๋ ์ํ์์ ๋ฐ์ํ๋ ๋ณด์ ์ํ๊ณผ ์ค๋ฅ ๊ฐ๋ฅ์ฑ์ ์ค์ด๊ธฐ ์ํด, ๊ฒฝ๊ณ ๊ฒ์ฌ๋ฅผ ๋ชจ๋ ์ฝ๋์์ ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ฑํํด์ผ ํ๋ค๋ ์ ์ฅ์ผ๋ก ๋ฐ๋.
-
์ปดํ์ผ๋ฌ์ ๊ฒฝ๊ณ ๊ฒ์ฌ ์ต์ ํ์ ๋ฐ์ ๊ฒฝ๊ณ ๊ฒ์ฌ์ ์ด๊ธฐ ์ฑ๋ฅ ๋ฌธ์ ๊ฐ ์ปดํ์ผ๋ฌ๊ฐ ์ด๋ฅผ ์ต์ ํํ๋๋ก ์ค๊ณ๋์ง ์์๊ธฐ ๋๋ฌธ์ด๋ผ๋ ์ ์ ์ง์ . C์ C++์ ์์ ํ์ง ์์ ์ถ์ํ์ ๊ธฐ๋ฐํ์ฌ ์ค๊ณ๋์๊ธฐ ๋๋ฌธ์, ๊ฒฝ๊ณ ๊ฒ์ฌ๋ฅผ ์ฒ๋ฆฌํ ์ธํ๋ผ๊ฐ ๋ถ์กฑํ๋ค. ๊ทธ๋ฌ๋ ์ต๊ทผ LLVM๊ณผ GCC ๊ฐ์ ์ปดํ์ผ๋ฌ๊ฐ ๊ฒฝ๊ณ ๊ฒ์ฌ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ต์ ํํ ์ ์๋๋ก ๋ฐ์ ํ์ผ๋ฉฐ, ์ด๋ ๊ฒฝ๊ณ ๊ฒ์ฌ๋ฅผ ์์ ์ฑ๊ณผ ์ฑ๋ฅ ๋ชจ๋๋ฅผ ๋ง์กฑํ๋ ๊ธฐ๋ณธ ์ต์ ์ผ๋ก ๋ง๋ค ๊ฐ๋ฅ์ฑ์ ์ด์ด์ฃผ์์.
๊ธ์ ์ฝ๊ณ ๊ถ๊ธํ ๊ฒ๋ค
๊ฒฝ๊ณ ๊ฒ์ฌ๋ฅผ ์ง์ํ๋ ์ธ์ด์ ๋๊ตฌ
- ์ธ์ด ์ฐจ์
- Rust, Swift: ๊ฒฝ๊ณ ๊ฒ์ฌ๋ฅผ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณตํ๋ฉฐ, ์์ ์ฑ์ ๊ฐ์ .
- C, C++: ๊ฒฝ๊ณ ๊ฒ์ฌ๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณต๋์ง ์์ผ๋, ์ถ๊ฐ ๋๊ตฌ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํตํด ๊ตฌํ ๊ฐ๋ฅ.
- ๋๊ตฌ ๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- AddressSanitizer (ASan): C/C++์์ ๊ฒฝ๊ณ ์ด๊ณผ ๋ฌธ์ ๋ฅผ ์คํ ์ ๊ฐ์ง.
- UBSan (Undefined Behavior Sanitizer): ๊ฒฝ๊ณ ์ด๊ณผ ์ ๊ทผ์ ํฌํจํ ์ ์๋์ง ์์ ๋์ ๊ฐ์ง.
๊ณต๊ฐ์ ์์ ์ฑ(Spatial Safety)๊ณผ ์๊ฐ์ ์์ ์ฑ(Temporal Safety)
- ๊ณต๊ฐ์ ์์ ์ฑ
- ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ์ ๊ฒฝ๊ณ(boundary)์ ๊ด๋ จ๋ ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ๋ ๊ฒ
- ์ด๋ ํ๋ก๊ทธ๋จ์ด ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ ๋ด์์๋ง ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฑฐ๋ ์ฐ๋๋ก ๋ณด์ฅํ๋ ๊ฐ๋
- ์ฆ, ๋ฐฐ์ด์ด๋ ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ ๋, ํ ๋น๋ ๋ฒ์๋ฅผ ๋์ด์๋ ์ ๊ทผ์ ๋ฐฉ์งํ๋ ๊ฒ์ด ๋ชฉ์
- ์ฃผ์ ๋ฌธ์
- ๋ฒํผ ์ค๋ฒํ๋ก, ๋ฒํผ ์ธ๋ํ๋ก
- ํด๋ฒ
- ๊ฒฝ๊ณ ๊ฒ์ฌ, ๋ฉ๋ชจ๋ฆฌ ๋ณดํธ ๋๊ตฌ(Address Sanitizer), ์์ ํ ์ธ์ด
- ์๊ฐ์ ์์ ์ฑ
- ์๊ฐ์ ์์ ์ฑ์ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ์ ์๋ช (lifetime)๊ณผ ๊ด๋ จ๋ ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ๋ ๊ฒ์ ๋งํจ.
- ์ด๋ ํ๋ก๊ทธ๋จ์ด ์ ํจํ์ง ์์ ๋ฉ๋ชจ๋ฆฌ(์ด๋ฏธ ํด์ ๋์๊ฑฐ๋ ํ ๋น๋์ง ์์ ๋ฉ๋ชจ๋ฆฌ)์ ์ ๊ทผํ์ง ์๋๋ก ๋ณด์ฅํ๋ ๊ฐ๋ .
- ์ฃผ์ ๋ฌธ์
- Dangling pointer, Double free, user-after-free
- ํด๋ฒ
- ์ค๋งํธ ํฌ์ธํฐ ์ฌ์ฉ, ์ฐธ์กฐ ์นด์ดํ , ๋์ ๋ถ์ ๋๊ตฌ(Valgrind), GC,
PGO (Profile-Guided Optimization)์ FDO (Feedback-Directed Optimization)๋?
PGO์ FDO๋ ํ๋ก๊ทธ๋จ ์ต์ ํ๋ฅผ ์ํ ๋ฐฉ๋ฒ๋ก ์ผ๋ก, ํ๋ก๊ทธ๋จ ์คํ ์ ์์ง๋ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ปดํ์ผ๋ฌ๊ฐ ์ฝ๋๋ฅผ ์ต์ ํํ๋ค๋ ๊ณตํต์ ์ ๊ฐ์ง๊ณ ์์. ๋ค๋ง, ์ฌ์ฉํ๋ ๋ฐฉ์๊ณผ ๋ชฉ์ ์ ๋ฐ๋ผ ์ฐจ์ด์ ์ด ์กด์ฌ.
- PGO (Profile-Guided Optimization)
- PGO๋ ํ๋ก๊ทธ๋จ์ ์คํ ํ๋กํ์ผ(ํ๋ก๊ทธ๋จ ๋์ ๋ฐ์ดํฐ๋ฅผ ํฌํจ)์ ์ฌ์ ์ ์์งํ ํ, ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ต์ ํ๋ฅผ ์ํํ๋ ๋ฐฉ์.
- ์ปดํ์ผ๋ฌ๋ ์ฝ๋์์ ์์ฃผ ์คํ๋๋ ๋ถ๋ถ(ํซ์คํ)์ ํ์ ํ๊ณ , ์ด๋ฌํ ๋ฐ์ดํฐ๋ฅผ ํ์ฉํด ์ฑ๋ฅ์ ๊ทน๋ํ.
- ์๋ ๋ฐฉ์
- ํ๋กํ์ผ ๋ฐ์ดํฐ ์์ง
- ํ๋ก๊ทธ๋จ ์คํ ์ ๋ค์ํ ์ ๋ ฅ ๋ฐ์ดํฐ์ ์๋๋ฆฌ์ค๋ก ์คํํ์ฌ ํ๋กํ์ผ ๋ฐ์ดํฐ(์คํ ๋น๋, ๋ถ๊ธฐ ํ๋ฅ ๋ฑ)๋ฅผ ์์ง.
- ํ๋กํ์ผ ๋ฐ์ดํฐ ๋ถ์
- ์ปดํ์ผ๋ฌ๊ฐ ์์ง๋ ๋ฐ์ดํฐ๋ฅผ ๋ถ์ํ์ฌ ์์ฃผ ์คํ๋๋ ์ฝ๋์ ๊ทธ๋ ์ง ์์ ์ฝ๋(์ฝ๋ ์ฝ๋)๋ฅผ ๊ตฌ๋ถ.
- ์ต์ ํ ์ปดํ์ผ
- ํซ์คํ(์์ฃผ ์คํ๋๋ ์ฝ๋)์ ์ฑ๋ฅ์ ์ต์ ํํ๊ณ , ์ฝ๋ ์ฝ๋(๊ฑฐ์ ์คํ๋์ง ์๋ ์ฝ๋)๋ ๊ณต๊ฐ ํจ์จ์ฑ์ ๋์ด๋๋ก ์ต์ ํ.
- ํ๋กํ์ผ ๋ฐ์ดํฐ ์์ง
- ์์
- GCC, LLVM/Clang์ -fprofile-generate ๋ฐ -fprofile-use
- FDO (Feedback-Directed Optimization)
- FDO๋ PGO์ ์ ์ฌํ์ง๋ง, ์คํ ์ค(runtime) ๋ฐ์ดํฐ๋ฅผ ์์งํ์ฌ ์ค์๊ฐ์ผ๋ก ์ต์ ํ๋ฅผ ์ํํ๋ ๋ฐฉ์์ ํฌํจํฉ๋๋ค. ๋์ ์ต์ ํ๊ฐ ๊ฐ๋ฅํ ๊ฒ์ด FDO์ ํน์ง์ ๋๋ค.
- ์๋ ๋ฐฉ์
- ์คํ ๋ฐ์ดํฐ ์์ง
- ํ๋ก๊ทธ๋จ ์คํ ์ค ์ปดํ์ผ๋ฌ๋ ๋ฐํ์ ์์คํ ์ด ๋ฐ์ดํฐ๋ฅผ ์์ง.
- ์: ๋ถ๊ธฐ ์์ธก ์คํจ, ์บ์ ๋ฏธ์ค ๋ฐ์ ๋น๋ ๋ฑ.
- ๋์ ์ต์ ํ
- ๋ฐํ์ ์์คํ ์ด ์ค์๊ฐ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ถ์ํ๊ณ , ์ ํฉํ ์ต์ ํ๋ฅผ ์ ์ฉ.
- ์ ์ ์ผ๋ก ์ปดํ์ผ๋ ์ฝ๋๋ ์คํ ์ค ๋ค์ ์ต์ ํ ๊ฐ๋ฅ.
- ์คํ ๋ฐ์ดํฐ ์์ง
- ์์
- Java JIT(Just-In-Time) ์ปดํ์ผ๋ฌ, ์ผ๋ถ LLVM ๋ฐํ์ ์ต์ ํ ๊ธฐ๋ฒ