# 실행 엔진 종류

> 실행 방식별 구현과 지원 프로시저와 비교 자료를 확인합니다.

Canonical page: https://www.lispex.com/v1.20/ko/docs/reference/runtime-backends

Version check: this file describes v1.20. Fetch https://www.lispex.com/version.json before treating it as the current manual.

리스펙스 구현을 비교해 결과와 출력과 진단의 차이를 살펴보세요.
구현 표에서 프로그램에 필요한 비교 방식을 고릅니다.
실행 방식마다 다른 이 구현들을 런타임 구현이라고 부릅니다.

네이티브 1.20.0에는 Rust 인터프리터와 Rust VM이 들어 있습니다.
LIL과 LIT를 비교할 때는 아래에 설명한 실행기를 별도로 설치해야 합니다.
일반 규칙 실행은 [애플리케이션에서 리스펙스 실행하기](/ko/docs/guides/choosing-runtime)에서 시작하세요.

## 비교 방식 고르기

| 할 일                                      | 입력               | 필요한 제품                           |
| ------------------------------------------ | ------------------ | ------------------------------------- |
| `compare`로 소스 인터프리터 비교           | 소스와 선택한 구현 | 네이티브와 설치된 LIL 또는 LIT 실행기 |
| `compare-engines`로 tree와 바이트코드 비교 | 소스               | 네이티브                              |

[비교 참조](/ko/docs/reference/backend-observation-matrix)에서 보고서를 고르고 결과를 읽는 방법을 확인하세요.
바이트코드 저장과 실행은 [바이트코드와 배포](/ko/docs/guides/verified-bytecode)에서 다룹니다.

## 같은 소스를 두 엔진으로 실행하기

다음 전체 프로그램을 `answer.lspx`로 저장합니다.

```lispex
(+ 20 22)
```

기본 Rust 인터프리터로 실행합니다.

```sh
lispex answer.lspx
```

**출력**

```text
42
```

이번에는 Rust 가상 머신인 VM을 선택합니다.
VM은 바이트코드라는 미리 준비한 명령을 실행하는 프로그램입니다.

```sh
lispex run --backend rust --engine vm answer.lspx
```

**출력**

```text
42
```

두 명령 모두 종료 상태는 `0`이고 파일을 만들지 않습니다.
VM 명령에서는 네이티브가 바이트코드를 만들고 검사한 뒤 실행합니다.
기본 엔진인 `tree`는 소스의 구문 트리를 평가하는 인터프리터입니다.

<a id="인터프리터-구현" />

## 소스 인터프리터

LIL은 리스펙스로 작성한 리스펙스 인터프리터입니다.
자체 리더와 정규화와 평가를 구현하며 Rust 인터프리터 위에서 실행됩니다.
네이티브와 WASM 형태는 같은 LIL 소스를 사용합니다.

LIT는 토파즈로 작성한 리스펙스 인터프리터입니다.

| 구현            | 프로시저 항목         | 사용 조건                                                   |
| --------------- | --------------------- | ----------------------------------------------------------- |
| Rust 인터프리터 | 205/205               | 네이티브와 npm과 일반 브라우저 실행에 포함                  |
| LIL             | 205/205               | 설치된 실행기와 해당 백엔드 레지스트리 항목 필요            |
| LIT             | 아래 버전별 기록 참고 | 토파즈가 제공하는 실행기와 해당 백엔드 레지스트리 항목 필요 |

네이티브는 `lispex backends --json`으로 설치된 제품을 보고합니다.
실행기가 없으면 사용할 수 없다는 상태를 표시합니다.
LIL이나 LIT를 직접 요청하면 그 선택을 유지하며 제품을 실행할 수 없을 때 실패를 알립니다.

### 계약 버전별 LIT 지원 읽기

| 기록                     | 지원 프로시저 항목 | 뜻                                                           |
| ------------------------ | ------------------ | ------------------------------------------------------------ |
| 초기 LIT 구현 기록       | 84/205             | 나머지 121개 항목은 미지원 상태를 보고                       |
| 후속 토파즈 구현 계약 v7 | 205/205            | `status: complete`인 계약의 `current` 수치                   |
| 리스펙스 소비 계약 v2    | 204/205            | `status: implementation-in-progress`인 소비 계약의 기준 수치 |

각 기록은 서로 다른 시점과 소비 제품을 다룹니다.
v7에도 과거 기준값 84가 남아 있지만 현재값은 205입니다.
네이티브 설치와 LIT 실행기 설치, 계약 동기화는 별개입니다.
분모는 `profile-required`로 표시된 내장 프로시저 레지스트리의 205개 항목입니다.
비교할 때는 실제 설치된 실행기가 보고한 지원 결과를 읽으세요.

<a id="엔진별-입력과-구현" />
<a id="core-ir과-바이트코드" />

## 바이트코드 구현

Rust VM인 `lispex-rust-vm/v1`은 네이티브에 들어 있습니다.
Rust 소스 프런트엔드와 Core IR 컴파일러가 만든 바이트코드를 실행합니다.

Core IR은 이름의 참조를 정한 중간 표현입니다.
네이티브는 현재 언어 프로파일 전체를 정해진 `lispex.core-ir/v1` 형식으로 변환하고 검사합니다.
검사 결과에서 변수 셀과 캡처한 변수와 꼬리 위치와 요구사항과 소스 위치와 식별자를 볼 수 있습니다.

컴파일러는 검증된 Core IR을 `lispex.bytecode/v1`로 변환합니다.
검증기는 VM 상태를 만들기 전에 바이트코드를 검사합니다.
Rust VM은 내장 프로시저 205개 항목을 모두 구현합니다.
사용자 프로시저를 호출하는 18개 항목은 반복형 VM 상태 기계로 호출을 관리합니다.

<a id="실행-비교와-바우치" />

## 결과와 자원 사용량 읽기

비교 보고서는 결과와 자원 사용량과 소스 및 제작 출처를 서로 다른 필드에 기록합니다.
선택한 실행 방식의 오류와 자원 상태는 각각 유지합니다.
보고서는 새 경로에 원자적으로 기록하므로 완성된 파일만 나타납니다.

의미 차이와 자원 차이는 따로 읽으세요.
의미 관측은 상태와 주 진단 코드와 메시지와 출력과 값과 경고와 진단을 포함합니다.

| 비교 제품           | 비교할 자원 관측          |
| ------------------- | ------------------------- |
| Rust tree와 Rust VM | 출력 바이트와 완료한 루트 |

tree 인터프리터는 자체 깊이 모델을 사용합니다.
소스 인터프리터 비교는 자원 종료 결과를 확인하며 사용량 필드 다섯 개가 모두 있는지 검사합니다.
종료 결과를 비교할 때 각 구현의 사용량 수치는 별도로 유지합니다.
프로시저 지원 수와 자원 사용량 계수기는 서로 다른 질문에 답합니다.
계수기 정의는 [자원 참조](/ko/docs/manual/determinism-resources)에서 확인하세요.

### 비교에 쓰인 제품 확인하기

| 기록 정보             | 식별하는 것                                                    |
| --------------------- | -------------------------------------------------------------- |
| 런타임 구현           | 인터프리터 종류와 버전이 지정된 실행 방식                      |
| 호출                  | 재현할 명령 또는 프레임 단위 요청 프로토콜                     |
| 파일 식별자           | 정확한 실행 파일과 WASM과 연결 코드 바이트                     |
| 소스와 제작 출처 기록 | 선언한 소스와 제품을 만든 방법                                 |
| 자원 프로파일         | 이름 붙은 한도와 보고된 사용량 계수기                          |
| 비교한 사례           | 정확한 입력 모음과 인터프리터 종류와 대상 플랫폼과 호스트 변형 |

이 정보로 어떤 제품과 실행 조건에서 비교 결과가 나왔는지 확인할 수 있습니다.
명령 형식과 실행 상세는 [바이트코드와 Rust VM](/ko/docs/reference/bytecode-vm)에서 설명합니다.

## 과거 비교 기록 읽기

과거 비교 기록은 이름 붙은 사례 144개를 다룹니다.
실행에 쓴 Rust와 LIL과 LIT 실행 파일, 자원 프로파일, 결과, 재실행을 식별합니다.
사례 수는 실제 실행한 입력을 나타냅니다.
프로시저 표는 다른 분모를 사용하는 구현 범위입니다.

원본 보고서와 입력과 카탈로그와 제품, 해당 버전의 도구를 함께 보관하세요.
과거 기록의 범위는 [엔진 실행 결과 비교](/ko/docs/reference/backend-observation-matrix)에서 확인하세요.

## 관련 제품 기능

애플리케이션 호출에는 [평가기 참조](/ko/docs/reference/bounded-evaluator)의 결정 평가기와 전체 프로파일 평가기를 구분해 사용하세요.
편집기에서 신뢰하는 소스를 평가하고 정해진 구현을 비교하려면 [네이티브 MCP](/ko/docs/reference/mcp)를 참고하세요.

### 컴파일된 리스펙스 바우치

컴파일된 리스펙스 바우치는 Rust VM을 사용합니다.
네이티브는 소스와 연결된 `lispex.vouch-compiled-artifact/v1` 파일을 만들고 요청을 인증합니다.
수신자가 선택한 정확한 소스에서 Core IR과 바이트코드를 다시 만듭니다.
현재 tree와 Meaning의 일치를 기록하고 검증된 Rust VM 결과와 비교한 뒤 로컬 게이트에 전달합니다.

## 제품별 대화형 출력

네이티브와 npm과 공개 WASM과 플레이그라운드는 같은 대화형 출력 규칙을 사용합니다.
평가 전에 전체 소스를 읽고 축약 문법을 핵심 형식으로 바꿉니다.
이후 명시적인 출력과 성공한 각 형식의 값을 순서대로 표시합니다.

| 종료 이유      | 출력과 상태                             |
| -------------- | --------------------------------------- |
| 성공           | 출력과 값, 상태 `0`                     |
| 일반 실행 오류 | 앞선 형식이 이미 낸 출력 보존, 상태 `1` |
| 자원 한도 도달 | 빈 출력과 자원 진단 하나, 상태 `2`      |

브라우저 결과에는 `output`, `diagnostics`, `ok`, `exit_status`가 있습니다.
[입출력과 권한](/ko/docs/manual/io-capabilities)에서 출력 동작을 예제로 확인할 수 있습니다.

네이티브는 포매팅과 로컬 MCP 작성 서비스도 제공합니다.
VS Code와 Open VSX 확장은 설치한 네이티브 실행 파일에 문서 포매팅을 맡깁니다.
MCP는 로컬 표준 입출력으로 언어 참조와 프로시저 레지스트리와 신뢰하는 소스의 평가와 진단과 정해진 엔진 비교를 제공합니다.
평가기에는 선언한 바이트와 시간 한도가 적용됩니다.
명령과 결과는 [CLI 참조](/ko/docs/reference/cli)에서 확인하세요.
