0.1. 실행 엔진과 사용자 표면
rok 의 실행 모델은 두 축으로 구성됩니다. 하나는 코드가 기계어가 되는 방식을 결정하는 실행 엔진이며, 다른 하나는 사용자가 코드를 입력하고 결과를 받는 환경인 사용자 표면입니다. 엔진은 두 가지이고 표면은 세 가지입니다. 같은 엔진을 여러 표면이 공유하기 때문에 엔진의 가짓수가 표면보다 적습니다.
0.1.1. 실행 엔진
JIT (Just-in-Time)
JIT 엔진은 코드 조각이 입력되는 즉시 컴파일하여 실행합니다. 한 입력 단위, 즉 한 줄이나 한 셀은 그 직전까지 누적된 상태인 변수, 함수, 가져온 모듈 등을 참조합니다. 새 입력이 기존 정의를 덮어쓰면 그 이후의 입력은 새 정의를 보게 됩니다. 또한 컴파일 결과는 메모리와 디스크에 캐시되므로 같은 입력을 재실행할 때에는 즉시 끝납니다.
AOT (Ahead-of-Time)
AOT 엔진은 소스 전체를 미리 컴파일하여 단일 산출물, 즉 실행 파일 또는 정적 라이브러리 .a 로 만듭니다. 따라서 실행 시작 시 컴파일 비용이 발생하지 않으며, 다른 rok 코드에서 라이브러리로 링크할 수 있습니다. 다만 런타임에 새 코드를 추가하는 것은 불가능합니다.
의미론은 같습니다
중요
두 엔진은 같은 의미론을 공유합니다. JIT 에서 동작한 코드는 AOT 빌드에서도 같은 결과를 냅니다. 차이는 컴파일 시점 에만 있습니다. 본 사양은 두 엔진에 동시에 적용되며, 한쪽에만 적용되는 의미론은 없습니다.
이 원칙은 진입점에도 적용됩니다. REPL 과 Jupyter 의 입력은 실행 패키지의 main.rok 끝에 top-level 문과 항목을 차례로 덧붙인 것과 같은 의미를 가지며, 셀 최상위에서 같은 이름을 다시 let 으로 선언해 새 바인딩을 만드는 일이나 셀 재실행 같은 세션 조작만이 대화형 표면에 고유합니다 (4.16.10).
JIT 와 AOT 라는 약어는 용어집 에 있는 그대로 사용합니다.
같은 파이프라인을 공유합니다
JIT 와 AOT 는 rok-mir 까지 같은 컴파일 파이프라인을 통과합니다 (0.2. 컴파일 파이프라인). 갈라지는 곳은 코드 생성뿐입니다. JIT 엔진 은 입력마다 rok 의 native backend 로 곧바로 기계어를 만들어, 세션 동안 사는 host 프로세스에서 실행합니다 (9.6). AOT 엔진 은 -O0 에서는 native backend 로, -O1 이상에서는 MLIR → LLVM 파이프라인으로 코드를 만들고 네이티브 바이너리로 링크합니다 (9.2). 두 backend 는 같은 런타임 ABI 를 따릅니다.
이러한 구조에서는 하나의 컴파일러 구현이 두 엔진을 모두 담당합니다. 따라서 동작 차이가 발생한다면 그 원인은 컴파일러가 아니라 실행 시점의 환경, 즉 메모리, 스레드, OS 자원에 있다고 보아야 합니다.
0.1.2. 사용자 표면
REPL
REPL 표면에서는 터미널에서 한 줄 또는 한 식을 입력하면 즉시 평가되어 결과가 출력됩니다. 주로 탐색, 수식 시연, 타입 확인 용도로 사용됩니다. 변수와 함수의 정의는 입력 사이에 누적되며, 마지막 표현식의 값과 타입은 자동으로 표시됩니다.
엔진은 JIT 이고, 입력 단위는 한 줄 또는 한 식입니다.
Jupyter
Jupyter 표면은 Jupyter / JupyterLab 의 rok 커널로 동작합니다. 한 셀 단위로 평가하며, 결과는 노트북 안에 시각화, 테이블, 텍스트로 남습니다. 이를 통해 데이터 분석의 표준 작업 흐름을 지원하며, 셀을 재실행하면 이전 정의가 교체됩니다.
엔진은 JIT 이고, 입력 단위는 한 셀입니다. Jupyter 프론트엔드 (JupyterLab, Notebook, VS Code 등) 가 rok 커널을 별도 프로세스로 실행하고 ZeroMQ 기반 Jupyter wire protocol 로 통신합니다 (9.8). 커널은 OS 의 파일 시스템, 네트워크, 외부 프로세스를 그대로 씁니다.
AOT 산출물
AOT 산출물 표면에서는 소스를 빌드한 실행 파일을 직접 실행하거나, 만든 정적 라이브러리를 다른 빌드에 링크합니다.
엔진은 AOT 입니다.
0.1.3. 엔진과 표면의 매핑
┌── REPL (terminal)
JIT ──────┤
└── Jupyter (kernel, ZMQ)
AOT ────── direct artifact execution
세 표면이 두 엔진을 공유합니다.
0.1.4. 의미의 기준
사양이 모호한 지점에서는 AOT 의미가 우선합니다. JIT 는 AOT 의 의미를 셀 단위로 재현합니다.