머리말
이 책은 내가 만든 C 라이브러리 proven의 입문서이자, C 언어 입문서이다. 이렇게 애매한 입장을 취하게 된 데에는 이유가 있다.
무엇을 쓰라고 권하려면 먼저 그것이 왜 필요한지를 보여야 한다. proven이 다루는 문제들은 C의 미묘한 자리에 있다 — 표현의 한계, 변환의 규칙, 기억의 수명, 표준이 약속하지 않은 영역들. 이 자리들을 모르는 사람들에게 proven은 불필요한 물건으로 보인다. 한편 이미 잘 알고 있는 사람들에게는 이것들을 다루는 자신만의 방법이 있어서, proven을 쓸 이유가 마땅치 않다.
그래서 라이브러리를 소개하기 전에, 그 문제들을 먼저 설명하기로 했다. C를 처음 배우는 사람을 염두에 두고 썼으므로 컴퓨터가 어떻게 생겼는지에서 시작해, 자료형과 흐름, 포인터와 배열, 기억의 수명, 표준 라이브러리를 차례로 지난다. proven이 독자에게 필요하지 않더라도, 앞부분의 내용은 충분히 쓸모가 있을 것이다. 앞의 내용을 읽고 나서 proven이 필요 없다고 판단할 수도 있지만, 그것 또한 좋은 결말이다. 어쨌거나 C의 문제 해결에는 도움이 될 테니까.
오랜 역사를 가진 C 언어에는 각 시대의 현실적인 한계와 어려움을 극복하려는 과정에서 생긴 다양한 상처와 뒤틀림, 그리고 진지한 고민의 흔적이 남아 있다. 그것들을 어루만지고 따라가 보는 일은 무척이나 흥미롭고 즐거운 경험이었으니, 거기에 내 나름의 노력과 흔적을 더해 보고 싶어진 것은 당연한 흐름이리라. proven을 만든 것도 이 책을 쓴 것도 필요보다는 결국 C를 좋아하는 사람으로서의 마음이 시킨 일임을 부정하지는 않겠다. 그 마음이 다소 과한 범위의 설명과 분량으로 흘러넘친 데 대해서는 독자들에게 미리 사과드린다.
이 책을 읽는 이들에게 미리 감사의 뜻을 표하고자 한다. 누군가가 시간을 들여 내 저작물을 함께 나누고 의견을 보태 준다는 것은 언제나 기쁜 일이다.
이 책의 의도와 이용 방법
먼저 분명히 해 둘 것이 있다. 읽기만 해서는 프로그래밍 능력이 자라지 않는다. 이 책은 연습문제도, 과제도, “직접 해 보라”도 두지 않는다. 단지 상황을 설명하고, 질문을 던지고, 그에 대해 답을 제공할 뿐이다. 의도한 것은 독자에게 C 언어의 든든한 기초 지식을 갖추게 하고, 그 안에 내재된 함정과 위험을 알아보는 감각과 안목을 길러 주는 것이었다. 이것은 빈 파일 앞에서 문제를 잘게 쪼개고, 떠오르지 않는 함수 이름을 찾아내고, 컴파일러가 쏟아 낸 오류를 하나씩 지우고, 예상과 다른 출력 앞에서 원인을 좁혀 가는, 실제로 코드를 만들어 내는 능력과는 다소 다르다. 그것은 직접 써 보는 일로만 자란다. 이 책은 그 일을 대신 하지 않으며, 대신 할 수 있다고 말하지도 않겠다. 그 부분은 다른 실습 과정이나 자신의 작은 프로그램으로 이어 가야 한다.
그것은 이 책의 결함이지만 의도적 선택이기도 하다. 연습과 과제를 넣으면 분량이 불고 독자의 부담도 함께 커진다. 나는 부담 없이 끝까지 읽히는 쪽을 택했고, 그 대가로 수행 훈련을 포기했다. 이 책은 이해를 위한 책이지, 무엇인가를 빨리 만들어 내기 위한 책은 아니다.
첫 프로그램이 늦다는 것도 미리 말해 둔다. 헬로 월드는 제3부에서야 나온다. 그전까지는 컴퓨터가 어떻게 생겼는지, 기억이 어떻게 나뉘는지, 수와 글자가 어떻게 표현되는지와 같은 기초를 세운다. C 언어를 문법이 아니라 개념으로 만나게 하려고 일부러 그렇게 놓았다. 빨리 무언가를 만들고 싶은 독자에게는 이 순서가 답답할 수 있다. 그런 독자는 15장 헬로 월드를 먼저 읽고 1장으로 돌아와도 좋다. 순서는 중요하지 않다.
이 책이 의도한 것은 단단한 기반이다. 빠른 결과가 아니라 오래 가는 이해다. 다른 책과 강좌에서 익힌 기술은 이 기반 위에 놓일 때 훨씬 덜 흔들린다. 정수가 왜 감아 돌고, 포인터가 왜 그냥 숫자가 아니며, 컴파일러가 무엇을 약속하고 무엇을 약속하지 않는지를 알고 쓰는 사람과 모르고 쓰는 사람의 차이는 시간이 갈수록 벌어진다.
이 책에 실린 모든 코드는 실제로 컴파일되고 실행된 것이다. 인쇄된 실행 결과는 사람이 옮겨 적은 것이 아니라 책을 만들 때마다 기계가 예제를 돌려 얻은 출력이며, 두 컴파일러(gcc와 clang)로 교차 검증했다.
밝혀 둘 것이 하나 더 있다. 이 책은 AI를 보조 도구로 삼아 집필했다. 무엇을 어떤 순서로 다룰지, 어떤 원칙으로 서술할지, 무엇을 싣고 무엇을 뺄지는 전부 내가 정했고, 원고는 그 지시에 따라 쓰인 뒤 내 검토를 거쳤다. 기술적 서술은 표준 문서와 1차 자료로 확인했으며, 앞 문단에서 말한 대로 예제는 사람이 아니라 기계가 매번 실제로 돌려 검증한다 — AI가 썼든 사람이 썼든 돌지 않는 코드는 이 책에 실리지 않는다는 뜻이다.
그럼에도 오류는 남아 있을 것이다. 그것은 도구의 몫이 아니라 내 몫이다. 발견하면 알려 주시기 바란다.
저작권과 연락처
본문 — 크리에이티브 커먼즈 저작자표시-비영리-동일조건변경허락 4.0 국제 라이선스(CC BY-NC-SA 4.0). 출처를 밝히면 자유롭게 공유하고 고칠 수 있으나, 영리 목적 이용은 허용되지 않으며, 고친 결과물에는 같은 라이선스를 적용해야 합니다.
https://creativecommons.org/licenses/by-nc-sa/4.0/
예제 코드 — MIT 라이선스. 자유롭게 가져다 쓰실 수 있습니다. 예제에서 사용한 proven 라이브러리는 그 자체의 라이선스(현재는 MIT 라이선스)를 따릅니다.
이 책의 모든 코드 시연은 실제로 컴파일·실행해 얻은 출력을 그대로 인쇄한 것입니다. 조판은 Typst로 했습니다.
이 책은 계속 고쳐집니다. 지금 읽고 계신 것은 위 번호의 판이고, 그 뒤로도 오류 수정과 내용 보강이 이어집니다. 가장 새로운 판과 그동안의 변경 내역은 저자의 GitHub에 있습니다. 오래된 사본을 들고 계시다면 그쪽을 먼저 확인하시는 편이 좋습니다. 오류 신고와 수정 제안도 같은 자리에서 받습니다.