๐ ForgeZero v1.9.0 โArchitectโ ์ ๋ฐ์ดํธ: LSP ํตํฉ, ๊ต์ฐจ ์ปดํ์ผ ๋ฐ ์ฐ์ ์์ค ์ ๋ขฐ์ฑ
Source: Dev.to
ForgeZero(fz)โ์ค์ ์ด ํ์ ์๋ C ๋น๋ ๋๊ตฌ์ด๋ฉด์๋ ์ค์ ๋ก ์๊ฐ์ ์๊ปด์ฃผ๋ ๋๊ตฌโ๋ฅผ ์์ง ์ฌ์ฉํด ๋ณด์ง ์์๋ค๋ฉด, ์ด์ v1.9.0์ด ๋์์ผ๋ ๋์ฌ๊ฒจ๋ณผ ๋งํฉ๋๋ค. ์ด๋ฒ ์
๋ฐ์ดํธ๋ IDE ์ด๋ฅ๋ ฅ, ๋ค์ดํฐ๋ธ ํฌ๋ก์ค ์ปดํ์ผ, ์น๋ช
์ ์ธ ๋ฒ๊ทธ ์์ , ๊ทธ๋ฆฌ๊ณ QA ๋ด๋น์๋ฅผ ์ธ๋ฆฌ๊ฒ ํ ์ ๋์ ํ
์คํธ ์ปค๋ฒ๋ฆฌ์ง๋ฅผ ์ ๊ณตํ๋ค๋ ์ ์์ ํฐ ๋ณํ๋ฅผ ๊ฐ์ ธ์ต๋๋ค. ํ๋์ฉ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ๐งต
1. LSP & IDE ์ง์ โ ์ด์ ํธ์ง๊ธฐ๊ฐ ๋น์ ์ ์ดํดํฉ๋๋ค
fz -compile-commands
ํ ์ค ์ต์
๋ง์ผ๋ก compile_commands.jsonโ์ปดํ์ผ ๋ฐ์ดํฐ๋ฒ ์ด์คโ๋ฅผ ์์ฑํฉ๋๋ค. ๋ชจ๋ ์ง์งํ ํธ์ง๊ธฐ๊ฐ ์ด์ ์จ ์ฌ๋ ๋ฐ๋ก ๊ทธ ํ์ผ์ด์ฃ .
์ค์ ์๋ฏธ
- Neovim + clangd โ ์์ ์๋์์ฑ, ์ ์ ์ด๋, ์ฐธ์กฐ ์ฐพ๊ธฐ. ๋ชจ๋ ๊ฒ์ด ๋ฐ๋ก ์๋โข
- VSCode + clang โ ๋์ผํ ๊ฒฝํ, ์ค์ ์ ์ ํ ํ์ ์์
- ์ด๋ค LSP ํด๋ผ์ด์ธํธ๋ โ
compile_commands.json์ ์ฝ์ ์๋ง ํ๋ฉด ๋ง์กฑํฉ๋๋ค
fz๋ โ๋น ๋ฅธ ๋น๋ ๋ฌ๋โ์์ ์ ์ ํ๋กํ์
๋ ๊ฐ๋ฐ ํ๊ฒฝ์ผ๋ก ํ ๋จ๊ณ ๋์ฝํ์ต๋๋ค. ์ด์ IDE๊ฐ ํฌํจ ํ์ผ ๋๋ฝ์ ๋ํด ๊ฑฐ์ง๋ง์ ํ์ง ์์ ๊ฒ๋๋ค.
2. ํฌ๋ก์ค ์ปดํ์ผ โ x86 ๋ฐ์คํฌํฑ์์ ARM์ ๋น๋
์๋ฒ ๋๋ ๊ฐ๋ฐ์๋ถ๋ค, ์ด๋ฒ ๊ธฐ๋ฅ์ ์ฌ๋ฌ๋ถ์ ์ํ ๊ฒ์
๋๋ค. fz๋ ์ด์ ์์ ํ ํฌ๋ก์ค ์ปดํ์ผ ์ง์์ ๊ธฐ๋ณธ ์ ๊ณตํฉ๋๋ค:
fz -target arm-linux-gnuebihf
๊ทธ๊ฒ ์ ๋ถ์
๋๋ค. ํด์ฒด์ธ ๊ฒฝ๋ก๋ฅผ ์ฐพ์ ํค๋งค๊ฑฐ๋ -CC= ์ต์
์ ์์ ์ง์ ํ ํ์๊ฐ ์์ต๋๋ค. fz๊ฐ ๋ชฉํ ํธ๋ฆฌํ์ ๋ง๋ ํ๋ฆฌํฝ์ค๊ฐ ๋ถ์ ์ปดํ์ผ๋ฌ์ ๋ง์ปค๋ฅผ ์๋์ผ๋ก ์ฐพ์์ค๋๋ค.
์ง์๋๋ ํ๊น ์์
arm-linux-gnuebihfโ ARMv7 ํ๋ ํ๋กํธ (RaspberryโฏPi ๋ฑ)- ๊ธฐํ ํ์ค GNU ํฌ๋ก์ค ์ปดํ์ผ ํธ๋ฆฌํ
3. ์ฐ์ ์์ค ์ ๋ขฐ์ฑ โ ์ค์ ๋ก ์ค์ํ โ์ง๋ฃจํโ ๋ถ๋ถ
๋ง์ปค ํ ์คํธ ์ปค๋ฒ๋ฆฌ์ง
48โฏ% โ 60โฏ%+
๋งํน ํ์ดํ๋ผ์ธ์ ์ด๋์ด ๊ตฌ์๊น์ง ํฌ๊ดํ๋ ๊ด๋ฒ์ํ ๋ง์ปค ํ
์คํธ๋ฅผ ์ถ๊ฐํ์ต๋๋ค. CI์์ โ๋ด ํ๊ฒฝ์์๋ ๋์ํ๋คโ๋ ๋๋ผ์์ด ์ค์ด๋ญ๋๋ค.
์น๋ช ์ ์ธ ๋ฒ๊ทธ ์์ : ์ค๋ธ์ ํธ ํ์ผ ์ด๋ฆ ์ถฉ๋
๋ฉํฐ ํ์ผ ํ๋ก์ ํธ์์ ์๋ก ๋ค๋ฅธ ๋๋ ํฐ๋ฆฌ์ ํ์ผ์ด ๋์ผํ _.o ์ด๋ฆ์ ๋ง๋ค์ด ์ถฉ๋์ด ๋ฐ์ํ๊ณ , ์ด๋ก ์ธํด ๋น๋๊ฐ ๊ฐ๋์ฉ๋ง ์ ์ ๋์ํ๋ ์ํฉ์ด ์์์ต๋๋ค.
ํด๊ฒฐ ๋ฐฉ๋ฒ: ์ด์ ๋ชจ๋ ์ค๋ธ์ ํธ ํ์ผ์ ์ ์ฒด ์์ค ๊ฒฝ๋ก๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ ๊ณ ์ ์ด๋ฆ์ ๊ฐ์ต๋๋ค.
Before: src/foo.c โ _.o (์ถฉ๋ ์ํ)
After: src/foo.c โ src_foo.o (๊ณ ์ , ํญ์ ์์ )
_.o๋ ์ด์ ์ฌ๋ผ์ก๊ณ , ์ถฉ๋๋ ์ฌ๋ผ์ก์ต๋๋ค. ๋ฉํฐ ํ์ผ ํ๋ก์ ํธ๊ฐ ์ธ์ ๋ ์์ ์ ์ผ๋ก ๋น๋๋ฉ๋๋ค.
4. UX & ์ธํ๋ผ โ ์ค์ ๋ก ์ฒด๊ฐ๋๋ ํ์ง ํฅ์
์ค๋งํธ ์๋ ์ ๋ฐ์ดํธ์ ๋กค๋ฐฑ
fz -update
์ด์ : ๊ธฐ์กด ๋ฐ์ด๋๋ฆฌ๋ฅผ ๋ฐ๋ก ๋ฎ์ด์ฐ๊ณ ์ด์ ๋งก๊ฒผ์ต๋๋ค.
ํ์ฌ: ๊ธฐ์กด ๋ฒ์ ์ /usr/local/bin/fz.old์ ๋ฐฑ์
ํ ๋ค ์ ๋ฒ์ ์ ์ค์นํฉ๋๋ค. ๋ฌธ์ ๊ฐ ์๊ธฐ๋ฉด ํ ๋ฒ์ ๋ช
๋ น์ผ๋ก ๋กค๋ฐฑ ๊ฐ๋ฅ. ์ด๋ณด๋ค ์์ ํ ์ ์์ต๋๋ค. ๐
์ ๋ชจ๋์ ํ ์คํธ ์ถ๊ฐ
๋ํํ ์(fz REPL ๋ชจ๋)๋ ์ด์ ์์ ํ ํ
์คํธ ์ปค๋ฒ๋ฆฌ์ง๋ฅผ ๊ฐ์ถ์์ต๋๋ค:
SplitCommandํ์ฑCmdSet์ฒ๋ฆฌCmdBuild์คํ
ํด ๋ด๋ถ ์ฝ์์ด ์ด์ ๋ ๊ฐ๊ณผ ๊ธฐ๋์ ์์กดํ์ง ์์ต๋๋ค.
5. ์๊ฒฉํ ์ฝ๋ฉ ํ์ค โ fz๊ฐ ๊นจ๋ํ C ์ฝ๋๋ฅผ ๊ฐ๋ฅด์นฉ๋๋ค
ForgeZero๋ ์ด์ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ถ์ฅ๋๋ ์ปดํ์ผ๋ฌ ํ๋๊ทธ๋ฅผ ๋ชจ๋ ๋ฌธ์์ JSON ๋ช ๋ น ์ค์ ์ ํฌํจํฉ๋๋ค:
-Wall -Wextra -Werror -Wpedantic -Wshadow -Wconversion
์ด๋ ๋ฌธ์ ๋ง๋ ๊ฒ์ด ์๋๋ผ ๊ฐ์ ํ๋ ๊ธฐ๋ฅ์
๋๋ค. ์ด ํ๋๊ทธ๋ค๋ก ์ปดํ์ผ์ด ๊นจ๋ํ๊ฒ ํต๊ณผํ๋ค๋ฉด, ์ฝ๋๋ ์ง์ ์ผ๋ก ๊น๋ํ ๊ฒ์
๋๋ค. fz๋ ์ฝ๋ ํ์ง์ ๋ํด ํ๊ณ ํ ์๊ฒฌ์ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, ๊ทธ ์๊ฒฌ์ ์ณ์ต๋๋ค. ๊ฒฝ๊ณ ๋ฅผ ์ค๋ฅ๋ก ์ทจ๊ธํ์ธ์. ๋ฏธ๋์ ์์ ์ด ๊ฐ์ฌํ ๊ฒ๋๋ค.
TL;DR โ v1.9.0์ ํฌํจ๋ ๋ด์ฉ
| Feature | What It Does |
|---|---|
-compile-commands | LSP/IDE์ฉ compile_commands.json ์์ฑ |
| Crossโcompilation | -target โ ํด์ฒด์ธ ์๋ ํ์ง |
| Object name fix | ๊ณ ์ ํ .o ์ด๋ฆ, ๋ฉํฐ ํ์ผ ์ถฉ๋ ํด์ |
| Linker coverage | 48โฏ% โ 60โฏ%+ ํ ์คํธ ์ปค๋ฒ๋ฆฌ์ง |
| Smart update | fz -update๊ฐ ๊ธฐ์กด ๋ฐ์ด๋๋ฆฌ๋ฅผ fz.old์ ๋ฐฑ์
|
| Shell tests | SplitCommand, CmdSet, CmdBuild ํ
์คํธ ์ ์ฉ |
| Default flags | -Wall -Wextra -Werror -Wpedantic -Wshadow -Wconversion |
์์ผ๋ก์ ๋ก๋๋งต์?
โArchitectโ๋ผ๋ ์ด๋ฆ์ ๊ฐ๋ณ๊ฒ ๋ถ์ธ ๊ฒ์ด ์๋๋๋ค. v1.9.0์ fz๊ฐ ๋จ์ผ ํ์ผ ์คํฌ๋ฆฝํธ๋ถํฐ ๋ฉํฐ ํ๊น ์๋ฒ ๋๋ ์์คํ
๊น์ง, ์ง์งํ C ํ๋ก์ ํธ๋ฅผ ์ํ ๋ํ ๋น๋ ๋๊ตฌ๊ฐ ๋๊ธฐ ์ํ ๊ธฐ๋ฐ์ ๋ค์ก์ต๋๋ค.
ํผ๋๋ฐฑ์ด ์๋์? ํน์ ํน์ด ์ผ์ด์ค๋ฅผ ๋ฐ๊ฒฌํ๋์? ๋๊ธ์ด๋ ์ด์๋ฅผ ๋จ๊ฒจ ์ฃผ์ธ์. ๋ชจ๋ ์๊ฒฌ์ ์ฝ๊ณ ์์ต๋๋ค. ๐
fz๋ก ๋น๋ํ์ต๋๋ค. ๊นจ๋ํ๊ฒ ์ปดํ์ผ๋์์ต๋๋ค. ๊ฒฝ๊ณ ์์.