본문으로 건너뛰기
토파즈문서
다운로드

문서 검색

프로젝트와 매뉴얼

방향키로 결과를 고르고 Enter를 눌러 여세요.

API 이름, 진단 번호, 규칙 또는 프로젝트 주제를 입력하세요.

    로드맵

    이 페이지에는 5.21.0부터 5.21.3까지 출시한 판과 다음 공개 판 6.0.0의 계획이 있습니다. 각 릴리스가 내 프로젝트에 무엇을 바꾸는지 확인하세요. 출시한 변경의 전체 내용은 히스토리에서 볼 수 있습니다.

    버전상태담기는 것
    5.21.0출시 완료topaz-5.21 언어 모드, std.typeset과 Length 리터럴, 리스펙스 1.21 내장
    5.21.1출시 완료타입 추론, 호출, 진단, 런타임 경계 수리
    5.21.2출시 완료매일 쓰는 명령의 속도 개선과 서명한 빌드 기록
    5.21.3현재 버전npm 설치기의 서명 확인, 서명한 공개 소스, 빌드 경로가 없는 릴리스 파일
    6.0.0출시 예정새 타입 기반 컴파일러 엔진, 명세 주도 언어 변경, 공개 소스로 누구나 다시 만들 수 있는 공식 실행 파일, 같은 조건으로 비교하는 벤치마크, 컴파일러 재생성 방법과 이전 도구
    장기 이니셔티브시기 미정지역 레코드와 컬렉션의 가벼운 저장 방식

    출시한 5.21.0부터 5.21.3까지는 topaz-5.21 언어 모드를 씁니다. 다음 공개 판 6.0.0은 새 컴파일러 엔진과 명세 주도 언어 변경을 함께 담고 topaz-6.0 언어 모드를 시작합니다. 이전 안내와 도구로 기존 프로그램을 6.0.0으로 옮길 수 있습니다.

    5.21.0

    5.21.0을 출시했습니다. topaz-5.21 언어 모드가 이 판에서 시작했습니다. 전역 함수, 정적 네임스페이스, 생성자, 표준 모듈을 값의 메서드와 std 모듈로 옮겼고, 바꿔 쓸 호출은 5.21로 옮기기에 모두 있습니다. Length 리터럴과 std.typeset, 자릿수 구분을 쓸 수 있는 16진수와 2진수 정수, 정수 비트 연산도 더했고 리스펙스 1.21을 내장했습니다. 전체 내용은 히스토리에 있습니다.

    5.21.1

    5.21.1을 출시했습니다. 제네릭 콜백과 괄호로 감싼 호출의 타입 추론을 고치고, 진단이 올바른 모듈과 값을 가리키게 하고, 네이티브와 웹 빌드, NaN이 섞인 정렬이나 잘못된 날짜 같은 런타임 경계를 고친 호환 패치입니다. 전체 내용은 히스토리에 있습니다.

    5.21.2

    5.21.2를 출시했습니다. 결과는 히스토리에 있습니다. 5.21.2는 매일 쓰는 명령이 같은 일을 반복하지 않게 하는 호환 패치입니다. 각 실행 파일을 만든 빌드와 이어 주는 서명 기록도 함께 공개합니다.

    타입과 import 조회 재사용

    컴파일러는 모듈, 스코프, 이름마다 선언 후보 목록을 한 번 만들고 모든 조회에서 다시 씁니다. 타입 참조가 많은 프로그램도 참조할 때마다 프로그램 전체를 뒤지지 않습니다. 5.21.2 출시 결과

    비공개 선언, 가리기, 명목 타입의 정체성, import 순환은 지금처럼 동작합니다. 어느 모듈이든 바뀌면 목록을 다시 만듭니다.

    문자열의 일반 글자를 한 번에 읽기

    컴파일러는 데이터 표를 담은 긴 문자열 리터럴을 글자 하나씩이 아니라 일반 글자 구간 단위로 읽습니다. 리터럴 안의 이스케이프, 보간, 오류 위치는 그대로입니다. 5.21.2 출시 결과

    검사한 프로그램을 바로 실행

    topaz run은 컴파일러가 방금 검사한 프로그램을 바로 실행합니다. 검사한 프로그램을 다른 형태로 바꿨다가 다시 읽는 단계가 사라집니다. 출력, 종료 코드, 실행 오류, 단계 한도와 취소는 그대로입니다. 5.21.2 출시 결과

    이전 계획에서 바뀐 점

    구현 전에 측정한 결과로 범위를 조정했습니다. 이전 항목의 링크는 여기서 그대로 이어집니다.

    구문 참조 캐시는 6.0.0으로 옮깁니다. 6.0.0의 타입 기반 질의가 각 사용 위치를 선언과 잇기 때문에 지금 따로 캐시를 만들면 다음 릴리스에서 바로 대체됩니다.

    컴파일러 임시 배열 줄이기는 넣지 않습니다. 컴파일 시간에서 차지하는 몫이 거의 없었고, 6.0.0의 타입 기반 프로그램 모델은 피연산자를 바로 읽습니다.

    시드 JSON 변환 줄이기는 넣지 않습니다. 시드에서 컴파일러를 다시 만드는 시간에서 JSON 변환은 아주 작은 부분이었습니다.

    생성 Rust 식 단순화는 넣지 않습니다. 식을 단계로 나눠도 Rust 컴파일 시간과 메모리가 줄지 않았습니다.

    검토하던 네 가지 개선은 측정에서 비용이 드러나지 않아 넣지 않습니다. 생성 코드의 비동기 비용은 6.0.0의 직접 호출이 다룹니다.

    릴리스 확인

    5.21.2는 내려받은 릴리스를 확인하는 방법도 바꿉니다. 프로그램의 실행 결과에는 영향이 없습니다.

    실행 파일과 빌드 연결

    내려받는 실행 파일마다 서명한 연결 기록을 함께 게시합니다. 이 기록은 실행 파일을 소스 수정본, 생성 컴파일러, 그 파일을 만든 빌드 환경과 검사 기록에 묶습니다. 5.21.2 출시 결과

    연결 기록은 어떤 소스와 빌드가 실행 파일을 만들었는지 프로젝트가 서명해 남긴 기록입니다. 서명한 체크섬 목록에 들어 있어서 설치 페이지의 Ed25519 서명 확인이 이 기록까지 확인합니다. studiohaze/topaz의 공개 검증 워크플로는 각 기록을 그 기록이 가리키는 실행 파일과 대조하고, 기록에 적힌 공개 커밋과 compiler.rs가 공개 저장소와 같은지도 확인합니다. 워크플로는 릴리스 증명 확인 (외부 링크)에 설명되어 있습니다.

    최신 버전 표시는 서명과 게시한 모든 파일을 공개 주소에서 다시 읽어 확인한 뒤 5.21.2로 바뀌었습니다. 이전 릴리스의 파일은 그대로이며 새 기록을 추가하지 않습니다.

    표준 모듈 원본 일치

    공개 소스와 Topaz Core Kit은 공식 CLI와 같은 파일에서 표준 모듈 std.bytes, std.fs, std.io, std.json, std.toml을 가져옵니다. 프로그램의 실행 결과는 지금도 같습니다. 표준 모듈 안을 가리키는 진단도 모든 배포본에서 같은 위치를 알려 줍니다. 5.21.2 출시 결과

    5.21.1 시드에서 컴파일러 다시 만들기

    5.21.2 재생성 방법 (외부 링크)은 5.21.1 공개 시드와 5.21.2 소스에서 시작합니다. 명령, 기대 컴파일러 해시, 측정한 메모리와 실행 시간을 제공합니다. 히스토리에서 공개 결과를 확인할 수 있습니다.

    5.21.3

    5.21.3을 출시했습니다. 설치와 릴리스 파일을 확인하는 방법을 개선했습니다. 언어와 컴파일러는 5.21.2와 같으므로 프로그램은 지금과 똑같이 빌드되고 실행됩니다.

    npm 설치기의 서명 확인

    npx topaz-lang과 npm install topaz-lang은 무엇이든 설치하기 전에 릴리스 체크섬 목록의 Ed25519 서명을 확인합니다. 설치 페이지에서 설명하는 것과 같은 확인입니다. 그다음 압축 파일과 실행 파일을 서명한 목록과 대조합니다. 서명이 없거나 틀리면 설치를 멈추고 이유를 알려 줍니다. 5.21.3 출시 결과

    npm에서 소스와 이슈로

    npm 패키지에 공개 저장소 studiohaze/topaz를 연결합니다. 여기서 소스를 읽고 이슈를 남길 수 있습니다. 5.21.3 출시 결과

    서명한 공개 소스

    릴리스마다 공개 저장소에 더하는 커밋과 태그에 서명하고, GitHub에서 확인된 서명으로 표시됩니다. 5.21.3 출시 결과

    빌드 경로가 없는 릴리스 파일

    실행 파일, 플레이그라운드의 WebAssembly 런타임과 다른 릴리스 파일에 빌드한 컴퓨터의 폴더 경로가 남지 않습니다. 게시하기 전에 모든 파일에 그런 경로가 없는지 검사합니다. 5.21.3 출시 결과

    릴리스 CLI로 확인한 예제

    릴리스를 내기 전에 README와 문서에 있는 토파즈 예제를 모두 그 릴리스의 CLI로 실행하고, 출력이 페이지와 같아야 합니다. 5.21.3 출시 결과

    6.0.0 계획

    6.0.0은 토파즈의 다음 공개 판입니다. 새 컴파일러 엔진과 명세 주도 언어 변경을 함께 담습니다. 공개 소스로 누구나 다시 만들 수 있는 공식 실행 파일, 컴파일러 재생성 방법, 벤치마크와 이전 도구를 제공합니다.

    명세를 먼저 쓰는 첫 토파즈 릴리스이며, 새 언어 레퍼런스의 모든 규칙에는 출시 전에 그 릴리스에서 실행되는 예제가 있습니다.

    두 원칙이 무엇을 바꿀지 정합니다. 토파즈는 말하는 방법이 하나이고, 조판을 내장한 범용 언어입니다.

    새 컴파일러 엔진

    토파즈로 작성한 컴파일러는 타입 정보를 담은 데이터로 일하고, 타입이 정해진 값에는 그 타입에 맞는 Rust 표현을 쓰고, 함수를 직접 호출합니다.

    누구나 다시 만들 수 있는 공식 실행 파일

    6.0.0의 공식 topaz 실행 파일은 Core Kit 기반에 애드온을 더한 구성이 됩니다. 누구나 공개된 입력과 빌드 안내에 따라 공개 소스에서 기반 실행 파일을 다시 만들 수 있습니다. 이를 공식 릴리스의 기반 실행 파일과 바이트 단위로 대조할 수 있습니다.

    • 기반. 컴파일러, CLI 명령, 언어 서버, MCP 서버를 공개 소스로 만듭니다. 누구나 공식 기반 실행 파일을 다시 빌드해 모든 릴리스 대상에서 같은 바이트를 얻을 수 있습니다. 서명은 여전히 우리가 낸 릴리스임을 보여 주고, 그 안에 든 것은 직접 확인할 수 있습니다.
    • 리스펙스. 리스펙스는 공개된 호스트 안에서 별도의 WebAssembly 모듈로 실행됩니다. 호스트, 토파즈와 리스펙스 사이의 인터페이스, 자원 한도를 공개하며, 모듈은 호스트가 넘겨준 것만 쓸 수 있습니다. std.lispex는 이 모듈을 쓰고, 권장 다운로드와 npm 패키지에는 리스펙스가 함께 들어 있습니다.
    • 참조 컴파일러. 비교에 쓰는 참조 컴파일러는 공식 실행 파일에서 빠져 따로 설치하는 애드온이 됩니다. 기본 컴파일러는 계속 토파즈로 작성한 컴파일러 하나입니다.

    Core Kit CLI 명령은 토파즈로 작성합니다. Rust는 실행 파일이 운영체제, WebAssembly 호스트, 암호 연산과 만나는 곳에만 남습니다. 기반과 애드온은 6.0.0에서 정한 명령, 플래그, 출력, 종료 코드와 진단을 따릅니다.

    타입 기반 프로그램 모델과 질의

    컴파일러는 프로그램을 숫자 ID가 붙은 타입 데이터로 저장하고 이름, 서명, 타입에 대한 물음에 캐시한 질의로 답합니다. 답마다 무엇을 읽었는지 기록하므로 코드를 고치면 그 코드에 기대는 답만 다시 계산합니다. 찾았는데 없던 이름도 기록하므로 새 선언을 더하면 그 선언이 필요했던 곳이 모두 갱신됩니다.

    릴리스를 빌드할 때 표준 모듈을 한 번 검사하고 그 결과를 컴파일러와 함께 냅니다. 그래서 std.typeset을 가져오는 프로그램도 명령을 실행할 때마다 표준 모듈 전체를 다시 검사하지 않고 자기 코드만 검사합니다.

    도구는 6.0.0에서 정한 형식으로 컴파일러의 JSON 출력을 받습니다.

    레코드, 문자열, newtype을 Rust 타입으로

    필드가 모두 정해진 레코드 타입은 Rust 구조체가 되고 필드 읽기는 직접 접근이 됩니다. 선택 필드가 있는 레코드도 필드가 없는 경우와 None을 넣은 경우를 구분합니다. 레코드를 갱신해도 이전 값은 그대로입니다.

    문자열은 컴파일한 코드와 런타임 사이를 변환 없이 오갑니다. newtype은 별개의 타입으로 남으면서 감싼 타입의 표현을 그대로 씁니다. 문자열 리터럴에 대한 match는 같은 순서의 직접 비교로 컴파일됩니다. 문자, 바이트, 유니코드 동작은 그대로입니다.

    열거형, Option, Result를 Rust 열거형으로

    타입이 모두 정해진 열거형, Option, Result는 Rust 열거형이 됩니다. 가드 없이 모든 경우를 다루는 match는 Rust match로 컴파일됩니다.

    직접 호출

    컴파일러는 어떤 함수가 멈출 수 있는지 기록합니다. 동시 실행 코드를 돌리거나, 호스트를 기다리거나, 취소 지점에 닿는 함수가 그렇습니다. 멈출 일이 없는 함수를 알려진 대상으로 부르면 평범한 Rust 호출이 되고 힙 할당이 사라집니다.

    단계 한도, 시간 한도, 취소, 재귀 한도와 defer는 그대로 동작합니다. 대상을 모르는 함수 값을 통한 호출은 지금 경로를 그대로 씁니다.

    편집기의 증분 검사

    언어 서버는 편집 사이에 질의 결과를 보존합니다. 함수 본문을 고치면 그 본문과 그 결과를 읽는 코드만 다시 검사하고 관계없는 모듈은 건드리지 않습니다. 진단은 각 파일의 최신 내용에 대해서만 보입니다.

    공개 소스에서 컴파일러 다시 만들기

    6.0.0은 공개 소스와 공개된 입력으로 컴파일러를 다시 만드는 방법을 제공합니다. 재생성 사슬은 6.0.0에서 새로 시작합니다. 이 방법으로 compiler.rs와 컴파일러에 함께 넣는 표준 모듈 검사 결과를 다시 만듭니다. 누구나 공개된 파일과 바이트 단위로 대조할 수 있습니다. 명령, 입력, 빌드 조건, 메모리 사용량과 실행 시간을 적습니다.

    빌드 캐시

    topaz build는 매번 빈 폴더에서 시작하지 않고 빌드 사이에 컴파일한 의존성과 바뀌지 않은 작업을 보존합니다. 캐시는 도구체인, 대상, 빌드 프로필, 런타임, 입력을 키로 쓰므로 그중 하나라도 바뀌면 이전 결과를 다시 쓰지 않습니다.

    말하는 방법은 하나

    같은 일을 두 가지로 쓸 수 있으면 6.0.0은 하나만 남깁니다. 줄바꿈 종류, 대소문자, 괄호가 더는 프로그램의 뜻을 바꾸지 않습니다. 예를 들어 defer는 블록을 요구하고, 람다는 매개변수를 늘 괄호로 감싸고, 진법 접두사와 16진 숫자는 소문자로 쓰고, else 없는 if의 값은 늘 unit이고, JSON을 출력하는 모든 명령은 --format json을 받습니다.

    확인할 수 있는 명세

    새 레퍼런스의 각 규칙은 언어에 그 규칙이 있는 이유를 적고, 그 릴리스에서 실행되는 예제에 연결됩니다. 컴파일러가 아직 따르지 않는 동작은 따를 때까지 알려진 제약으로 표시합니다. 지금의 레퍼런스는 5.21을 위해 그대로 남습니다.

    6.0 이후의 문서

    6.0 매뉴얼은 /v6.0에 둡니다. 6.0.x 패치는 같은 주소를 쓰고, 이후의 6.1은 자기 주소를 갖습니다. 토파즈 5 매뉴얼은 5.21.3 기준으로 남고, 상단에 이전 버전이라는 안내를 표시하며, 옛 5.x 링크는 이 판으로 이어집니다. 클래식은 앞선 이정표의 스냅숏인 토파즈 5.6 매뉴얼이 되고 같은 안내를 표시합니다. 히스토리에서 두 판으로 갈 수 있습니다.

    6.0으로 옮기기

    6.0.0은 topaz-6.0 언어 모드를 시작합니다. 이전 안내에 모든 변경을 적고, 이전 도구가 없어지는 형태를 남는 형태로 한 번에 바꿉니다. 없어지는 형태를 경고 기간과 함께 남겨 두지 않습니다.

    우리가 토파즈로 만드는 모든 제품도 이 릴리스에서 토파즈 6으로 옮깁니다.

    공개 벤치마크

    6.0.0은 같은 프로그램, 같은 조건으로 돌린 TypeScript, Python, Rust와 벤치마크 결과를 나란히 공개합니다. 시작 시간, 실행 시간, 메모리 사용량, 코드 줄 수를 다루고, 깨끗한 첫 빌드와 파일 하나를 고친 뒤의 다시 빌드는 따로 잽니다.

    프로그램, 측정 스크립트, 측정 방법은 6.0.0 전에 공개 저장소에 올립니다. 누구나 방법을 미리 검토하고 측정을 다시 할 수 있습니다. 측정하는 토파즈 실행 파일은 공식 6.0.0 릴리스이며, 누구나 공개된 입력과 빌드 안내에 따라 공개 소스로 다시 만들 수 있습니다.

    출시 조건

    6.0.0은 새 엔진을 완성하고 모든 엔진 변경이 지키는 것을 지킬 때 출시합니다. 공식 기반 실행 파일과 컴파일러를 공개 소스로 다시 만들 수 있어야 합니다. 남은 언어 결정을 정리하고 새 레퍼런스의 모든 예제가 그 컴파일러에서 통과해야 합니다. 이전 도구가 기존 프로그램을 바꿀 수 있고 벤치마크 결과가 공개되어야 합니다. 증분 검사와 빌드 캐시도 이 계획에 포함하며 각각 준비된 첫 릴리스에 들어갑니다.

    모든 엔진 변경이 지키는 것

    언어 명세(SPEC)는 값, 평가 순서, 오류를 정의하고 값의 저장 방식은 구현에 맡깁니다. 엔진 변경은 각 언어 모드의 이 규칙들을 지키면서 저장 방식과 호출을 바꿉니다.

    • 같은 입력은 같은 Rust를 만들고, 토파즈로 작성한 컴파일러는 저장소에 든 생성 Rust를 소스에서 바이트 단위로 똑같이 다시 만듭니다.
    • 평가 순서, 출력, 실행 오류, 진단은 바뀌지 않습니다.
    • 프로그램은 바로 실행할 때, 네이티브 실행 파일로 빌드할 때, 웹용으로 빌드할 때 똑같이 동작합니다.
    • 토파즈는 포인터 연산, 수명 매개변수, 인라인 어셈블리, JIT 컴파일러를 더하지 않으며 수동 메모리 관리도 필요 없습니다.
    • 릴리스 빌드는 계속 생성 Rust를 거쳐 미리 컴파일합니다. 입출력은 표준 모듈 호출로 드러나고 기존 릴리스 대상과의 호환성을 지킵니다.

    장기 아키텍처 이니셔티브

    6.0.0 이후 여러 릴리스에 걸쳐 진행하는 계획이며 특정 버전 번호에 묶지 않습니다.

    지역 레코드와 컬렉션의 가벼운 저장 방식

    제로 오버헤드 캐노니컬 로워링(ZOCLE)은 토파즈가 생성하는 Rust에서 런타임 오버헤드를 걷어 냅니다. 6.0.0이 타입별 레코드, 열거형, 직접 호출로 그 첫 부분을 담습니다. 아래 단계는 같은 타입 기반 프로그램 모델 위에서 이 순서로 이어집니다. 각 단계는 빌드 시간, 메모리, 산출물 크기를 늘리지 않고 측정으로 이득이 확인될 때만 넣습니다.

    1. 지역 레코드. 반환하거나 저장하거나 캡처하지 않는 레코드는 Rust 구조체나 따로 떨어진 지역 값이 됩니다. 그러면 힙 할당과 참조 횟수가 필요 없습니다.
    2. 타입별 배열과 맵. 요소 타입이 정해진 배열과 맵은 공용 런타임 값 대신 타입에 맞는 Rust 저장소를 씁니다.
    3. 루프 융합. filter, map 같은 컬렉션 메서드 체인과 컴프리헨션을 중간 배열 없이 루프 하나로 실행합니다. 콜백이 입출력을 하지 않고 let mut 상태를 바꾸지 않는 경우처럼 결과, 출력, 실행 오류가 같을 때만 합칩니다.
    4. 저장 공간 재사용. User { ...before, status: Status.Paused("review") } 같은 레코드 갱신이나 새 배열을 돌려주는 컬렉션 메서드는 다른 코드가 원본을 참조하지 않으면 원본의 저장 공간을 다시 씁니다. 나머지 코드는 그 차이를 볼 수 없습니다.
    5. 벡터화. int와 float 배열을 연속된 Rust 벡터로 저장하고 그 배열을 도는 루프를 rustc와 LLVM이 벡터화할 수 있는 형태로 생성합니다. 벡터 명령은 CPU와 WebAssembly 기능에 따라 다르므로 대상마다 따로 측정합니다.

    계획에서 출시 결과까지

    이 페이지의 버전과 개선 항목에는 고정 링크가 있습니다. 버전을 출시하면 히스토리의 해당 항목에서 이 계획으로 연결하고, 포함된 개선 항목은 실제 출시 결과로 연결합니다.

    개선 항목이 옮겨 가거나 범위가 바뀌면 이 페이지에 이유와 옮겨 간 곳을 적습니다. 히스토리에는 실제 출시한 변경을 기록합니다.

    이 페이지는 지금 계열과 다음 공개 판을 다룹니다. 새 계열을 출시하면 그 첫 릴리스부터 다시 시작합니다. 이전 계열은 히스토리에 남습니다.

    메뉴

    다운로드