Topazdocs
개요

토파즈 소개

토파즈는 애플리케이션 의도를 위한 작고 닫힌 언어입니다. 말하는 방법을 하나로 줄이고, 사람과 에이전트가 함께 쓰며, 툴체인이 검사합니다.

토파즈는 애플리케이션 의도를 쓰기 위한 작고 닫힌 언어입니다. Python이나 TypeScript처럼 읽히지만 표면은 훨씬 좁습니다. 자주 쓰는 의도에는 하나의 정식 표현만 두고, 사람과 에이전트가 같은 표면을 쓰며, 툴체인이 그것을 검사합니다.

기계를 직접 다뤄야 한다면 Rust가 맞습니다. 토파즈는 그보다 한 층 위에 있습니다. CLI 작업, 데이터 변환, 백엔드 글루 코드, 설정 기반 로직, SQL과 셸과 경로를 엮는 코드처럼 중요한 것이 세밀한 레버가 아니라 의도 자체인 곳을 겨냥합니다. 그 의도를 툴체인이 실행하고 검사하고, 필요하면 자기완결 네이티브 바이너리로 낮춥니다.

이 페이지에서 출력을 보여주는 모든 프로그램은 사이트 검증기가 실제 툴체인으로 실행합니다. 출력 블록은 캡처된 결과와 바이트 단위로 같아야 하고, 나머지 펜스는 파스 검증을 거칩니다.

Lena Code 연동. 토파즈는 Lena Code와 함께 STUDIO HAZE 제품군을 이루는 자매 제품입니다. 두 제품은 서로 맞물려 동작하도록 설계되어 있어서 Lena Code 변환 워크플로에서 토파즈를 입력 언어로도 출력 언어로도 쓸 수 있습니다. 토파즈로 작성한 코드는 Lena Code 파이프라인을 자연스럽게 오갑니다. 토파즈 자체는 작고 닫힌 유니코드 우선 언어이고, 사람과 AI 에이전트가 같은 방식으로 쓰며, 지원되는 표면은 run과 build 경로의 차분 검증으로 확인합니다.

첫 번째 증명, Unicode-first

식별자는 렉서부터 Unicode입니다. 도메인 단어를 로마자로 흉내 내지 않고 그대로 코드에 둡니다.

TOPAZ
function greet(name: string, language: string) -> string {
    return match language {
        case "한국어" => "안녕하세요, {name}님!"
        case "Русский" => "Привет, {name}!"
        case _ => "Hello, {name}!"
    }
}

let 사용자 = "김토파즈"
print(greet(사용자, "한국어"))
print(greet("Topaz", "Русский"))
OUTPUT
안녕하세요, 김토파즈님!
Привет, Topaz!

사용자는 평범한 변수입니다. Unicode 정체성은 예외적으로 허용되는 기능이 아닙니다. 식별자는 작성한 스칼라 시퀀스 그대로이고 조용한 정규화는 없습니다(§1). 모듈 리졸버는 파일 사이에서 닮은꼴 모듈 이름도 거부합니다(§17).

알아둘 네 가지

작고 닫힌 표면

의도마다 쓰는 방법은 하나입니다. 복구 가능한 실패는 Result, 부재는 옵셔널, 정리는 defer, match는 빠짐없이 다루는 것을 기본으로 삼습니다. 이런 정책을 언어가 정하므로 파일마다 방언을 새로 만들지 않아도 됩니다.

TOPAZ
function parsePort(raw: string) -> Result<int, string> {
    let n = toInt(raw) ?? -1
    if n < 1 {
        return Err("not a port: {raw}")
    }
    return Ok(n)
}

function startup(raw: string) -> Result<string, string> {
    defer print("config closed")
    let port = parsePort(raw)?
    return Ok("listening on {port}")
}

print("{startup("8080")}")
print("{startup("http")}")
OUTPUT
config closed
Ok(listening on 8080)
config closed
Err(not a port: http)

? 연산자는 Err를 전파하고, defer는 어떤 종료 경로에서도 실행됩니다. 그래서 위 출력에 config closed가 두 번 나옵니다.

제약으로 만드는 에이전트 친화성

토파즈는 생성 코드 시대를 염두에 둔 언어입니다. 다만 에이전트가 조심하기를 기대하지 않습니다. 명세는 작고, 금지된 형태는 이름이 붙어 있으며, 정식 프로파일은 기계로 검사할 수 있고, 이 사이트의 예제도 실제로 검증됩니다. 에이전트에게 맡길 수 있는 언어는 표현을 무한히 늘리는 언어가 아니라 실패할 구멍을 줄이는 언어입니다.

의도를 구조로 보존하는 템플릿

sql, sh, path 문자열은 템플릿입니다. 문자열 하나로 뭉개지지 않고 파트와 보간을 따로 보존하는 구조화된 값입니다.

TOPAZ
let table = "users"
let q = sql"select * from {table} where active = {true}"
print("{q}")
OUTPUT
<sql template, 3 part(s), 2 interpolation(s)>

이 플레이스홀더 출력이 오늘의 정직한 상태입니다. 템플릿 값은 존재하고 아무것도 이어붙이지 않았지만, 도메인별 렌더링 정책은 아직 명세되지 않았습니다.

정적 검사, 실행, 검증된 백엔드

토파즈는 명세상 정적 타입 언어입니다. 배포된 체커는 프로그램이 실행되기 전에 컴파일 유닛 전체를 타이핑합니다.

TOPAZ
type TrafficLight = "red" | "yellow" | "green"

function next(light: TrafficLight) -> TrafficLight {
    return match light {
        case "red" => "green"
        case "green" => "yellow"
        case _ => "red"
    }
}

인터프리터가 기준입니다. topaz run은 파싱, 리졸브, 타입 체크를 거쳐 툴체인이 맞다고 보는 답을 계산합니다. 같은 소스에서 topaz emittopaz build는 프로그램을 두 개의 검증된 백엔드 경로로 낮춥니다. Rust 백엔드는 독립 실행형 네이티브 바이너리를 만듭니다. Python 백엔드는 서버·데이터·운영 작업을 위해 program.py와 런타임 topaz_py_rt.py를 만듭니다.

두 백엔드 모두 의도로 신뢰하지 않습니다. 각 백엔드는 측정된 표면에서 인터프리터와 비교되고, 릴리스 증거는 인터프리터와 Rust와 Python이 어디에서 일치하는지 기록합니다. 타입 기반 런타임 가드도 두 경로에 그대로 이어지므로, 컴파일된 프로그램은 플레이그라운드와 인터프리터에서 본 동작을 그대로 유지합니다.

SH
topaz build app.tpz --target python --out-dir py-out

정확한 게이트와 각 백엔드를 뒷받침하는 측정 표면 증거는 상태 페이지가 추적합니다.

토파즈가 맞지 않는 경우

ownership과 lifetime을 직접 제어해야 하거나, unsafe 경계와 임베디드 타깃을 다루거나, 성능 병목을 손으로 깎아야 하거나, 시스템 생태계의 모든 레버가 필요하다면 Rust, C, Zig가 더 맞습니다. 토파즈의 좁은 길은 그런 작업에서는 실제 비용입니다.

토파즈는 반대편 작업을 위한 언어입니다. 시스템 레벨 소스 표면 없이 배포 가능한 애플리케이션 로직, 도메인 언어가 그대로 남는 코드, 사람과 에이전트가 일관되게 만들어 낼 수 있는 작은 문법을 원할 때 맞습니다.

여기서 시작하세요

  • 시작하기 설치하고 첫 프로그램 실행하기
  • 철학 토파즈가 코드를 실행 가능한 명세로 보는 이유
  • 문법 언어 표면 살펴보기
  • 모듈과 가시성 여러 파일로 이루어진 유닛
  • 툴체인 상태 오늘 무엇이 돌고 무엇이 그것을 증명하는가

말하는 방법은 하나.