๐Ÿš€ ForgeZero v1.9.0 โ€˜Architectโ€™ ์—…๋ฐ์ดํŠธ: LSP ํ†ตํ•ฉ, ๊ต์ฐจ ์ปดํŒŒ์ผ ๋ฐ ์‚ฐ์—… ์ˆ˜์ค€ ์‹ ๋ขฐ์„ฑ

๋ฐœํ–‰: (2026๋…„ 5์›” 19์ผ AM 08:10 GMT+9)
7 ๋ถ„ ์†Œ์š”
์›๋ฌธ: Dev.to

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์— ํฌํ•จ๋œ ๋‚ด์šฉ

FeatureWhat It Does
-compile-commandsLSP/IDE์šฉ compile_commands.json ์ƒ์„ฑ
Crossโ€‘compilation-target โ€” ํˆด์ฒด์ธ ์ž๋™ ํƒ์ง€
Object name fix๊ณ ์œ ํ•œ .o ์ด๋ฆ„, ๋ฉ€ํ‹ฐ ํŒŒ์ผ ์ถฉ๋Œ ํ•ด์†Œ
Linker coverage48โ€ฏ% โ†’ 60โ€ฏ%+ ํ…Œ์ŠคํŠธ ์ปค๋ฒ„๋ฆฌ์ง€
Smart updatefz -update๊ฐ€ ๊ธฐ์กด ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ fz.old์— ๋ฐฑ์—…
Shell testsSplitCommand, CmdSet, CmdBuild ํ…Œ์ŠคํŠธ ์ ์šฉ
Default flags-Wall -Wextra -Werror -Wpedantic -Wshadow -Wconversion

์•ž์œผ๋กœ์˜ ๋กœ๋“œ๋งต์€?

โ€œArchitectโ€๋ผ๋Š” ์ด๋ฆ„์€ ๊ฐ€๋ณ๊ฒŒ ๋ถ™์ธ ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. v1.9.0์€ fz๊ฐ€ ๋‹จ์ผ ํŒŒ์ผ ์Šคํฌ๋ฆฝํŠธ๋ถ€ํ„ฐ ๋ฉ€ํ‹ฐ ํƒ€๊นƒ ์ž„๋ฒ ๋””๋“œ ์‹œ์Šคํ…œ๊นŒ์ง€, ์ง„์ง€ํ•œ C ํ”„๋กœ์ ํŠธ๋ฅผ ์œ„ํ•œ ๋Œ€ํ‘œ ๋นŒ๋“œ ๋„๊ตฌ๊ฐ€ ๋˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋ฐ˜์„ ๋‹ค์กŒ์Šต๋‹ˆ๋‹ค.

ํ”ผ๋“œ๋ฐฑ์ด ์žˆ๋‚˜์š”? ํ˜น์€ ํŠน์ด ์ผ€์ด์Šค๋ฅผ ๋ฐœ๊ฒฌํ–ˆ๋‚˜์š”? ๋Œ“๊ธ€์ด๋‚˜ ์ด์Šˆ๋ฅผ ๋‚จ๊ฒจ ์ฃผ์„ธ์š”. ๋ชจ๋“  ์˜๊ฒฌ์„ ์ฝ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿ‘‡

fz๋กœ ๋นŒ๋“œํ–ˆ์Šต๋‹ˆ๋‹ค. ๊นจ๋—ํ•˜๊ฒŒ ์ปดํŒŒ์ผ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฒฝ๊ณ  ์—†์Œ.

0 ์กฐํšŒ
Back to Blog

๊ด€๋ จ ๊ธ€

๋” ๋ณด๊ธฐ ยป

fz 1.6 & 1.7: C, ASM ๋ฐ C++๋ฅผ CMake hell ์—†์ด ๋นŒ๋“œ

์šฐ๋ฆฌ๋Š” ๋ชจ๋‘ ๊ทธ ๊ณ ํ†ต์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค: ์ž‘์€ C ๋˜๋Š” ASM ํ”„๋กœ์ ํŠธ๊ฐ€ ์žˆ๋Š”๋ฐ, ๊ฐ‘์ž๊ธฐ 2003๋…„์‹ CMake ๊ตฌ๋ฌธ์— ๋น ์ ธ๋“ค์–ด target_link_libraries๊ฐ€ ์กฐ์šฉํžˆ โ€ฆ ํ•˜๋Š” ์ด์œ ๋ฅผ ๊ตฌ๊ธ€๋งํ•˜๊ณ  ์žˆ๋Š” ์ƒํ™ฉ์ž…๋‹ˆ๋‹ค.

์ œ๊ฐ€ ๋งŒ๋“  ๋ฌด๋ฃŒ ์˜คํ”ˆ์†Œ์Šค ์ž์ฒด ํ˜ธ์ŠคํŒ… ๊ฐ€๋Šฅํ•œ Mockaroo ๋Œ€์•ˆ

์ €๋Š” Mockyard(https://github.com/portside-labs/mockyard?utm_source=chatgpt.com)๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค โ€“ ๋ฌด๋ฃŒ์ด๋ฉฐ ์˜คํ”ˆโ€‘source์ด๊ณ  selfโ€‘hostableํ•œ Mockaroo ๋Œ€์•ˆ์ž…๋‹ˆ๋‹ค. !์Šคํฌ๋ฆฐ์ƒท...