구현체(Implementations)

구현체(Implementations)

Racket은 구현체와 무관하게 동작하도록 정의되어 있지만, 세부 사항 중 일부는 구현체에 따라 달라질 수밖에 없습니다. 지금은 두 가지 주요 구현체가 사용되고 있어요.

출처: Racket Reference

본문

Racket의 정의는 결정성(determinism)과 구현체로부터의 독립성을 목표로 합니다. 그럼에도 불구하고, 몇몇 세부 사항은 필연적으로 구현체에 따라 달라집니다. Racket은 현재 두 가지 주요 구현체를 갖고 있습니다:

CS 구현체는 Racket 8.0 버전부터 기본 구현체입니다. 이 변형이 "CS"라고 불리는 이유는 코어 컴파일러이자 런타임 시스템으로 Chez Scheme을 사용하기 때문입니다.

CS 구현체는 대개 Racket 프로그램에 가장 좋은 성능을 제공합니다. 컴파일된 Racket CS 코드는 .zo 파일 안에 대개 운영체제와 아키텍처에 특화된 기계어(machine code)를 담고 있습니다.

BC 구현체는 7.9 버전까지 기본 구현체였습니다. "BC"라는 표기는 "before Chez" 또는 "bytecode"를 뜻합니다.

컴파일된 Racket BC 코드는 .zo 파일 안에 대개 플랫폼 독립적인 바이트코드를 담고 있으며, 코드가 로드될 때 "just in time" 방식으로 기계어로 추가 컴파일됩니다.

Racket BC에는 두 가지 변형이 있습니다: 3mCGC입니다. 둘의 차이는 가비지 컬렉션 구현에 있습니다. 3m은 메모리의 객체를 옮기는 가비지 컬렉터(예를 들어 외부 라이브러리에서도 그 효과가 보이는 방식)를 사용하고 할당된 객체를 정밀하게 추적하는 반면, CGC는 임베딩된 외부(Foreign) 환경의 협력을 덜 요구하는 "보수적(conservative)" 컬렉터를 사용합니다. 3m 하위 변형은 CGC보다 훨씬 좋은 성능을 보이는 경향이 있고, 370 버전(현재 버전 규약으로는 v3.7)에서 기본 변형이 되었습니다.

대부분의 Racket 프로그램은 모든 구현 변형에서 동일하게 동작하지만, 일부 Racket 기능은 특정 구현 변형에서만 사용할 수 있고, Racket과 외부(Foreign) 함수의 상호작용도 변형에 따라 크게 다릅니다. 현재 실행 중인 구현체에 대한 정보를 얻으려면 system-type을 사용하세요.

더 알아보기