검증된 바이트코드 실행하기

완전한 제목 위치 규칙을 Core IR과 바이트코드로 컴파일합니다. 입력을 전달해 실행하고 엔진 비교 보고서를 읽습니다.

이 실습에는 네이티브 CLI를 사용합니다. 리스펙스 VM은 컴파일·검증된 리스펙스 바이트코드를 실행합니다. 아래에서 사용하는 중간 파일은 Core IR 가이드에서 설명합니다.

소스와 입력 준비하기

규칙 전체를 heading-core.lspx로 저장하세요.

LISPEX
(define (제목-위치 남은-줄)
  (if (< 남은-줄 2) '다음-쪽으로 '그대로))

(제목-위치 input)

입력값은 request.lspx로 저장하세요.

LISPEX
1

명령이 이 값을 input에 전달합니다. Core IR과 바이트코드는 이 요구사항을 explicit-input으로 기록합니다.

파일 두 개 만들기

SH
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"이 표시됩니다. 이 보고서는 저장한 파일의 정보를 담습니다.

검사하고 검증하기

SH
lispex bytecode inspect --bytecode heading-core.lpxbc
lispex bytecode validate --bytecode heading-core.lpxbc

두 명령의 종료값은 0입니다. inspect가 출력하는 JSON 보고서에는 다음 값이 들어갑니다.

보고서 필드이 예제의 값
artifact.schemalispex.bytecode/v1
artifact.counts.instructions22
artifact.counts.roots2
requirements["explicit-input"]
source_map_coverage.completetrue
executionnot-run

보고서에는 소스와 Core IR과 바이트코드의 식별자, 종류별 명령 수, 소스 위치도 있습니다. 명령 22개 모두에 소스 위치가 연결되어 있습니다. validate는 bytecode_validation: "lispex.bytecode-validation/v1"과 valid: true가 담긴 보고서를 출력합니다.

입력을 전달해 실행하기

SH
lispex bytecode run --bytecode heading-core.lpxbc --input request.lspx
다음-쪽으로

명령의 종료값은 0입니다. 남은 1줄은 2줄보다 적으므로 결과는 다음-쪽으로입니다. 네이티브는 VM 상태를 만들거나 입력을 사용하기 전에 바이트코드 파일 전체를 검증합니다.

파일이나 출력사용하는 쪽
heading-core.lpxir바이트코드 컴파일러
heading-core.lpxbcVM
request.lspx데이터 하나를 읽는 입력 도구
검사와 검증 JSON사람과 자동화 도구
stdout의 다음-쪽으로프로그램 결과를 받는 호출자

이 예제에서 --input을 생략하면 값이 없는 변수 input에 대해 E300을 내고 종료값 1을 반환합니다. 입력을 요구하지 않는 바이트코드에 입력을 전달하면 종료값은 2입니다. 바이트코드 참조에서 검증 규칙과 한도를 설명합니다.

표준입력 하나에는 바이트코드나 입력값 중 하나를 담을 수 있습니다. 다음 명령은 종료값 2를 반환하며 stderr에 아래 진단을 출력합니다.

SH
lispex bytecode run --bytecode - --input -
lispex bytecode run: bytecode and input cannot both read stdin

둘 중 하나는 이름 있는 파일로 전달하세요.

소스에서 바로 실행하기

소스 실행과 엔진 비교를 위해 다음 전체 프로그램을 rule.lspx로 저장하세요. 프로그램 안에서 1를 전달하고 display와 newline으로 결정을 출력합니다.

LISPEX
(define (제목-위치 남은-줄)
  (if (< 남은-줄 2) '다음-쪽으로 '그대로))
(display (제목-위치 1))
(newline)
SH
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입니다. 현재 실행 방식은 실행 엔진 참조에서 확인하세요.

엔진 비교 보고서 읽기

SH
lispex compare-engines --receipt tree-vm.json rule.lspx

네이티브는 tree-vm.json을 만들고 다음 요약을 출력하며 종료값 0을 반환합니다.

JSON
{
  "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로 거부합니다. 참조의 별도 바우치 예제에서 알맞은 소스와 묶음을 준비하세요.