Wyzer 프로그래밍 언어
Wyzer는 코레오그래피 프로그래밍(choreographic programming)을 통한 통합 분산 안전성 및 Perceus 메모리 모델을 갖춘 정적 타입, 컴파일 기반 리소스 지향 프로그래밍 언어입니다.
"단순함은 힘의 부재가 아니다. 그것은 허세 없는 힘이다."
~ Atiksh Sharma
코레오그래피 프로그래밍이란 무엇인가요?
전통적인 분산 프로그래밍에서는 클라이언트와 서버에 대한 별도의 코드를 작성하고, 이들의 통신 프로토콜이 일치하기를 기대해야 합니다. 코레오그래피 프로그래밍은 전체 분산 시스템의 단일하고 통합된 뷰(view)를 작성할 수 있게 해줍니다. 컴파일러는 이 단일 스크립트를 각 물리적 노드(예: 클라이언트 및 서버)에 대한 교착 상태가 없는 독립적인 바이너리로 수학적으로 투영합니다.
Perceus 메모리 모델이란 무엇인가요?
Perceus는 가비지 컬렉터(Garbage Collector)의 예측 불가능한 일시 중단이나 빌로우 체커(borrow checker)의 복잡한 주석 처리를 피하는 빠르고 결정론적인 메모리 관리 전략입니다. 이는 정확한 참조 카운팅(reference counting)을 사용하여 어떤 값이 단일 소유자(single owner)를 갖는지 정확히 파악하며, 컴파일러가 복사본을 만들거나 프로그램을 일시 중단하지 않고 데이터에 직접 제자리에서 변경(in place mutation, FBIP)할 수 있도록 합니다.
설계 원칙
- 모든 것에 대한 단일 소유권 규칙 (One ownership rule for everything)
- 가비지 컬렉터 없음 (No garbage collector)
- 빌로우 체커 없음 (No borrow checker)
- 설계상 교착 상태 방지 (Deadlock-free by design)
- 숨겨진 마법 피하기 (Avoid hidden magic)
- C ABI 호환성
-
우리가 따르는 규칙
- 구문은 약어 사용을 피하고 간결하게 유지되어야 함
- 기본 문법(Base Syntax)은 최소한으로 유지해야 하며, 추가되는 모든 것은
std 라이브러리 내에 있어야 함
- 단순함을 넘어 더 단순하게 만들어서는 안 됨 (Something shouldn't be made simpler beyond simple)
예시
분산 키-값 저장소
Wyzer에서는 여러 시스템이 서로 어떻게 통신하는지를 설명하는 하나의 프로그램을 작성합니다. 컴파일러가 네트워크 전송을 자동으로 추론하고 노드 간의 소유권을 검증합니다.
role @Client;
role @Server;
...
Wyzer는 Choreography와 Perceus 선형 타이핑을 결합하기 때문에, 네트워크 전송은 절대적인 선형 이동(linear move)으로 작용합니다. 변수의 소유권을 네트워크를 가로질러 전송하면 로컬에서 해당 변수를 소비하게 됩니다. 이를 다시 사용하려고 시도하면 컴파일 타임 오류가 발생합니다:
Error [E001]: use of moved variable `put_req`
╭─▶ example.wyz:31:22
│
...
요청/응답 Choreography
Choreographies를 사용하면 복잡한 네트워크 핸드셰이크가 마치 단일 순차 함수처럼 읽히게 됩니다. 여기서는 클라이언트가 서버에 쿼리하고, 서버는 그 결과를 다시 클라이언트로 반환합니다:
fn fetch_data(query: str@Client) -> str@Client {
// client transfers query to Server
let server_query: str@Server = query;
...
제자리 뮤테이션 (In-Place Mutation, Perceus)
Wyzer는 정밀한 참조 카운팅(reference counting)을 통해 변수의 생명주기를 결정하는 Perceus 메모리 모델을 사용합니다. 만약 변수가 고유하게 소유된다면 (refcount == 1), 컴파일러는 새로운 메모리를 할당하는 대신 데이터를 제자리에서 안전하게 뮤테이션합니다 (이를 FBIP: Functional But In-Place라고 합니다).
struct User { id: u32, name: str }
fn update_name(user: User, new_name: str) -> User {
...
문서 및 커뮤니티
커뮤니티: Discord 서버에 참여하세요: https://discord.gg/RhpPhkTrVu
주목할 만한 예시