이 실습에는 네이티브 CLI를 사용합니다. 리스펙스 VM은 컴파일·검증된 리스펙스 바이트코드를 실행합니다. 아래에서 사용하는 중간 파일은 Core IR 가이드에서 설명합니다.
소스와 입력 준비하기
규칙 전체를 heading-core.lspx로 저장하세요.
(define (제목-위치 남은-줄)
(if (< 남은-줄 2) '다음-쪽으로 '그대로))
(제목-위치 input)입력값은 request.lspx로 저장하세요.
1명령이 이 값을 input에 전달합니다.
Core IR과 바이트코드는 이 요구사항을 explicit-input으로 기록합니다.
파일 두 개 만들기
lispex core-ir build --source heading-core.lspx --out heading-core.lpxir
lispex bytecode build --ir heading-core.lpxir --out heading-core.lpxbc두 명령의 종료값은 0이며 JSON 보고서에 execution: "not-run"이 표시됩니다.
첫 명령은 heading-core.lpxir를 저장합니다.
둘째 명령은 그 파일을 읽어 heading-core.lpxbc를 저장합니다.
저장할 경로에는 기존 파일이 없어야 합니다. 같은 이름의 파일이 있으면 종료값 3을 반환합니다.
Core IR 가이드를 이미 따라 했다면 기존 .lpxir를 사용해 둘째 명령만 실행하세요.
첫 보고서에는 core_ir_build: "lispex.core-ir-build/v1"이 표시됩니다.
둘째 보고서에는 bytecode_build: "lispex.bytecode-build/v1"이 표시됩니다.
이 보고서는 저장한 파일의 정보를 담습니다.
검사하고 검증하기
lispex bytecode inspect --bytecode heading-core.lpxbc
lispex bytecode validate --bytecode heading-core.lpxbc두 명령의 종료값은 0입니다.
inspect가 출력하는 JSON 보고서에는 다음 값이 들어갑니다.
| 보고서 필드 | 이 예제의 값 |
|---|---|
artifact.schema | lispex.bytecode/v1 |
artifact.counts.instructions | 22 |
artifact.counts.roots | 2 |
requirements | ["explicit-input"] |
source_map_coverage.complete | true |
execution | not-run |
보고서에는 소스와 Core IR과 바이트코드의 식별자, 종류별 명령 수, 소스 위치도 있습니다.
명령 22개 모두에 소스 위치가 연결되어 있습니다.
validate는 bytecode_validation: "lispex.bytecode-validation/v1"과 valid: true가 담긴 보고서를 출력합니다.
입력을 전달해 실행하기
lispex bytecode run --bytecode heading-core.lpxbc --input request.lspx다음-쪽으로명령의 종료값은 0입니다.
남은 1줄은 2줄보다 적으므로 결과는 다음-쪽으로입니다.
네이티브는 VM 상태를 만들거나 입력을 사용하기 전에 바이트코드 파일 전체를 검증합니다.
| 파일이나 출력 | 사용하는 쪽 |
|---|---|
heading-core.lpxir | 바이트코드 컴파일러 |
heading-core.lpxbc | VM |
request.lspx | 데이터 하나를 읽는 입력 도구 |
| 검사와 검증 JSON | 사람과 자동화 도구 |
stdout의 다음-쪽으로 | 프로그램 결과를 받는 호출자 |
이 예제에서 --input을 생략하면 값이 없는 변수 input에 대해 E300을 내고 종료값 1을 반환합니다.
입력을 요구하지 않는 바이트코드에 입력을 전달하면 종료값은 2입니다.
바이트코드 참조에서 검증 규칙과 한도를 설명합니다.
표준입력 하나에는 바이트코드나 입력값 중 하나를 담을 수 있습니다. 다음 명령은 종료값 2를 반환하며 stderr에 아래 진단을 출력합니다.
lispex bytecode run --bytecode - --input -lispex bytecode run: bytecode and input cannot both read stdin둘 중 하나는 이름 있는 파일로 전달하세요.
소스에서 바로 실행하기
소스 실행과 엔진 비교를 위해 다음 전체 프로그램을 rule.lspx로 저장하세요.
프로그램 안에서 1를 전달하고 display와 newline으로 결정을 출력합니다.
(define (제목-위치 남은-줄)
(if (< 남은-줄 2) '다음-쪽으로 '그대로))
(display (제목-위치 1))
(newline)lispex run --backend rust --engine vm rule.lspx
lispex run --backend rust --engine tree rule.lspx각 명령은 다음-쪽으로와 줄바꿈을 출력하고 종료값 0을 반환합니다.
리스펙스의 기본 엔진은 tree입니다.
vm은 메모리에서 프로그램을 컴파일하고 검증한 뒤 실행합니다.
vm을 명시하면 컴파일과 검증, 자원과 실행 오류를 그 엔진의 결과로 반환합니다.
tree로 다시 실행하지 않습니다.
--engine 옵션은 --backend rust와 함께만 쓸 수 있습니다.
외부 백엔드 목록과 함께 쓰면 사용법 오류이며 종료값은 2입니다. 현재 실행 방식은 실행 엔진 참조에서 확인하세요.
엔진 비교 보고서 읽기
lispex compare-engines --receipt tree-vm.json rule.lspx네이티브는 tree-vm.json을 만들고 다음 요약을 출력하며 종료값 0을 반환합니다.
{
"all_agree": true,
"receipt": "tree-vm.json",
"schema": "lispex.compare-engines-summary/v1",
"semantic_mismatch_axes": []
}두 엔진 모두 stdout에 다음-쪽으로\n을 기록하고 정상 종료합니다.
all_agree: true는 비교한 의미 결과가 일치한다는 뜻입니다.
semantic_mismatch_axes 배열이 비어 있으므로 보고된 차이는 없습니다.
tree-vm.json에서 observations.tree, observations.vm, semantic_mismatch_axes를 읽으세요.
보고서에는 소스와 Core IR과 바이트코드의 식별자, VM 자원 측정값, 대체 실행 횟수도 있습니다.
네이티브는 새 경로에 보고서 전체를 한 번에 저장합니다.
tree-vm.json이 이미 있으면 그 파일을 바꾸지 않고 종료값 3을 반환합니다.
이 JSON은 비교 보고서입니다. VM에는 .lpxbc 파일을 전달하세요.
리스펙스 바우치로 이어가기
바이트코드 참조에서 검증기 검사와 리스펙스 VM 비교를 설명합니다.
리스펙스 바우치는 컴파일 묶음을 만들 때 csk.checked-profile/v1에 맞는 소스를 받습니다.
위 제목 위치 소스는 이 프로파일에 맞지 않으므로 vouch compiled build가 종료값 1로 거부합니다.
참조의 별도 바우치 예제에서 알맞은 소스와 묶음을 준비하세요.