컴파일러 개발자가 들려주는 C 이야기

AI 시대 이전에는 컴퓨터 관련 매대마다 사람들이 서거나 앉아서 책을 찾아보던 모습이 일상과도 같았다. 그냥, 별다른 이유없이 가는 곳이 서점이었고 혹시라도 내가 모르던 재미난 주제를 담은 책이 나왔을까해서 기웃거렸던 때가 있었다. 이제는, 책도 없고 사람도 없다. 책장에, 매대에 놓여있는 것들은 어쩌면 다 철지난 내용을 담은 것들 뿐인 것 같은건 기분탓이다.

그냥 나오려다 눈이 마주쳤다. “어허,, 컴파일러 개발자가 얘기 해준다고?” 라는 주제를 출판하는 회사는? 역시나 인사이트 출판사. 2016년 이후로 10년만에 다시 Pebble Smartwatch 앱을 만들면서, C에 대한 향수 때문인지 아니면 저물어가는 사람이 코딩하던 시대에 대한 미련 때문인지, 덥썩 주워들고 결재를 해버렸다. 무려 컴파일러 개발자가 얘기해준다는데, 그냥 갈 수는 없지않은가;;

가능한 종이 책을 사지 않겠다고 그렇게 다짐을 했건만 난 어쩔 수 없이 온갖 낙서를 해대면서 봐야한다는 변명으로 날 속이고 말았네. 대신, 이번에는 겉포장을 하지 않을 것이다. 팔지도 않을 것이고, 잃어버리면 잃어버리는대로 더러워지면 더러워지는대로 그냥 둘 예정이다.

2026년 9월 15일, 포인터와 배열의 다름에 대해 쓴 9장 부터 본다. 제목에는 충격적이라고 하지만 뭐 잊어버렸던 내용일 뿐 완전 새로운 건 아니었다. 번역 문체도 나쁘지 않고 내용도 맘에든다. 군더더기가 없어 좋다.

내 Mercury는 정보 그자체를 설명하는 것 보다 뭔가와 비교를 할 때, 그리고 순서와 상관없이 궁금한 내용에 대한 것을 직접 해보면서 생각과 결과의 차이를 통해 이해하는 Venus Driven 구조이다. 어릴 때 이 특성을 미리 알았다면, 나는 그렇게 나를 학대하진 않았을 것이다. 비선형적이면서 엄청난 질문을 쏟아내지만 누구도 답을 해주지도 않았고 답해줄 수도 없었기 때문에 나는 나를 이해가 딸리는, 모자란 놈으로 여겼다. 그러나 남들이 도저히 생각해내지 못하는 것들을 만들어내거나 생각해내는 것이 우연이라고 하기엔 너무 잦았기 때문에 스스로도 이해하기 힘들었다. 아니, 그것보단 도대체 어떻게 해야 항상 그렇게 괜찮을 결과물을 만들어내거나 생각해 낼 수 있을까 그 방법을 찾기 위해 서점을 그렇게 들락거렸는지도 모르겠다.

그런 특성을 가진 내가 C 언어에 대해 벽이 사라짐을 느꼈던 계기는 정확히 기억난다. FreeBSD 기반의 커널 방화벽을 제작하는 회사에서 메모리 누수로 인해 Kernel Panic 버그를 잡는 문제를 해결하면서라고 얘기할 수 있다. 당시 커널 코드는 뭐 암호문이나 다를 바 없게 느껴졌었고 도대체 어떻게 해야 커널 개발자가 되는지 내 주변의 사람들은 내게 제대로 대답을 해주지 못했다. 아뭏튼 기억나는 건 도대체 왜Cast를 그렇게 해대는 걸까 하는 의문이었는데, 정확한 code는 기억나지 않지만 대충 기억나는 건 struct base 구조의 크기가 24 bytes 정도이고 멤버 필드중 하나가 4 바이트 짜리 unsigned int 인데 그걸 전혀 다른 사이즈 타입으로 캐스트를 하는 코드였다. 전혀 사이즈가 맞지 않아서 컴파일도 안될 것 같지만 원래 C 컴파일러 라는 놈은 “네가 뭐 알아서 잘 하겠지, 난 그냥 컴파일만 해줄께” 라는 바이브라서 그런지 왜 그게 컴파일 되는지도 왜 하는지도 도무지 알수가 없었던 기억이 있다. 어쨌든 마침내 그 이유를 알게됐을 때 머리속에 번개 같이 모든 퍼즐이 맞춰졌다고나 할까… struct 타입을 어떻게 정렬했느냐에 따라 다르겠지만 그때 그 Cast 이유는 특정 위치에서 지정된 크기 만큼의 데이터를 원하는 타입으로 읽어와서 변수를 초기화 하기 위해서였다. 당시 그 코드가 남아있다면 더 생생하게 기록할 텐데, 아쉽다.

C언어에서 타입은 크기를 의미하고 모든 것은 그 크기를 맞추는 놀음과 같다 라는 깨달음이라고나 할까… 그때 갑자기 C언어에 대한 막연함과 커널 프로그래밍에 대한 막막함이 한순간에 걷히는 느낌이었다. 그리고 그 Kernel Panic을 일으키던 메모리 조작 오류를 밝혀냈는데 그게 내 첫번째 실전 커널 프로그래밍의 결과였다. 그게 왜 기억에 남느냐면, 글로는 설명할 수 없는 개 무식한 과정을 거치면서 그 오류를 잡아내던 시절이기 때문이다. 그때당시 Kernel 쪽에 문제가 생기면 OS가 그냥 뻗어버린다. 퍽~ 하고 아무것도 남지 않는 그런 현상이 발생하면 그 이유를 명확히 알기위해 한 줄씩, 좁혀 들어가면 죽는지 안 죽는지를 봐야하고, 그 때마다 커널 빌드를 해야한다;;;;ㅎㅎ… 씨발..

그러니까 단어 하나 고치고 퍽~ 하고 죽고, 다시 어찌어찌 부팅해서 몇 줄 고치고 빌드하는데 지금처럼 쓕~ 하고 지나가는게 아니란 말씀. 하염없이 컴파일 로그가 올라가는 걸 보다가 내 청춘이 다 가버린 것은 느낌이랄까… 그때 만약 지금처럼 QEMU 에뮬레이터가 있고 소스레벨로 디버깅이 가능했다면 정말 재밌었을 것이다. 그러나, 그때는 중노동에 가까웠다.

여기서 하고 싶은 얘기는 그것이다: “Threshold to understanding”, 즉 어느정도 차올라야 이해라는 것을 하는가.. 라는 건데, 결론을 먼저 말하자면, 그딴 건 없다. 각 사람이 이해해 도달하는 과정과 방법은 그 사람의 구조에 달려있다. 내 경우는, 이론을 듣고 말하고 보는 것 만으로는 완전한 이해에 도달하기 힘들다. 그런데! 만약 “그냥 궁금한 것을 해보고, 생각과 결과의 차이를 비교하면서 떠오르는 궁금함이 무엇이든 그걸 해결하려고 하면” 어느 순간 한꺼번에 전체를 완벽하게 이해하게 된다. 이게 내가 나를 쓰는 방법이다.

그래서 난 뭔가를 학습할 때는 무조건 소스코드를 따라서 분석하거나 디버거로 코드 흐름을 쫒아가거나 내가 궁금한 것을 해보다가 개구멍을 발견해서 그 영역에 들어가지만 곧 전체를 파악하는 경우가 많았었다. 내가 백엔드 개발자에서 프론트엔드 개발자로 전향했던건 ExtJS 가 버전 1일때, 그 소스를 분석해본 후에 JavaScript의 객게지향 상속 테크닉에 충격받았기 때문이었다.

이제는 내가 학습으로 나를 이해시키는 방법을 알기 때문에 이 책, 컴파일러 제작자가 알려주는 내용을 볼 때 읽고 싶은대로, 흥미가 당기는 대로 이리저리 뛰면서 아무런 계획없이 흥미를 쫒는다. 내가 이 책에서 기대하는 건, 이전에는 몰랐던 C 컴퍼일러의 설계레벨에서의 지식이다. 말 처럼 그렇게 딱딱한게 아니라, 오히려 숨은 비화같은 걸 기대한다고나 할까… 다행히도 그런 얘기가 많다. 함수의 인자로 사용되거나 호출 될 때에만 배열이 포인터로 치환된다는 컴파일러 설계 지침이, C언어 매뉴얼에서 페이지가 나눠지게 됨에 따라 어이없이 모든 배열이 포인터와 같이 취급된다는 내용을 가르치는 엉터리 책이 무수히 쏟아졌다는 얘기 같은 것 말이다. 갑자기 C언어의 창시작인 브라이언 커니핸이 떠오른다. C언어로 만드는 전통적인 예제 “Hello World!”를 만든 분. Mr. 커니핸을 추모할 때 사람들이 남긴 “Good bye, world” 라는 헌사가 떠오른다. 난 이 문구를 생각할 때 마다 그렇게 참,,, 찡하다… C는 내게 그런 감정을 가지게 하는 언어라고나 할까..

언젠간, 아무도 Z80 어셈블리를 코딩하지 않듯이 C를 찾지 않게 되는 시대가 오겠지. 이미 char c[10];으로 선언하고 c[3] 을 쓰던 3[c]를 쓰던 상관없다라는게 아무런 재미나 흥미를 끌지 못하는 것과 같다.

설령 그렇다고 해도 내겐 C언어를 공부하는 건 여전히 흥미롭다. 어린애가 태어나서 철이들자마자 “언젠간 죽을 텐데 , 모든게 쓸모없다“고 우울해 하면, 뒤통수가 마려운 것과 같다. 목적과 쓸모가 모든 것의 잣대는 아니잖는가.

Claude Startups 지원 프로그램에 얽힌 이야기

한가닥 가능성을 발견했을 때 Claude를 기반으로 제품을 만드는 창업자들과 함께하세요. Claude Team 1년 무료 이용권, API 크레딧, AI-native 기업 운영에 도움이 되는 툴 특별 혜택, Anthropic Applied AI 팀과의 오피스 아워 등 다양한 혜택을 누리세요. https://claude.com/ko/programs/startups Claude의 Startups 지원 소식을 듣기 전까지는 공허한 마음에 삐끗한…

Audio 사용이 가능한 pebble-qemu-wasm

uConsole에서 삽질하며 수정한 QEMU Audio 코드를 PR 했다. Eric이 바뻐서 테스트해보기나 할지 몰라, 내 브랜치를 만들어서 몇가지 수정하여 연결한다:

structura.lisp

Abstract structura.lisp는 위상기반 구조판독을 프로그램으로 표현하기 위해 만들기 시작한 Common Lisp 패키지이다. Rust로 작성한 Aspectscope-MCP는 Swiss Ephemeris를 기반으로 Natal, Transit, Progress Chart를 계산하고, Aspect와 Aspect Pattern 및 CSF, Celestigram을 탐색하며, 특정 조건이 성립하는 시점을 찾아내등 LLM을 끼고 기본적인 역할을 해왔다. HTTP 방식의 MCP 서버이기 때문에…

speak-mcp on Zeno.app

Zeno.app - 16GB Mac에서 35B 로컬 AI를 돌리는 흥미로운 실험, 그러나 아직은 실험에 가깝다 최근 Icosa Computing이 공개한 Zeno라는 macOS용 로컬 AI를 설치해 보았다. 회사 설명에 따르면 전체 MoE expert를 메모리에 올리지 않고, 사용되지 않는 expert weight는 SSD에 두었다가 필요한 expert만 RAM으로 읽어들이는 방식을 적용하여…

Saffron Ink – VSCode Theme

Gray background: Github Light Theme - Gray 테마를 기반으로 내 취향에 맞게 수정하였다. 원래 테마보다 좀 더 어두운 배경, 강한 텍스트 대비를 주었다. 선택영역 색상 및 커서 색상을 쪼매 튀게. 각 영역의 border-radius 제거. scrollbar 색상을 배경색 대비 3% 어둡게. https://marketplace.visualstudio.com/items?itemName=andrwj.saffron-ink

Pebble QEMU Development on uConsole with Physical Controls

의도 기본 생각은 단순하다: uConsole의 Joystick Keys 와 물리키보드를 이용해 Pebble QEMU Emulator에 직접 버튼/터치/가속도데이터 등을 전송하여 개발/디버깅 하겠다는 것이다. 왼쪽 이미지에 보이는 Pebble앱은 한국어(한글) 모르스부호 연습기 앱인데, 단순히 한글 자모를 출력하는게 아니라 한글 오토마타를 내장해서 모르스부호를 입력하면 한국어 문장이 조립된다. 죽도록 버튼을 누르지 않고…

HERDR multiplexer

Why & What https://herdr.dev/ ('26-SEP-18) HERDR 사용하기로 결정한 이유는 ① Rust로 제작되었다는 것, ② Plugin 생태계가 꽤 성장세로 보여서, ③ TMUX가 채우지 못하는 부분이 있어서 이다. 깔끔하게 hook을 설치/제거할 수 있다는 점은 좋다. 그러나 integration hook은 설치하지 않는다. 불필요하게 모든 턴마다 hook을 걸어 하는 일은…

Obsidian Web Clipper Setting for ChatGPT

ChatGPT 채팅의 내용을 깨끗하게 Obsidian 앱으로 import 하는 설정. 현재로썬 이게 최선... 구분선 위의 빈줄을 한 칸으로 줄일 방법을 찾다 찾다... 그냥 쓰기로 .. {{selectorHtml:[data-testid*="conversation-turn"] |join:"" |remove_html:("img,svg,picture,source,canvas,object,embed,iframe") |remove_attr:("style,alt,aria-label,aria-description,title,srcset") |markdown |replace:"#### 나의 말:":"---\n\n# 질문:" |replace:"/\\n+#### ChatGPT의 말:/g":"---\n\n## 답변:" |trim}}

페블타임2

https://repebble.com/watch 오랬만 작년 9월에 주문한 Pebble Time 2 , 1년만인 2026년 9월 3일 오후 3시에 DHL로 도착. 본체를 꺼낼 때의 그 묵직함... 꼴도 보기 싫은 기본 스트랩! 배터리 충전후 곧바로 스트랩부터 다른 걸로 끼웠다. 치렁 치렁한 USB 케이블 대신 USB-C 타입을 꽂을 수 있는 어댑터…

LLM Wiki

흥미로워 보였지만 내가 원하는 기능은 없다 LLM Wiki 앱이 사용하는 프로젝트의 루트에 생성된 schema.md, purpose.md 파일들에 추가 설정 없이, AspectScope를 사용하여 분석한 데이터를 Ingest 시킨 결과를 봤더니, 고개가 절래절래 저어졌다. 검증 또는 확인이 필요하다는 문서가 하나의 분석 문서당 적게는 3개, 많게는 8개까지 만들어졌는데 해당 문서를…

command-run MCP

TURA 프로젝트에서 영감 받음 https://github.com/Tura-AI/tura Build agent that uses 80% less token and delivers better results. 핵심 아이디어는 rg, find, sed, git, cargo test 같은 shell command 호출을 개별 단위가 아닌 묶음으로 처리하게 해서 잦은 도구호출로 인한 토큰을 아끼자는 것이다. TURA의 TUI가 멋지긴 한데 당장…

kontexus-mcp를 사용한 리팩토링

#FTM:strict 모드, 실전투입 리팩토링에 최적의 모드. 몇시간 걸릴지 모르겠지만, 기대된다. TMUX 환경. 왼쪽 Pane은 Claude Opus-5-high Model, 오른쪽은 32 Turn Refactoring 진행상황을 나타내는 Kontexus-CLI AspectScope? 날짜와 시간에 따른 위상변이를 추적하는 AspectScope 특정 지역+시간대역의 Natal Chart 위상을 조사하는 앱이다. 키보드/마우스/트랙패드에 대단히 세밀하게 반응해야 한다. 전통적인 이벤트…

또 한번의 난관을 넘는다

솔직히 어제 좀 기분이 더러웠다. 이런 처짐은 내가 뭔가의 바닥을 꿰뚫어 보고 그 본질을 깨닫고 실망했을 때의 반응이다. functional-thinking-mcp 의 두 도구(tool)를 kontexus-mcp로 편입한 것은 태스크 관리를 맡았던 workgraph-memory-mcp 와의 상호작용이 CLAUDE.md, AGENTS.md 와 같은 규정에 의해 조절되고 있어서 MCP 쪽에서 해결하려는 목적 때문이기도 하지만,…

Don’t vs. Do

LLM 새끼들의 거짓말은 교묘하다 울화통이 치밀 때가 한 두번이 아닌 건, 모두가 경험했을 것이다. 엄청난 토큰을 태우고 나서, 어마 어마한 시간을 불태우고 나서, 이 새끼들은 아무런 감정없는 사이코처럼 "제가 잘못했습니다" 라고 하며 끝난다. 개/빡/친/다////!!! 규정을 어떻게 만드는가에 상당한 시간을 보냈지만 매번 모델이 업그레이드/업데이트 되면 조금씩…

Harness 체계의 빈틈을 채워 줄 Kontexus-MCP

Kontexus-MCP는 Rust로 포팅된 WGM+FTM 이다 Harness의 빈 틈 Harness의 구조적 전제는 하나이다: 에이전트는 턴 단위로 존재하고, 세션이 끝나면 사라진다. 그 전제 위에서 harness는 실행 중인 것을 잘 다룬다. 컨텍스트를 유지하고, 도구를 붙이고, 병렬로 펼치고, 훅으로 개입 지점을 준다. 그러나 아래와 같은 틈이 있다: 빈자리턴 사이…

제한의 역공

앱의 흐름진행을 오로지 상태테이블에 기반하여 흐름을 결정하고 이어가는 앱KONTEXUS-STUDIO을 만드는 프로젝트를 하고 있다. 이 앱이 필요한 가장 큰 이유는, 이런 방식의 진행을 정말이지 오랬동안 꿈꿔왔기 때문이다. 상태전이 테이블에 의한 앱의 진행은 까다롭지만 거의 모든 최악으로 복잡한 앱이라도 만들 수 있는 근본적인 방법이라고 생각한다. 이 앱은…

AGENTS.md 규정이 sequentialthinking MCP 동작에 미치는 영향

G선생이 추론하는 이 태스크의 목적을 기술하십시오. [T7] 태스크 목적을 위상과 결속 관점에서 정리하겠습니다. 요청은 구현이 아니라 목적 정의이므로, 현재 활성 태스크의 의미 경계를 먼저 추론합니다. [T7] G선생이 추론하는 이 태스크의 목적은 다음과 같습니다. ./AGENTS.md와 ./AGENTS.ftm.md가 각각 sequentialthinking MCP 도구 호출을 어떤 조건에서, 어떤 단계에, 어느…

MCP를 적극활용하여 WordPress Plugin 개발하기

CMUX+Browser API vs. TMUX+Playwright 시작은 Agent에게 프롬프트로만 WordPress 플러그인을 만들게 할 때, 맘에 드는 결과물이 나오게 하는 과정이 비싸고 비효율적인 것을 해결하기 위해서였다. WordPress는 OCI 기반 가상호스트에서 동작하고 있어서 초기에는 Local Agent를 WP 환경 바깥 호스트에 직접 ssh로 접속해서 개발하거나, WP가 동작하는 도커 컨테이너 안에서…

Pico-8 Game: Gadget_v2

WordPress Page를 쓰지 않고, 일반 Post 게시물에서 React/Flutter로 만든 페이지/앱을 임베딩하여 마치 WrodPress 게시물의 일부처럼 보이게하고 싶었다. 페이지나 포스트 하나 하나가 다른 앱을 보는 것인가 착각할 정도로 독립된 영역에서 동작하되, 업데이트와 관리가 가능해야한다는 요구조건을 만족시키는 방법을 실험하기 위한 게시물이다. 겉으로는 단순히 WASM으로 변환된 Pico8 게임이긴…

WP 방어

십수년간 업데이트 해오던 내 자료;; 홀라당 날려먹고 백업도 없어서 블로그를 내 팽겨친채 있다가, 다시 운영하려 할 때 걸림돌이 보안 문제였다.  워드프레스 사이트를 운영해본 사람들은 얼마나 공격질을 해대는지 이해할 것이다. 블로그를 내팽겨친 건 그 보안문제를 해결할 마땅한 방법이 없었기도 하거니와 시간내서 그 정도를 만들고 싶지도 않았기…

local static variable using TNG-Hooks

I personally have prefered to use React Hooks over React, since the lifecycle functions were quite boring me and were the place where codes are mixed around each other. I think the situation was quite far from ‘Reusability’ and made me to look for another…

자바스크립트 함수형 프로그래밍 – 루이스 아텐시오

이 글은 리뷰가 아니다. 2019년 4월 초에 구입했다. 가볍게 읽고 넘어간 부분과 함께 어떤 부분은 10번 이상, 어떤 부분은 수술하듯 단어를 분해하며 학습했다.  이 책이 다른 여타의 입문서나 Medium 글과 비교해 다른 건 체계적으로 함수형 프로그래밍을 어떻게 하는지 기술했다는 점이다. 소위 말하는 ‘초보자’를 위한 책은…