코드 속에서 발견된 정체불명의 문자열
'Beej's Guide to Network Programming'이라고, 네트워크 프로그래밍을 공부한 분이라면 한 번쯤 신세 졌을 전설의 무료 가이드가 있어요. 그 저자인 베이지(Beej)가 이번엔 좀 엉뚱한 글을 올렸는데요. 오래된 8비트 시절 베이직 코드를 들여다보다가 이런 줄을 발견한 거예요.
10 REM"_(C2SLFF4
REM은 베이직에서 주석(comment)을 뜻하는 명령어예요. 그러니까 이 줄은 프로그램 첫 줄에 달린 주석인 셈인데, 내용이 '_(C2SLFF4'라니 아무리 봐도 사람이 남긴 메모 같지가 않죠. 오타라기엔 이상하고, 암호라기엔 뜬금없고요. 베이지는 이 외계어의 정체를 끝까지 파고들었고, 그 추적기가 이번 글이에요. 결론부터 말하면 이 문자열은 사람이 타이핑한 글자가 아니라, 40년 전 컴퓨터가 프로그램을 저장하던 방식이 남긴 흔적에 가까운 물건이에요. 이걸 이해하려면 코모도어 시절 베이직이 어떻게 돌아갔는지를 알아야 하는데, 이게 진짜 재미있거든요.
그 시절 베이직은 코드를 '글자 그대로' 저장하지 않았어요
1980년대 코모도어 64 같은 8비트 컴퓨터는 메모리가 64KB밖에 없었어요. 요즘 웹페이지 하나가 수 MB인 걸 생각하면 눈물 나는 크기죠. 그래서 베이직 인터프리터는 코드를 한 글자씩 그대로 저장하지 않고 토큰화라는 걸 했어요. 이게 뭐냐면, PRINT나 GOTO 같은 키워드를 통째로 1바이트짜리 코드 번호로 바꿔서 저장하는 거예요. PRINT는 다섯 글자니까 5바이트가 필요하지만 토큰으로는 딱 1바이트면 되거든요. 그리고 LIST 명령으로 코드를 볼 때는 이 토큰을 다시 키워드로 풀어서 화면에 보여줘요. 즉, 우리가 화면에서 보는 코드와 메모리에 실제로 저장된 바이트가 서로 다르다는 얘기예요.
여기에 함정이 하나 더 있어요. 코모도어는 문자 인코딩도 지금 우리가 쓰는 아스키(ASCII)가 아니라 PETSCII라는 자기들만의 문자 체계를 썼어요. 대문자와 소문자의 위치가 아스키와 다르고, 하트나 카드 무늬 같은 그래픽 문자도 잔뜩 들어 있는 독특한 물건이죠. 게다가 코드에서 따옴표를 열면 '따옴표 모드'라는 상태로 들어가서, 커서 이동이나 화면 지우기, 글자색 변경 같은 제어 동작까지 문자처럼 문자열 안에 박아 넣을 수 있었어요. 그 시절 컴퓨터 잡지에 실린 타이핑용 코드 목록에 {CLR} 같은 괴상한 표기가 등장했던 게 바로 이것 때문이에요. 문제의 주석에도 REM 바로 뒤에 따옴표가 하나 열려 있다는 점, 눈치채셨나요? 바로 이 지점부터 평범한 텍스트의 세계를 벗어나는 거예요.
그래서 저 외계어는 어떻게 태어났냐면
이제 퍼즐이 맞춰져요. 저장된 프로그램 파일은 키워드 토큰과 PETSCII 문자와 제어 코드가 뒤섞인 바이트 덩어리인데, 이걸 원래 규칙대로 해석하지 않고 현대 컴퓨터에서 그냥 텍스트로 읽어버리면 어떻게 될까요? 텍스트가 아닌 바이트들이 엉뚱한 문자로 둔갑하면서 '_(C2SLFF4' 같은 외계어가 튀어나오는 거예요. 사람이 쓴 주석이 아니라 저장 포맷과 문자 인코딩의 어긋남이 만들어낸 유령인 거죠. 재미있는 건 그 시절 프로그래머들이 이 특성을 역으로 이용하기도 했다는 거예요. REM 주석 자리에 기계어 코드를 숨겨 넣고 실행한다든가, 제어 문자를 심어서 LIST를 치면 화면이 엉망이 되게 만드는 '리스트 보호' 같은 트릭이 유행했거든요. 겉보기엔 쓰레기 같은 주석이 사실은 프로그램의 심장이었던 경우도 있었다는 거죠.
오래된 바이트를 읽는 즐거움
이런 글이 좋은 건, 40년 전 바이트 몇 개를 놓고 포렌식 하듯 추리해 가는 과정 자체가 훌륭한 공부가 되기 때문이에요. 우리가 보는 코드와 저장된 바이트는 다르다는 것, 인코딩이 어긋나면 유령 문자가 태어난다는 것. 이거, 지금도 그대로 유효한 교훈이잖아요. UTF-8 문서를 EUC-KR로 잘못 열어서 만나는 그 익숙한 깨진 한글도 본질적으로 같은 현상이거든요. 낡은 포맷을 다뤄야 하는 레거시 마이그레이션이나 리버스 엔지니어링에서도 이런 감각이 그대로 쓰이고요.
한 줄로 정리하면, '이상한 문자열을 만나면 오타라고 넘기지 말고 바이트 단위로 의심해 보라'는 거예요. 여러분도 코드나 데이터에서 도저히 설명이 안 되는 흔적을 발견하고 끝까지 추적해 본 경험이 있나요? 그 미스터리의 범인은 뭐였는지 궁금하네요.
🔗 출처: Hacker News
TTJ 코딩클래스 정규반
월급 외 수입,
코딩으로 만들 수 있습니다
17가지 수익 모델을 직접 실습하고, 1,300만원 상당의 자동화 도구와 소스코드를 받아가세요.
"비전공 직장인인데 반년 만에 수익 파이프라인을 여러 개 만들었습니다"
실제 수강생 후기- 비전공자도 6개월이면 첫 수익
- 20년 경력 개발자 직강
- 자동화 프로그램 + 소스코드 제공