Skip to content
ioob.dev
Go back

45년 된 C 코드베이스가 즐거웠다

Celebrating 45 Years of Kermit with the First New C-Kermit Release in 15 Years (and working with a decades-old C codebase)

원문 보기 · The Changelog · John Goerzen ·
· 9분 읽기

96바이트씩 끊어 보내야 하던 시절의 설계

1981년의 컴퓨팅은 하드웨어도 소프트웨어도 비쌌고, 한 회사의 기계가 다른 회사 기계와 말이 통하리라는 보장이 없었습니다. 컬럼비아대가 딱 그 문제를 안고 있었고요. Frank da Cruz와 Bill Catchings가 만든 시리얼 프로토콜 Kermit은 그래서 처음부터 적응력이 설계의 중심이었습니다.

DEC-20과 IBM 메인프레임의 별난 점들이 요구 사항이 됐습니다. 한 번에 96바이트 넘게 처리하기 힘든 시스템을 감당해야 했고, 7비트 링크로 8비트 파일을 넘겨야 했고, ASCII와 EBCDIC 사이를 오가야 했고(지금은 여러 유니코드까지), 오류가 잦은 시리얼 링크를 다뤄야 했습니다.

1982년에 MS-DOS와 유닉스로 이식됐고, C로 구현한 C-Kermit이 결국 대표 구현이 됐습니다. 여기에 TCP 지원, 대화형 CLI, 셸과 Lisp와 expect에서 가져온 기능을 섞은 스크립트 언어, 그리고 요즘 고속 링크를 위한 점보 패킷·슬라이딩 윈도·스트리밍 모드가 붙었고요.

그 사이 Kermit이 다녀간 자리가 이렇습니다. 국제우주정거장, 허리케인 중 센서 데이터 수집, 우편 시스템, 보잉 787 제조. John Goerzen 본인은 지금 SSH 래퍼로 씁니다. 중첩된 ssh와 sudo와 su를 여러 겹 통과해 파일을 옮기는 용도죠. BBS 클라이언트로도, HP 48GX 계산기와 데이터를 주고받는 데도 쓰고요. 임베디드 기기에 펌웨어를 밀어 넣을 때도 여전히 쓰입니다.

2011년, 창립 30년 만에 컬럼비아대는 Kermit 프로젝트를 접고 C-Kermit을 BSD 라이선스 오픈소스로 풀었습니다. Frank da Cruz는 대학 밖에서 유지보수를 이어가겠다고 자원했고, 2025년 은퇴할 때까지 알파·베타 릴리스로 개발을 계속했습니다.

Varnish는 질색이었는데 이건 즐겁다

여기서 이 글이 재밌어집니다. 데비안 Kermit 메인테이너인 John Goerzen이 요즘 기대에 안 맞는 대목을 발견하고 작년부터 패치를 만들기 시작했거든요. 하나는 나이를 생각하면 놀랍지 않은 보안이었고, 다른 하나는 문자셋과 줄바꿈 변환이었습니다. 요즘은 바이트 단위로 똑같은 이진 전송에 익숙한데 기본값이 혼란을 만들고 드물게 데이터 손상까지 냈다는 겁니다.

옛 C 코드베이스가 처음도 아니었습니다. Varnish 같은 걸 겪어봤고, 대체로 싫어했다고 적습니다. 나쁜 관행과 끔찍한 관행이 섞여 있고 메모리 관리가 불분명하다는 게 보통이니까요.

“그런데 몇 달째 C-Kermit 코드베이스 안에서 살고 있는데, 나는 이게 즐겁다.”

(“But I’ve been living in the C-Kermit codebase for a few months now, and I enjoy it.”)

이유가 역설적입니다. 이 물건은 여전히 VMS와 OS/2에서, 그리고 ANSI를 들어본 적도 없는 컴파일러에서 빌드되도록 설계돼 있으면서 동시에 현대적 관행을 요구하는 컴파일러도 감당합니다. 그 전부에 우아함이 있다는 거예요.

그리고 바로 이 문장 끝에 괄호가 하나 붙습니다.

“(그 em 대시는 내 것이다. 나는 LLM이 존재하기 전부터 그걸 쓸 줄 알았고, LLM이 나 같은 사람을 베꼈다는 이유로 그만둘 생각은 없다! 이 글에 AI는 쓰지 않았다.)”

(“That em-dash was mine; I knew how to use them before LLMs existed and I’m not going to stop just because LLMs have copied people like me! No AI was used for this post.”)

테스트 2,000건과 줄어든 코드

작업 목록이 구체적입니다. 메모리 안전성 쪽과, 몇 년 전 scp에 들어간 패치와 비슷한 방식으로 악의적인 원격을 막는 쪽에서 잠재적 보안 문제를 여럿 고쳤습니다. IPv6도 넣었는데 당연히 조건부 컴파일이고요. C-Kermit이 빌드되는 시스템 중에는 IPv6를 들어본 적도 없고 앞으로도 없을 것들이 있으니까요. IPv6 지원은 있는데 IPv6 연결성은 없는 시스템을 위해 런타임 폴백 알고리즘도 붙였습니다.

패치가 데비안 패치 시리즈로 감당할 규모를 넘어섰다는 게 곧 분명해졌습니다. 배포판마다 베타를 받아들이는 정책이 달라서, 리눅스와 BSD 배포판들이 2011년 9.0.302부터 1년 반 전 마지막 베타까지 제각각을 돌리고 있었거든요. 패치를 쓸 만하게 공유하는 것조차 어려웠던 겁니다. 그래서 Open Kermit이라는 프로젝트를 열어 개발을 공개적으로 조율하기로 했습니다.

지금은 CI가 리눅스(x86_64·arm64), macOS, FreeBSD, NetBSD, OpenBSD에서 테스트 스위트를 돌리고, 그 전부에 musl libc로 정적 링크한 리눅스 바이너리까지 더해 릴리스를 만듭니다.

44년을 한 사람이

C-Kermit 11에는 헌사가 붙어 있습니다. Frank da Cruz가 1981년 최초 설계부터 2025년까지 44년간 Kermit에 직접 관여했다는 사실에 대한 것이고요. 오픈소스 프로젝트 창립자가 이렇게 오래 자리를 지킨 사례를 John Goerzen은 달리 알지 못한다고 적습니다. 리처드 스톨먼이 GNU Emacs를 시작한 게 1984년으로 Frank보다 3년 늦었는데, 그마저 2008년쯤 그 역할에서 물러났다는 비교를 붙였고요.

“Kermit이 시작될 때는 서로 다른 하드웨어와 운영체제 사이의 전송이 어렵거나 불가능했다. Frank는 다리를 놓는 걸 도왔다. Kermit은 국제우주정거장에서 휴대용 계산기까지 시스템들을 이어 붙였고, 상호운용성의 새 기준을 세웠다.”

(“When Kermit was begun, transfers between different hardware and operating systems were difficult or impossible. Frank helped build a bridge. Kermit glued systems together, from the International Space Station to pocket calculators, and set a new standard for interoperability.”)

HN 스레드에서 caycep이 이 글의 첫 문장을 받아 한마디 했습니다. 1981년은 하드웨어도 소프트웨어도 비쌌다는 대목이 요즘과 그리 달라 보이지 않는다고, VC들이 용케 과거로 돌아가는 데 성공했다고요. 45년 전 프로토콜 이야기에서 지금 이야기가 튀어나오는 건 이 스레드가 계속 하는 일입니다.


Share this post on:

Comments

Loading comments...