Lobsters

Nim version 2.4.0 released

Nim 2.4.0 안정판 출시…병렬 빌드와 스레드 간 순환 참조 지원

Nim 팀이 10월 28일 안정판 2.4.0을 발표했습니다. 새 문자열 API와 병렬·증분 빌드, 여러 스레드에 걸친 순환 참조를 처리하는 메모리 관리 방식 등을 추가했습니다.

본문

Nim 팀이 10월 28일 새 안정판 Nim 2.4.0을 발표했습니다. 문자열 소형 최적화와 병렬·증분 빌드, 스레드 사이의 순환 참조를 처리하는 YRC, 간결해진 합 타입 문법이 주요 변경점입니다.

문자열은 --strings:sso를 켜면 소형 문자열 최적화를 사용합니다. 이를 효과적으로 쓰려면 기존의 문자열 내부 주소를 직접 다루던 코드를 새 API로 옮겨야 합니다. 읽기에는 readRawData, 문자열이 이동해도 유지해야 하는 포인터에는 readRawDataStable, 문자열에 데이터를 한꺼번에 쓸 때는 beginStore와 endStore를 씁니다. 이 API는 SSO를 켜지 않은 환경에서도 사용할 수 있어 점진적으로 옮길 수 있습니다. 문자열을 수정하거나 이동하면 내부 포인터가 달라질 수 있다는 점도 새 지침에 담겼습니다.

--ic:on은 빌드를 병렬화하고 증분 재빌드를 지원합니다. 병렬 처리는 스레드가 아닌 여러 프로세스를 사용하므로 전역 .compileTime 변수를 쓰는 매크로는 수정이 필요할 수 있습니다. Nim 팀은 물리 코어 16개인 시스템에서 Nim 컴파일 시간이 IC를 끈 경우 31초, 켠 경우 25초였다고 소개했습니다. 이 수치는 해당 환경의 사례입니다.

--mm:yrc는 ORC와 같은 API를 제공하면서 여러 스레드에 걸친 순환 참조를 처리합니다. 순환이 없는 데이터에는 원자적 참조 카운팅을 쓰고 포인터를 대입할 때 쓰기 장벽을 실행해 순환 참조를 추적합니다. 전용 GC 스레드나 전체 스레드를 멈추는 단계는 두지 않습니다. 대신 Nim 팀의 orcbench 측정에서 YRC는 ORC보다 약 2배 느리고 메모리를 약 2배 사용했습니다.

합 타입은 별도의 열거형과 kind 필드 없이 분기 이름과 필드를 선언하는 문법을 지원합니다. 내부 메모리 구조와 성능은 기존 case object와 같고, 필드는 패턴 매칭으로 접근합니다. 기존 case object 문법도 계속 지원합니다. 순환 모듈 의존성은 import에 {.cyclic.}을 붙이면 모듈들이 함께 검사돼 서로의 타입과 프로시저를 참조할 수 있습니다. 표기하지 않은 순환 import도 계속 작동하지만 폐기 예정 기능으로 안내됐습니다.

별도 기능인 owned 참조는 --experimental:ownedRefs가 필요한 실험 기능입니다. Nim 팀은 이 기능의 코드 호환성이 바뀔 수 있다고 밝혔습니다. 같은 날 Nim 2.2 사용자를 위한 버그 및 보안 수정판 2.2.14도 출시했습니다.

자료: Nim Blog / 정리·해설: Trawling