본문 바로가기

IT & AI

Go 문법에 타입 안전성을 더한 새 언어 Soppo

728x90

Go 문법에 타입 안전성을 더한 새 언어 Soppo

IT & AI 뉴스 썸네일
IT & AI 뉴스 썸네일

Go의 간결한 문법은 유지하면서 열거형과 패턴 매칭, nil 안전성, 짧은 오류 전파 문법을 더한 언어가 나왔어요. Soppo는 자체 코드를 Go로 컴파일하고 기존 Go 라이브러리를 직접 쓰는 방식을 택했어요. 새 언어의 기능을 얻되 Go 생태계와 멀어지지 않으려는 접근이에요.

728x90

핵심 요약

구분내용
언어 방향익숙한 Go 문법을 가능한 한 유지하면서 빠진 타입 기능을 보완해요.
타입 안전성태그드 유니온과 빠짐없는 패턴 매칭으로 누락된 분기를 컴파일할 때 찾아요.
nil 처리nil 가능 타입을 따로 표시하고 검사 뒤 타입을 자동으로 좁혀요.
오류 처리`?` 연산자로 오류를 호출자에게 넘기고 필요하면 오류를 감싸서 처리해요.
생태계 연결Go로 컴파일하며 기존 Go 라이브러리와 도구를 활용하는 방향을 내세워요.
현재 판단기능은 흥미롭지만 초기 프로젝트라 도구 완성도와 호환 범위를 직접 확인해야 해요.

1. Go의 익숙함을 남기고 타입 기능을 보탰어요

Soppo는 Go를 대체하는 완전히 낯선 문법보다 Go 개발자가 빠르게 읽을 수 있는 언어를 지향해요. 공식 설명은 가능한 곳에서 Go 문법을 그대로 사용하며, 작성한 코드를 Go로 컴파일한다고 밝혀요. 기존 Go 라이브러리를 직접 호출할 수 있다는 점도 주요 특징으로 내세워요. 1 2

가장 눈에 띄는 기능은 구조체 변형을 담을 수 있는 태그드 유니온과 패턴 매칭이에요. 예를 들어 도형 타입에 원과 사각형 변형을 정의하면 `match` 문에서 각 변형의 필드를 꺼내 계산할 수 있어요. 처리하지 않은 변형이 있으면 컴파일러가 누락된 이름과 문제 위치를 알려줘요. 열거형에 새 변형을 추가한 뒤 관련 분기를 빼먹는 실수를 실행 전에 찾는 데 도움이 돼요.

nil 가능 여부를 타입에서 구분해요

Soppo는 nil이 될 수 있는 타입 앞에 `?`를 붙여 일반 타입과 구분해요. `?User` 값을 nil과 비교한 뒤에는 컴파일러가 해당 값을 `User`로 좁혀서 다뤄요. 공식 예제처럼 검사된 블록 안에서만 필드에 접근하게 만들면 nil 포인터 역참조를 런타임보다 앞에서 막을 수 있어요. 2

다만 기존 Go API에는 타입의 제로 값과 nil을 활용하는 관례가 널리 퍼져 있어요. Soppo의 nil 추적이 모든 Go 라이브러리 경계에서 어떻게 동작하는지는 실제 프로젝트로 확인할 부분이에요. 언어가 약속하는 안전성과 기존 코드의 관례가 만나는 지점에서 변환 규칙과 진단 품질이 중요해져요.

반복되는 오류 전달을 줄여요

Go 코드는 함수를 호출한 뒤 `if err != nil`을 반복하는 경우가 많아요. Soppo의 `?` 연산자는 오류를 호출자에게 바로 넘겨 이 구문을 줄여요. 단순 전파로 끝내지 않고 이름이 붙은 오류를 받아 메시지를 덧붙이는 처리 블록도 쓸 수 있어요.

오류를 값으로 명시한다는 Go의 원칙은 유지하면서 반복 코드만 줄이려는 설계예요. 다만 짧은 문법이 오류의 맥락까지 자동으로 보존해 주는 것은 아니에요. 호출 위치에 필요한 정보를 붙이고 원래 오류를 추적할 수 있는지는 팀의 작성 규칙과 표준 라이브러리 동작까지 함께 봐야 해요.

컴파일러 밖의 개발 도구도 함께 제공해요

프로젝트 저장소는 LSP, 포매터, 린터, 테스트 러너와 문서 테스트를 기본 도구로 소개해요. 설치는 전용 버전 관리자인 SOPMOD를 권장해요. Cargo로 `sop` 바이너리만 설치할 수도 있지만 이 경로에는 Rust와 Go가 필요해요. 컴파일러 자체는 Rust로 작성됐고 코드는 BSD 3-Clause 라이선스로 공개돼 있어요. 3

기존 Go 프로젝트에 조금씩 넣을 수 있다는 설명은 매력적이에요. 실제 도입 전에는 빌드 파이프라인, 디버거, 프로파일러, 코드 생성 도구, `go test` 중심의 운영 절차가 어디까지 그대로 이어지는지 확인해야 해요. 문법 호환성과 운영 도구의 완전한 호환성은 같은 뜻이 아니에요.

왜 중요한가요

Go 팀은 언어의 단순함 덕분에 코드 스타일을 맞추기 쉽지만, 합 타입이나 빠짐없는 패턴 매칭을 원하는 순간 별도 규칙과 우회 구현을 만들곤 해요. Soppo는 이 요구를 Go 바깥의 대형 생태계로 옮기지 않고, Go 코드와 라이브러리를 계속 활용하는 방식으로 풀려고 해요. 작은 서비스나 도구에서 새 문법을 시험하면서 기존 코드와 연결할 수 있다면 도입 비용을 낮출 여지가 있어요. 2 3

아직은 장기 운영 사례보다 언어 설계와 초기 도구가 먼저 공개된 단계에 가까워요. 프로덕션 도입을 판단할 때는 예제의 간결함보다 Go 버전 추종 속도, 생성된 코드의 가독성, 디버깅 경험, 모듈 호환성, 릴리스 안정성을 먼저 봐야 해요. Playground와 Tour로 문법을 확인하고 작은 비운영 모듈에서 생성 결과와 오류 메시지를 검토하는 순서가 현실적이에요.

Go 개발자는 Soppo를 통해 익숙한 문법을 유지하면서 컴파일러가 더 많은 실수를 잡게 할 수 있어요. 실제 채택 범위는 Go 버전 업데이트를 따라가는 속도와 라이브러리 상호 운용, 디버깅 도구의 안정성에 따라 정해질 거예요.

참고 자료

  1. Soppo - Go에 빠진 기능을 더한 언어 — GeekNews
  2. Soppo 공식 사이트 — Soppo
  3. halcyonnouveau/soppo — GitHub
728x90