읽는 대상을 중심으로 설계된 언어
대부분의 프로그래밍 언어는 사람을 위해 설계되었습니다. 문법은 사람이 신경 쓰는 것들에 최적화되어 있죠. 간결한 표현, 풍부한 관용구, "우아한" 단축 표현 같은 것들 말입니다. 컴파일러가 에러 메시지를 산문으로 출력하는 것도 그걸 읽는 게 사람이기 때문이고, 표준 라이브러리는 라이브러리 작성자가 외우기 쉬운 방식으로 정리됩니다.
Zero는 다른 전제에서 출발합니다. 주된 독자는 AI 에이전트입니다. 누군가를 대신해 코드를 작성하고, 디버깅하고, 수정하는 언어 모델 말이죠. 물론 사람도 여전히 그 과정에 참여하지만, 언어 설계 자체는 처음부터 에이전트를 1급 사용자로 취급합니다. 이 단 하나의 변화가 언어의 거의 모든 가시적 기능으로 흘러내려 갑니다.
Zero는 Vercel Labs에서 만들고, zerolang.ai에 자리잡고 있으며, github.com/vercel-labs/zero에서 오픈소스로 공개되어 있습니다. 소스 파일은 .0로 끝납니다.
이 짧은 코드에 등장하는 다섯 가지 — pub, World, raises, check, 그리고 명시적인 world.out.write — 만으로도 Zero의 사고방식이 어느 정도 드러납니다. 아래에서 하나씩 풀어 보겠습니다.
"모든 것은 명시적이다"
Zero 문서의 비공식 슬로건은 모든 것은 명시적이다입니다. 다른 시스템 언어들이 사람에게 편의를 제공하지만 코드 생성기에게는 위험할 수 있는 숨은 장치들을 Zero는 의도적으로 피합니다.
- 강제적인 가비지 컬렉터 없음.
- 숨어 있는 할당자 없음.
- 암묵적인 비동기 런타임 없음.
- 마법 같은 전역 변수 없음. 어디서든 부를 수 있는
stdout도,process.env도, 암묵적인 파일 시스템 접근도 없습니다.
함수가 바깥 세상과 어떤 식으로든 접촉한다면 그 사실이 시그니처에 드러나야 합니다. 사람에겐 타이핑이 늘어나는 일이지만, 함수가 실제로 무엇을 하는지 추론해야 하는 에이전트 입장에서는 큰 선물이죠.
전역 변수가 아닌 능력(Capability)
Zero가 I/O를 다루는 방식이 이 철학을 가장 잘 보여줍니다. 전역 print 함수 같은 건 없습니다. 모든 출력은 런타임이 main에 건네는 World 값을 통해 일어납니다.
pub fun main(world: World) -> Void raises {
check world.out.write("hello\n")
}
호출 스택 깊은 곳에 있는 함수가 로그 한 줄을 쓰고 싶다면, 그 함수도 World(혹은 더 좁은 능력)를 인자로 명시적으로 받아야 합니다. 함수의 시그니처만 봐도 — 본문을 읽지 않고도 — 그 함수가 네트워크나 파일 시스템, 표준 출력에 접근할 가능성이 있는지 알 수 있다는 뜻이죠. 정적 분석기(또는 코드 리뷰를 하는 에이전트)가 의지할 수 있는 종류의 속성입니다.
World 능력 문서에서 이 아이디어를 더 깊이 다룹니다.
raises와 check로 표현하는 명시적 실패
실패할 수 있는 함수는 그 사실을 시그니처에 선언합니다. 그런 함수를 호출하는 쪽도 실패 가능성을 명시적으로 인지합니다. 조용히 던지는 예외는 없습니다.
validate의 raises { InvalidInput }은 "이 함수는 InvalidInput으로 실패할 수 있다"는 뜻입니다. 호출 지점의 check는 "실패하면 에러를 위로 전파해라"라는 뜻이고요. 에러를 실수로 흘려보낼 수가 없습니다. 함수의 시그니처에 드러나거나 컴파일러가 막아 줍니다. 자세한 내용은 Raises와 Check에서 다룹니다.
에이전트와 대화하는 컴파일러
Zero에서 가장 특별한 부분은 문법 기능이 아니라 컴파일러의 출력입니다. 깨진 프로그램에 zero check --json을 돌리면 이런 결과가 돌아옵니다.
{
"ok": false,
"diagnostics": [
{
"code": "NAM003",
"message": "unknown identifier",
"line": 3,
"repair": { "id": "declare-missing-symbol" }
}
]
}
이게 일반적인 컴파일러 에러와 다른 점은 세 가지입니다.
- 안정적인 에러 코드.
NAM003은 오늘도 "unknown identifier"를 뜻하고 다음 컴파일러 버전에서도 정확히 같은 것을 뜻합니다. 에이전트는 영문 메시지를 파싱하지 않고 코드만 패턴 매칭하면 됩니다. - 구조화된 수정 메타데이터.
repair필드는 컴파일러가 그 에러를 해결할 수 있다고 생각하는 수정 _종류_를 가리킵니다. 에이전트는zero fix --plan --json으로 계획을 받아서 적용할 수 있어요. - 산문 파싱이 필요 없음. 에이전트가 사람용 메시지를 해석해서 다음에 할 일을 결정해야 할 이유가 없도록 만든 것이 핵심입니다.
JSON 진단 문서에서 이 포맷을 자세히 살펴봅니다.
의도적으로 작은 표면적
Zero의 문법은 작고 규칙적입니다. Scala나 현대 C++ 같은 종합 백화점형 언어보다는 초기 C에 더 가까운 느낌이에요. 이유는 실용적입니다. 에이전트가 한 세션 안에 언어 전체를 익히고도, 엣지 케이스에서 잘못된 변종을 선택하지 않을 수 있어야 한다는 거죠.
그 결과:
- 함수를 선언하는 방법은 한 가지 (
fun또는pub fun). - 지역 값을 바인딩하는 방법은 한 가지 (
let). - 곱타입을 모델링하는 방법은 한 가지 (
shape), 합타입은 한 가지 (choice), 평범한 열거는 한 가지 (enum). - 패턴 매칭 구조도 한 가지 (
match). - 초기 단계에서 루프 구조도 한 가지 (
while).
반대로 찾을 수 없는 것들은 — 적어도 지금 단계에서는 — 연산자 오버로딩, 암시적 변환, 매크로, 데코레이터, 같은 아이디어를 표현하는 서로 다른 세 가지 방법 같은 것들입니다. 금욕주의 때문이 아니라, 표면적을 충분히 작게 유지해서 에이전트가 잘못된 변종을 고를 일을 줄이려는 의도적인 선택입니다.
Zero가 아닌 것
기대치를 맞춰 두자면:
- 스크립트 언어가 아닙니다. Zero는 네이티브 바이너리로 컴파일됩니다. 프로그램은 작고(문서에서는 10KB 미만의 실행 파일이 언급됩니다) 런타임을 끌고 다니지 않습니다.
- Rust도, Go도, Zig도 아닙니다. 문법적 조상은 일부 공유하지만 우선순위가 다릅니다. Rust는 정교한 타입 시스템으로 메모리 안전성을 최적화하지만, Zero는 일부러 작게 만든 타입 시스템으로 에이전트가 익히기 좋은 언어를 노립니다.
- 안정적이지 않습니다. Zero는 1.0 이전 단계입니다. 에이전트 우선 목표를 진전시킬 수 있다면 깨지는 변경도 들어올 것이라고 팀이 분명히 밝히고 있어요. 진지한 용도로는 아직 의존하지 마세요.
- Vercel 배포 플랫폼의 기능이 아닙니다. Vercel Labs에서 만들지만, Zero는 Next.js나 Vercel 호스팅과 묶여 있지 않습니다. 독립된 시스템 언어입니다.
지금 Zero를 시도해 볼 만한 이유
다음 같은 것에 관심이 있다면 Zero를 시도해 볼 만합니다.
- 설계 제약이 사람이 아닌 에이전트에게서 나오면 언어가 어떻게 달라지는지 보고 싶을 때.
- 연구용 언어를 채택하지 않고도 능력 기반 I/O를 실험해 보고 싶을 때.
- "구조화된 컴파일러 출력"이 사후 처리가 아니라 1급 기능으로 자리 잡으면 어떤 모습인지 보고 싶을 때.
- 활발히 발전 중인 프로젝트에 Vercel Labs로 피드백을 주고 싶을 때.
반대로 실제 업무용으로 안정적인 언어가 필요하거나, 성숙한 라이브러리 생태계가 필요하거나, Rust/Go 수준의 크로스 플랫폼 도구가 필요하다면 (지금은) 건너뛰는 게 좋습니다.
다음 글: Zero 설치
다음 문서에서는 Zero 툴체인을 설치하고 첫 프로그램을 컴파일해 보겠습니다. 처음부터 끝까지 1분 정도면 끝납니다.
자주 묻는 질문
Zero 프로그래밍 언어가 뭔가요?
Zero는 Vercel Labs에서 개발한 실험적인 시스템 프로그래밍 언어로, AI 에이전트를 사람과 함께 주요 사용자로 두고 설계되었습니다. 작고 규칙적인 문법, World 능력을 통한 명시적 효과, 그리고 에이전트가 곧바로 활용할 수 있도록 구조화된 JSON 진단과 기계가 읽을 수 있는 수정 계획을 내보내는 컴파일러를 갖추고 있습니다.
Zero는 누가 만들고 있고 정식 Vercel 제품인가요?
Zero는 Vercel의 연구 조직인 Vercel Labs에서 만들고 있습니다. github.com/vercel-labs/zero에서 공개된 실험 프로젝트이며, Vercel의 안정화된 제품은 아닙니다. README에서도 1.0 이전 단계임을 명시하고, 운영 환경이나 민감한 데이터에서 실행하지 말라고 안내하고 있습니다.
Zero는 '에이전트 언어'인가요?
맞습니다. Zero의 핵심 목표는 사람뿐 아니라 AI 에이전트도 안정적으로 코드를 읽고, 생성하고, 디버깅하고, 수정할 수 있는 언어를 설계하는 것입니다. 작고 규칙적인 문법부터 컴파일러의 JSON 출력, NAM003 같은 안정적인 에러 코드까지 모든 결정이 이 목표에서 나옵니다.
Zero 소스 파일은 어떻게 생겼나요?
소스 파일은 .0 확장자를 사용합니다. 최소한의 프로그램은 다음과 같습니다: pub fun main(world: World) -> Void raises { check world.out.write("hello\n") }. World 매개변수는 I/O에 사용하는 능력 객체이고, raises와 check로 실패 가능성을 명시적으로 드러냅니다.
Zero를 운영 환경에서 써도 되나요?
아직은 안 됩니다. Zero는 1.0 이전 단계이며 명시적으로 실험적인 언어입니다. 컴파일러, 표준 라이브러리, 문법이 모두 계속 바뀌고 있습니다. 팀에서도 격리된 환경에서만 실행하기를 권장하고 있어요. 학습과 프로토타이핑, 피드백 제공에는 좋지만, 사용자에게 공개되는 소프트웨어를 출시하는 용도는 아직 적절하지 않습니다.