토파즈
토파즈는 스튜디오 헤이즈가 별도로 설계한 독립 프로그래밍 언어입니다. CSKernel™은 성능과 안전성이 요구되는 핵심 계층을 Rust로, 상위 제어 및 명세 표현 계층을 토파즈로 작성하는 이중 구조를 취합니다. 토파즈가 Rust와의 FFI 연동을 중심으로 설계된 덕분에 두 계층은 단일 시스템처럼 동작합니다.
설계 철학
토파즈의 핵심 가치와 언어 설계 원칙
Write Less, Express More
최소한의 코드로 최대한의 표현력을 달성합니다. 불필요한 보일러플레이트를 제거하고 개발자의 의도를 명확하게 표현할 수 있는 간결한 문법을 제공합니다.
"코드가 시가 되는 언어"
글로벌 문법, 로컬 표현
키워드는 영어로 통일하되, 식별자는 세계 모든 언어를 자유롭게 사용할 수 있습니다. 개발자는 자신의 모국어로 자연스럽게 코딩할 수 있습니다.
구현 정렬
이 페이지의 토파즈 예제는 CSKernel™의 제어 및 명세 계층에서 참조한 표현 규약을 보여줍니다.
표현 규약 샘플
설계·검증을 위한 문법 실험 예시입니다.
표현 규약
완벽한 다국어 식별자 지원
한글, 중국어, 일본어, 이모지까지 자유롭게 사용
똑똑한 타입 시스템
강력한 타입 추론과 리터럴 타입 지원
패턴 매칭의 예술
범위, 구조, 가드를 포함한 고급 패턴 매칭
파이프라인의 마법
데이터 변환이 시처럼 흐르는 파이프라인 연산자
에러 처리의 우아함
Result 타입과 ? 연산자를 통한 안전한 에러 처리
1// 다국어 식별자와 이모지 지원
2function 인사하기(이름: string, 언어: string = "한국어") -> string {
3 match 언어 {
4 case "한국어" => "안녕하세요, {이름}님!"
5 case "English" => "Hello, {이름}!"
6 case "Русский" => "Привет, {이름}!"
7 case _ => "안녕하세요, {이름}님!"
8 }
9}
10
11let 사용자수 = 1000
12let 🚀성장률 = 0.15
13
14// 강력한 패턴 매칭
15let 성적 = match 점수 {
16 case 95..100 => "A+"
17 case 90..<95 => "A"
18 case 80..<90 => "B"
19 case _ => "재수강"
20}
21
22// 파이프라인 연산자
23let 분석결과 = 원본데이터
24 |> 정규화(표준: "UTF-8")
25 |> 필터링(조건: 항목 => 항목.유효함)
26 |> 그룹화(기준: 항목 => 항목.카테고리)
27 |> 요약(형식: "brief")
28
29// 안전한 에러 처리
30function 안전한파일처리(경로: string) -> Result<Data, Error> {
31 let 파일 = 파일열기(경로)?
32 defer { 파일.닫기() }
33
34 let 내용 = 파일.읽기()?
35 let 데이터 = JSON.파싱(내용)?
36
37 return Ok(데이터)
38}고급 기능
현대적 개발 경험을 위한 혁신적 기능들
자동 비동기 처리
async/await 키워드 없이 모든 I/O 작업이 자동으로 비동기 처리됩니다. 동기 코드처럼 작성하면서도 비동기의 성능을 얻습니다.
1// I/O 워크플로를 단계적으로 조합
2function 사용자정보가져오기(id: int) -> Result<{ 기본정보: User, 프로필: Profile, 활동: Array<Activity> }, Error> {
3 let 사용자 = API.사용자조회(id)?
4 let 프로필 = API.프로필조회(사용자.프로필ID)?
5 let 활동 = API.활동내역조회(id)?
6
7 return Ok({
8 기본정보: 사용자,
9 프로필: 프로필,
10 활동: 활동
11 })
12}
13
14// 병렬 실행은 명시적으로
15let 대시보드데이터 = concurrent(timeout: 3s) {
16 날씨: 날씨API.현재("서울")
17 환율: 환율API.조회("USD/KRW")
18 뉴스: 뉴스API.헤드라인(5)
19} else {
20 {
21 날씨: None,
22 환율: None,
23 뉴스: []
24 }
25}표현식 지향 예시
if, match, for, try 등 모든 구문이 값을 반환하는 표현식입니다. 더 간결하고 함수형 스타일의 코드를 작성할 수 있습니다.
1// if, match, for 모든 구문이 값을 반환
2let 메시지 = if 시간 < 12 { "좋은 아침" }
3 else if 시간 < 18 { "좋은 오후" }
4 else { "좋은 저녁" }
5
6// for 루프도 값을 생성
7let 제곱수들 = for x in 1..5 { x ** 2 }
8let 짝수들 = for x in 0..10 by 2 { x }
9
10// match도 당연히
11let 가격 = match 회원등급 {
12 case "VIP" => 정가 * 0.7
13 case "일반" => 정가 * 0.9
14 case _ => 정가
15}진화된 문자열 템플릿
태그드 템플릿으로 SQL 인젝션, XSS 등의 보안 취약점을 자동으로 방지합니다. 타입 안전한 문자열 처리를 제공합니다.
1// 태그드 템플릿으로 안전한 처리
2let 쿼리 = sql`
3 SELECT * FROM users
4 WHERE age > ${나이}
5 AND city = ${도시}
6` // SQL 인젝션 자동 방지!
7
8let 웹페이지 = html`
9 <div class="card">
10 <h1>${제목}</h1>
11 <p>${내용}</p>
12 </div>
13` // XSS 자동 방지!
14
15// 다양한 문자열 리터럴
16let 경로 = p"/home/{사용자}/documents" // 경로 자동 검증
17let 정규식 = r"\d{3}-\d{4}-\d{4}" // 이스케이프 불필요
18let 명령어 = sh"ls -la | grep {패턴}" // 셸 명령어 안전 실행검증 패턴
설계·실험 단계에서 작은 검증 스니펫으로 동작과 실패 경로를 빠르게 확인합니다.
검증 원칙
- 핵심 규칙을 작은 assert 예제로 먼저 고정
- 성공 경로와 실패 경로를 모두 Result로 명시
- 예제는 canonical 문법만 사용하고 실험용 매크로는 섞지 않음
1// 작은 assert 예제로 핵심 규칙을 잠근다
2function 피보나치(n: int) -> int {
3 if n <= 1 { n }
4 else { 피보나치(n - 1) + 피보나치(n - 2) }
5}
6
7assert 피보나치(0) == 0
8assert 피보나치(1) == 1
9assert 피보나치(10) == 55
10
11function 이메일검증(이메일: string) -> bool {
12 return 정규식.매치(r"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$", 이메일)
13}
14
15let 검증결과 = [
16 이메일검증("user@example.com"),
17 이메일검증("invalid.email"),
18 이메일검증("")
19]
20
21assert 검증결과 == [true, false, false]
22
23function 안전한나누기(a: float, b: float) -> Result<float, string> {
24 if b == 0 {
25 return Err("0으로 나눌 수 없습니다")
26 }
27 return Ok(a / b)
28}
29
30assert 안전한나누기(10.0, 2.0) == Ok(5.0)
31assert 안전한나누기(10.0, 0.0) == Err("0으로 나눌 수 없습니다")타입 안전성
컴파일 타임에 더 많은 오류를 잡아내는 강력한 타입 시스템
리터럴 타입과 유니온 타입
구체적인 값을 타입으로 사용하고 여러 타입의 조합을 안전하게 처리할 수 있습니다.
1// 리터럴 타입 - 타입 안정성 극대화
2type 신호등 = "빨강" | "노랑" | "초록"
3type 주사위 = 1 | 2 | 3 | 4 | 5 | 6
4type Status = "대기" | "진행중" | "완료" | 404 | 500
5
6function 신호처리(색: 신호등) -> string {
7 match 색 {
8 case "빨강" => "정지"
9 case "노랑" => "주의"
10 case "초록" => "출발"
11 }
12}
13
14// 유니온 타입의 우아한 처리
15function 유연한처리(값: int | string | null) -> string {
16 match 값 {
17 case n: int => "숫자: {n}"
18 case s: string => "문자열: {s}"
19 case null => "값 없음"
20 }
21}스마트 타입 추론
명시적 타입 선언 없이도 컴파일러가 정확한 타입을 자동으로 추론합니다.
1// 강력한 타입 추론
2let 나이 = 25 // int로 자동 추론
3let 이름 = "김토파즈" // string으로 자동 추론
4let 복잡한구조 = { // 구조까지 추론
5 id: 1,
6 tags: ["web", "api"]
7} // { id: int, tags: Array<string> }
8
9// 부분 적용 - 함수를 레고처럼!
10let 더하기5 = 더하기(5, _)
11let 결과 = [1, 2, 3] |> map(_, 더하기5) // [6, 7, 8]
12
13let 범위검사 = 값 => 값 in 0..100
14let 유효한값들 = 데이터 |> filter(_, 범위검사)토파즈 자체 문서는 별도 사이트에서 확인할 수 있습니다.
토파즈 문서