TECH 으로 돌아가기
TECH HACKER NEWS 오늘 7분 읽기 26 READS

치킨 스킴 6.0, UTF-8 문자열과 R7RS 표준 내재화로 체질을 바꾸다

임베디드용 코드 생성과 C 연동에 강점을 지닌 스킴(Scheme) 구현체 치킨(CHICKEN)이 6.0.0 버전을 내놓았다. 마이너 업데이트가 아니라 언어의 기반 자료구조와 표준 준수 방식을 갈아엎은 메이저 릴리스로, 기존 5.x 코드베이스를 유지하는 팀이라면 단순 재컴파일로는 넘어가기 어려운 파괴적 변경이 여럿 포함돼 있다. 핵심을 한 줄로 요약하면 'R7RS small 표준의 내재화'와 '문자열의 UTF-8 전환'이다.

문자열이 UTF-8 네이티브가 됐다

가장 실무적으로 체감되는 변화는 내부 문자열 표현이 UTF-8로 바뀌었다는 점이다. 이제 문자열은 완전한 유니코드를 다룰 수 있고, 문자열에 대한 로케이티브(locative)도 바이트가 아니라 코드 포인트 단위로 색인된다. 다국어 텍스트를 다룰 때 외부 라이브러리에 의존하던 부담이 줄어드는 반면, 바이트 오프셋을 가정하고 짜인 기존 코드는 인덱싱 의미가 달라지므로 점검이 필요하다. 파일 입출력도 인코딩 인식형으로 바뀌어 open-input-file과 open-output-file이 인코딩 인자를 받는데, 현재 지원되는 값은 기본값 UTF-8과 Latin-1(ISO-8859-1)이다.

문자열과 바이너리 데이터의 경계도 명확해졌다. 치킨 고유의 blob 타입을 담던 (chicken blob) 모듈은 R7RS 호환 연산을 제공하는 (chicken bytevector)로 대체됐고, 바이트벡터는 SRFI-4의 u8vector와 완전히 동등해졌다. 이에 따라 file-read, file-write, random-bytes, set-pseudo-random-seed! 같은 저수준 연산은 이제 문자열이 아니라 바이트벡터 인자를 요구한다. 기존 #${...} 리터럴 문법은 사라지고 #u8(...) 또는 #u8"..." 형태를 쓴다. 문자열과 바이트 데이터를 뒤섞어 쓰던 관행이 컴파일 단계에서 걸러지는 셈이다.

R7RS를 표준 경로로 삼다

6.0은 R7RS small 언어가 규정한 모든 모듈을 코어에 포함시켰고, 그동안 (chicken base)에 있던 상당수 기본 프로시저를 표준 모듈로 이동시켰다. call/cc, make-parameter, parameterize, vector-copy!, open-input-string 등이 (scheme base)로 옮겨졌고, case-lambda는 (scheme case-lambda), features는 (scheme base)로 재배치됐다. 특히 define-record-type가 (scheme base)로 이동하면서 R7RS 준수를 위해 '생성적(generative)' 의미로 바뀐 점은 레코드 타입 동일성에 의존하던 코드에 영향을 준다. srfi-9, srfi-39 등 여러 SRFI 별칭 모듈은 R7RS가 이미 포괄한다는 이유로 제거됐고, r5rs 계열 모듈도 (scheme ...) 이름으로 통일됐다. 컴파일러·인터프리터 옵션 -r5rs-syntax도 -r7rs-syntax로 개명됐다.

프로세스 API도 손봤다. process-fork, process-run, process, process*는 이제 PID 대신 프로세스 객체를 반환하며, 종료 상태나 입출력 포트는 레코드 접근자로 꺼낸다. 파일 잠금은 flock(2) 시스템 콜 기반으로 재작성돼 파일 전체에 대해 동작하고 스레드 안전성을 확보했으며, file-test-lock은 제거됐다. C 연동에서는 문자열과 심벌을 외부 코드로 넘길 때 더 이상 복사하지 않고 직접 전달하므로, 외부 코드의 변경이 스킴 쪽에도 그대로 보인다는 점을 유의해야 한다. 복소수와 C 구조체·공용체를 인자와 반환값으로 직접 주고받는 것도 가능해졌다.

컴파일러와 빌드 환경

최적화 측면에서는 클로저 재사용과 공유를 통해 메모리 할당을 줄이는 -merge-reusable-closures, -merge-shareable-closures 옵션이 추가됐고, 각각 최적화 레벨 1과 2에서 자동으로 켜진다. 빌드 시스템은 관례적인 configure 스크립트 방식을 도입해 플랫폼 점검을 강화했다. 윈도우에서는 최소 mingw 빌드를 더 이상 지원하지 않고 POSIX 셸과 기본 명령줄 도구를 요구하며, 권장 툴체인으로 크리스 웰론스의 w64devkit을 제시했다. C 컴파일러 자리에 zig cc를 쓰는 빌드도 가능해졌다.

부수적인 개선도 눈에 띈다. number->string이 기수를 기존 16진에서 36진까지 받도록 확장됐고, max와 min은 nan이 아닌 인자가 하나라도 있으면 nan 값을 무시한다. 코어에 있던 feathers 디버거는 별도 에그(egg)로 분리됐다. 앞선 5.4.0에서 반영된 보안 이력도 함께 기록됐는데, 에그 설치 시 메타데이터를 통한 임의 OS 명령 주입 취약점(CVE-2022-45145)을 차단했고, 임의 프로그램의 CLI에서 REPL로 빠져나올 수 있어 위험하다고 판단된 런타임 옵션 -:b를 제거했다.

정리하면 6.0은 치킨을 표준에 더 가깝고 유니코드를 기본으로 다루는 처리계로 만드는 대신, 그 대가로 문자열·바이트벡터·프로세스·레코드 전반에 걸친 마이그레이션 작업을 요구한다. 다국어 처리나 R7RS 코드 이식성이 중요한 프로젝트에는 반길 만한 방향이지만, 기존 자산이 큰 팀은 업그레이드 전에 문자열 인덱싱과 이진 데이터 처리, 레코드 타입 동일성 가정을 우선적으로 감사하는 편이 안전하다. 여기 정리한 항목은 릴리스 노트에 명시된 변경에 한정되며, 실제 이관 시에는 공식 문서로 각 API의 세부 서명을 확인해야 한다.

SOURCE · HACKER NEWS
원문 전체 보기 → https://code.call-cc.org/releases/6.0.0/NEWS
SHARE
처리 중...