이전 글에서는 벌스(Verse)의 함수 문법이 기존 C++나 게임 스크립트 언어와 어떻게 다른지를 정리해보았습니다.
특히 override와 suspends 같은 표현들을 통해 함수의 상태와 특성을 코드 안에서 비교적 직접적으로 표현하고 있다는 점도 함께 살펴보았습니다.
이번 글에서는 벌스를 이야기할 때 가장 독특하게 느껴지는 개념 중 하나인 Failure에 대해 정리해보려고 합니다.
Failure는 단순 오류 처리 기능이 아니다
일반적인 프로그래밍 언어에서는 실패 상황을 처리하기 위해 다양한 방법을 사용합니다.
예를 들어 특정 객체가 존재하지 않거나,
조건이 만족되지 않거나,
연산 수행이 불가능한 상황이 발생할 수 있습니다.
이런 경우 기존 언어에서는 보통 null 체크나 bool 반환, 예외 처리(Exception) 같은 방식으로 문제를 처리합니다.
예를 들어 C++에서는 nullptr 검사나 bool 반환을 사용하는 경우가 많고, C#에서는 Exception 기반 처리 방식을 자주 사용합니다.
반면, 벌스는 실패 가능성 자체를 코드 안에서 직접 표현하려는 특징을 가지고 있습니다.
즉, 단순히 “오류가 발생했다” 수준으로 처리하기보다,
현재 연산이 성공 가능한 상태인지 자체를 언어 차원에서 표현하려는 구조에 더 가깝습니다.
벌스는 실패 가능성을 숨기지 않는다
일반적인 게임 코드에서는 특정 객체가 없을 수도 있다는 사실을 개발자가 직접 관리해야 하는 경우가 많습니다.
예를 들어 null 체크를 깜빡하거나, 잘못된 객체 접근이 발생하면 런타임 오류로 이어질 수도 있습니다.
특히 프로젝트 규모가 커질수록 이런 문제는 예측하기 어려운 버그로 발전하는 경우도 많습니다.
벌스는 이런 문제를 단순히 “개발자가 조심해야 하는 영역”으로 남겨두지 않습니다.
option 타입 역시 이런 구조와 관련이 있습니다.
CurrentTarget : ?player = false
이 코드는 현재 타겟 플레이어가 존재하지 않을 수도 있다는 사실 자체를 타입 구문 안에서 표현합니다.
즉, 값이 존재하지 않을 가능성을 코드 밖에서 암묵적으로 처리하기보다, 언어 안에서 명확하게 드러내고 있는 것입니다.
Failure는 코드 자체에 영향을 준다
벌스에서 Failure는 단순 예외 처리 기능으로만 사용되지 않습니다.
오히려 코드 작성 방식 자체에 영향을 주는 개념이라고 할 수 있습니다.
예를 들어 특정 조건이 만족되지 않으면 연산 자체가 실패할 수 있고,
그 결과에 따라 이후 코드 실행 여부 역시 달라질 수 있습니다.
즉, “실패 가능한 연산” 자체를 일반 코드 안으로 가져오는 것입니다.
이 부분은 기존 게임 스크립트 언어들과 비교했을 때 다르다고 할 수 있습니다.
기존 명령형 언어들은 보통 “성공하는 코드”를 기본 상태로 두고,
예외 상황을 별도로 처리하는 경우가 많기 때문입니다.
반면, 벌스는 실패 가능성 자체를 일반 코드 안에서 자연스럽게 다루고 있습니다.
Epic이 Failure를 중요시하는 이유?
이 부분은 벌스를 이해할 때 굉장히 중요한점 중 하나입니다.
Epic은 단순 싱글플레이 게임 제작 환경보다,
대규모 온라인 플랫폼과
사용자 제작 콘텐츠 환경을 훨씬 중요하게 고려하는 것으로 보입니다.
특히 UEFN은 수많은 사용자가 동시에 다양한 게임 로직을 작성하고 실행하는 환경입니다.
이런 환경에서는 단순히 “코드가 실행된다”는 것보다,
실패 상황을 얼마나 안전하게 관리할 수 있는지가 중요할 수 있습니다.
예를 들어 어떤 객체가 존재하지 않을 수도 있고,
특정 이벤트가 예상과 다르게 동작할 수도 있으며,
여러 사용자의 코드가 동시에 실행되면서 상태가 계속 변경될 수도 있습니다.
그리고 이런 환경에서는 실패 가능성을 언어 안에서 명확하게 표현하는 구조가 플랫폼 안정성 측면에서 훨씬 유리해집니다.
벌스는 바로 이런 문제를 강하게 의식하고 설계된 언어처럼 보입니다.
Failure는 동시성 문제와도 관련이 깊다
벌스의 Failure 개념은 동시성 구조와도 밀접한 관련이 있습니다.
멀티플레이 환경에서는 수많은 상태 변화와 이벤트가 동시에 발생하게 됩니다.
특히 여러 플레이어가 같은 객체를 동시에 접근하거나,
실시간 이벤트가 겹쳐서 발생하는 상황도 자주 등장합니다.
이런 환경에서는 특정 연산이 항상 성공한다고 가정하기 어려워집니다.
예를 들어 어떤 플레이어가 이미 제거된 객체를 접근하려 하거나,
다른 시스템이 먼저 상태를 변경해버리는 상황도 충분히 발생할 수 있습니다.
따라서 실패 가능성을 코드 안에서 직접 표현하고,
안전하게 처리할 수 있는 구조가 점점 더 중요해지고 있습니다.
그리고 벌스는 이런 문제를 언어 차원에서 비교적 직접적으로 다루고 있습니다.
Failure는 벌스 언어 철학의 핵심 요소 중 하나다
벌스를 보다 보면 Failure가 단순 문법 요소 수준에서 끝나는 개념이 아니라는 점이 보입니다.
특히 option 타입과 함수 구조,
동시성 처리 방식,
상태 표현 방식 같은 요소들이 서로 맞물리면서 Failure 개념이 그 중심에 있다는 것을 이해할 수 있습니다.
즉, 벌스는 단순히 “코드를 실행하는 언어”보다,
“실패 가능성과 상태 변화를 안정적으로 관리하는 언어”를 목표로 하는 것 같습니다.
그리고 이런 특징은 기존 게임 스크립트 언어들과 차별점을 갖는 핵심 요소 중 하나라고 볼 수 있습니다.
마무리
벌스의 Failure 개념은 단순 오류 처리 기능 수준에서 끝나지 않습니다.
실패 가능성을 코드 안에서 직접 표현하고,
상태와 연산 결과를 조금 더 안전하게 관리하기 위한 핵심 구조라고 할 수 있습니다.
특히 대규모 온라인 플랫폼과 사용자 제작 콘텐츠 환경에서는 이런 구조가 점점 더 중요해집니다.
그리고 Epic이 앞으로 구축하려는 플랫폼 방향을 함께 생각해보면,
왜 벌스가 Failure 개념을 언어 핵심 구조 안으로 가져왔는지도 조금씩 이해할 수 있습니다.
다음 글에서는 벌스의 동시성(Concurrency) 구조가 왜 중요한지,
그리고 Epic이 왜 실시간 온라인 환경을 고려한 언어 구조를 만들고 있는지를 이어서 정리해보겠습니다.