Verse 완벽 이해 – 벌스 함수 문법은 왜 독특하게 느껴질까?

이전 글에서는 벌스(Verse)의 변수 선언 방식과 타입 시스템,
그리고 option 타입과 Failure 개념이 어떤 방향성을 가지고 있는지를 정리해보았습니다.

이번 글에서는 벌스 함수 문법이 왜 기존 언어들과 조금 다르게 느껴지는지,
그리고 함수 선언 구조 안에 어떤 특징들이 들어가 있는지를 정리해보려고 합니다.


함수 선언 형태가 기존 언어와 다르게 보인다

벌스 코드를 처음 보면 함수 선언 방식이 기존 C++나 C#과는 조금 다르게 느껴집니다.

예를 들어 일반적인 C++에서는 아래처럼 반환 타입을 먼저 작성한 뒤 함수 이름과 매개변수를 선언하는 경우가 많습니다.

void Jump()
{
}

반면 벌스에서는 아래처럼 함수 이름 뒤에 타입 정보가 따라오는 형태를 사용합니다.

Jump() : void =

처음에는 다소 낯설게 느껴질 수도 있습니다.

특히 C 계열 언어 문법에 익숙한 개발자라면 함수 선언 위치와 타입 표기 순서 자체가 다르게 보입니다.

하지만 벌스는 전체적으로 “상태와 타입을 명시적으로 표현하려는 의도”가 강하게 느껴지는 언어입니다.

그리고 함수 선언 구조 역시 이런 방향성과 연결되어 있는 것처럼 보입니다.


함수 자체를 하나의 값처럼

벌스 함수 문법을 보다 보면 단순 “명령 실행”보다, 함수 자체를 하나의 값처럼 표현하려는 것 같습니다.

예를 들어 아래 코드를 보면 함수 이름과 매개변수, 그리고 반환 타입이 비교적 명확하게 구분되어 표현됩니다.

MoveToTarget(Target : player) : void =

특히 반환 타입이 뒤쪽에 위치하다 보니, TypeScript와 비슷하게 보이기도 합니다.

실제로 벌스 문법은 Python처럼 간결한 구조와 TypeScript식 타입 표기 방식이 일부 섞여 있는 것처럼 보이기도 합니다.

벌스는 최근의 스크립트 언어의 단순한 문법을 차용하되 언어 전체를 더 선언형 구조로 표현하려는 의도가 보입니다.


세미콜론과 중괄호가 거의 보이지 않는다

벌스 코드를 보면 세미콜론과 중괄호 사용이 굉장히 적다는 점도 눈에 들어옵니다.

예를 들어 C++에서는 코드 블록을 표현하기 위해 중괄호를 계속 사용하게 됩니다.

void Attack()
{
    PlayAnimation();
}

반면, 벌스는 상대적으로 훨씬 간결한 형태로 코드를 작성합니다.

Attack() : void =
    PlayAnimation()

즉, 벌스는 전체적으로 문법 요소 자체를 줄이고, 코드 흐름과 상태 표현에 조금 더 집중하는 것 같습니다.

특히 UEFN처럼 다양한 사용자가 빠르게 게임 로직을 작성해야 하는 환경에서는 이런 간결함이 중요할 수 있습니다.


<override> 문법

벌스의 코드를 보면 아래처럼 함수 이름 뒤에 특수한 태그가 붙는 경우를 볼 수 있습니다.

OnBegin<override>()<suspends> : void =

처음 보면 일반 함수 선언보다 훨씬 낯설게 느껴집니다.

특히 C++에서는 override 키워드를 함수 뒤쪽에 작성하기 때문에 구문의 위치가 다르게 보입니다.

하지만 벌스는 함수의 “특성” 자체를 명시적으로 표현하려는 것 같습니다.

예를 들어 override는 현재 함수가 부모 클래스 함수를 재정의하고 있다는 의미를 나타냅니다.

그리고 이런 정보들을 함수 선언 안에서 직접적으로 드러내려는 것처럼 보입니다.

즉, 벌스는 함수의 역할과 상태, 동작 특성을 더 명시적으로 표현하려는 특징이 보입니다.


<suspends> 키워드

벌스 함수 문법에서 특히 흥미로운 부분 중 하나는 suspends와 같은 키워드입니다.

예를 들어 아래처럼 함수 선언에 함께 사용됩니다.

OnBegin<suspends>() : void =

<suspends>는 함수 실행이 특정 시점에서 일시 중단될 수 있다는 것을 의미합니다.

즉, 일반적인 순차 실행 함수보다 비동기 흐름이나 동시성 구조와 연관되어 있는 특징이라고 볼 수 있습니다.

그리고 이런 특징은 이전 글에서 이야기했던 동시성(Concurrency) 개념과도 자연스럽게 이어집니다.

특히 Epic은 실시간 멀티플레이 환경과 대규모 온라인 플랫폼 구조를 언리얼 엔진의 방향성으로 보고 있는 것 같습니다.

따라서 벌스 역시 동시성과 이벤트 흐름을 자연스럽게 표현할 수 있는 방향으로 발전하고 있는 것처럼 보입니다.


벌스 함수 문법은 플랫폼 구조와 연결될 가능성이 있다

벌스 함수 문법은 단순히 새로운 문법 형태 수준에서 끝나는 것 같지는 않습니다.

함수의 상태와 특성, 그리고 실패 가능성과 동시성 구조를 언어 안에서 더 직접적으로 표현하려는 특징을 가지고 있습니다.

함수가 부모 함수를 재정의하는 상태인지, 실행 도중 중단될 수 있는 함수인지 같은 정보들을 함수 선언에서 직접적으로 드러내고 있습니다.

즉, 단순히 “코드를 실행한다”는 수준보다, 현재 함수가 어떤 역할과 특성을 가지는지를 언어 차원에서 조금 더 명확하게 표현하려는 특징이 보입니다.

그리고 이런 특징들은 대규모 온라인 플랫폼과 사용자 제작 콘텐츠 환경에서 훨씬 중요해집니다.

특히 UEFN처럼 수많은 사용자가 다양한 게임 로직을 동시에 작성하고 실행하는 환경에서는 코드와 상태를 명확하게 표현하는 것이 더 중요해질 수 있기 때문입니다.

또한 멀티플레이 환경에서는 단순 순차 실행 구조보다, 동시성과 이벤트 흐름을 얼마나 안정적으로 표현할 수 있는지도 굉장히 중요합니다.

그리고 벌스는 이런 환경을 강하게 의식하고 설계된 언어처럼 보입니다.

따라서 벌스 함수 문법 역시 Epic이 앞으로 만들고자 하는 플랫폼 구조와 연결해서 바라볼 필요가 있지 않을까 생각합니다.


마무리

벌스의 함수 문법은 기존 C++나 C#과 비교했을 때 꽤 다른 형태를 가지고 있습니다.

특히 타입 표기 위치와 override,
suspends 같은 키워드들은 기존 게임 스크립트 언어보다 함수의 상태와 특성을 더 직접적으로 드려내려는 의도를 보여준다고 생각합니다.

즉, 벌스는 현재 함수가 어떤 역할을 수행하는지, 어떤 방식으로 동작하는지를 언어 안에서 명확하게 표현하고 있습니다.

그리고 이런 구조는 대규모 온라인 플랫폼 환경과도 자연스럽게 이어집니다.

특히 수많은 사용자가 동시에 다양한 로직을 작성하고 실행하는 환경에서는 함수의 상태와 실행 흐름,
동시성 구조를 명확하게 표현하는 것이 더 중요해지기 때문입니다.

다음 글에서는 벌스의 Failure 개념이 왜 중요한지, 그리고 Epic이 왜 실패 가능성을 언어 안으로 가져오려고 했는지를 조금 더 자세하게 정리해보겠습니다.


👉 게임 엔진 구조를 더 깊이 이해하고 싶다면

아래 강의를 통해 직접 구현해보는 것을 추천드립니다.

C++로 만드는 게임 엔진 프레임워크 강의

👉 C++로 만드는 게임 엔진 프레임워크 강의 바로가기

댓글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다