본문 바로가기

Home > 열린마당 > 공개SW 소식

공개SW 소식

"고, 무엇에 좋은가" 고 언어의 기능과 제약, 그리고 발전 방향

OSS관리자 게시글 작성 시각 2019-10-20 15:01:07 게시글 조회수 4309

10월 19일

ⓒ IT WORLD, Serdar Yegulalp | InfoWorld

 

구글 고(Go), 즉 고랭(Golang)은 출시 직후에는 컴퓨터 전문가를 위한 신기한 언어 정도였지만 9년이 지난 지금은 세계적인 여러 클라우드 중심 프로젝트의 기반 언어로 올라섰다.

 

도커, 쿠버네티스와 같은 프로젝트 개발자들이 고를 선택한 이유는 무엇일까? 고의 대표적인 특징은 무엇이고, 다른 프로그래밍 언어와 어떻게 다르며, 가장 적합한 프로젝트 종류는 무엇일까? 이번 기사에서는 고의 기능과 최적의 사용 사례, 없는 기능과 제약, 앞으로의 발전 방향을 살펴본다.

 

작고 간소한 고 언어
고랭이라는 별칭으로도 불리는 고는 오랜 유닉스 권위자이자 구글 특별 엔지니어인 롭 파이크를 중심으로 구글 직원들에 의해 개발됐다. 그러나 커뮤니티가 주축이 된 오픈소스 프로젝트이므로 엄밀히 말해 “구글 프로젝트”는 아니다. 주 개발진은 고의 사용 방법과 방향에 대해 확고한 의견을 갖고 고 프로젝트를 이끌었다.

 

고는 배우기 용이하고 사용하기 간단하며 다른 개발자가 읽기 쉬운 언어를 목표로 설계됐다. 특히 C++와 같은 언어와 비교하면 기능이 그렇게 많지는 않다. 구문은 C와 비슷해서 C 경험이 풍부한 개발자라면 비교적 쉽게 배울 수 있다. 또한 여러 기능, 특히 동시성과 함수형 프로그래밍 기능은 얼랭(Erlang)과 같은 언어를 연상시키기도 한다.

 

다양한 크로스 플랫폼 엔터프라이즈 애플리케이션을 빌드하고 유지하기 위한 C 유사 언어인만큼 자바와도 공통점이 많다. 또한 어디서나 실행되는 코드를 신속하게 개발할 수 있게 해준다는 점은 파이썬과 비슷하다. 다만 파이썬의 경우 유사점보다는 차이점이 훨씬 더 많다.

 

고 언어에는 모든 사람들을 위한 무언가가 있다
고 문서는 고를 “동적 타입의 인터프리트 언어처럼 느껴지는, 빠른 정적 타입의 컴파일 언어”로 설명한다. 용량이 큰 고 프로그램도 컴파일에는 몇 초 정도밖에 걸리지 않는다. 또한 고에는 C 스타일의 파일 및 라이브러리 포함 오버헤드가 거의 없다.

 

다음과 같은 고의 특징은 개발자가 한결 쉽게 작업할 수 있게 해준다.


- 편의성(Convenience): 고는 많은 일반적인 프로그래밍 요구를 충족할 수 있다는 면에서 파이썬과 같은 스크립팅 언어와 곧잘 비교된다. 고의 기능 중에서 예를 들어 동시성과 스레드형 동작을 위한 “고루틴(goroutine)”과 같은 일부 기능은 언어 자체에 내장됐으며 부가적인 기능은 예를 들어 고의 http 패키지와 같은 고 표준 라이브러리 패키지를 통해 사용할 수 있다. 고는 파이썬과 마찬가지로 가비지 수집을 포함한 자동 메모리 관리 기능을 제공한다.


파이썬과 같은 스크립팅 언어와 달리 고 코드는 실행 속도가 빠른 네이티브 바이너리로 컴파일된다. 또한 C나 C++와 달리 고의 컴파일 속도는 매우 빨라서, 고로 작업하다 보면 컴파일 언어가 아니라 스크립팅 언어를 사용하는 느낌이 들 정도다. 또한 고 빌드 시스템은 다른 컴파일 언어만큼 복잡하지 않다. 고 프로젝트는 많은 단계나 부수적 작업 없이 간단히 빌드하고 실행할 수 있다.

 

- 속도(Speed): 고 바이너리의 실행 속도는 C 바이너리에 비하면 느리지만 그 차이는 대부분의 애플리케이션에서 무시해도 될 수준이다. 대다수의 작업에서 고의 성능은 C와 대등하며, 빠른 개발 속도로 유명한 다른 언어(예를 들어 자바스크립트, 파이썬, 루비 등)보다 훨씬 더 빠르다.

 

- 이식성(Portability): 고 툴체인으로 생성된 실행 파일은 기본적인 외부 종속성 없이 독립적으로 실행이 가능하다. 고 툴체인은 다양한 운영체제 및 하드웨어 플랫폼에서 사용할 수 있으며 여러 플랫폼에 걸쳐 바이너리를 컴파일하는 데 사용할 수 있다.

 

- 상호운용성(Interoperability): 고는 앞서 설명한 모든 장점을 기반 시스템에 대한 액세스를 희생하지 않으면서 제공한다. 고 프로그램은 외부 C 라이브러리와 통신하거나 네이티브 시스템 호출을 수행할 수 있다. 예를 들어 도커에서 저수준 리눅스 함수, 컨트롤 그룹(cgroup), 네임스페이스와 교신해 컨테이너 기능을 구현한다. 

 

- 지원(Support): 고 툴체인은 리눅스, 맥OS, 윈도우 바이너리 또는 도커 컨테이너로 무료로 제공된다. 레드 햇 엔터프라이즈 리눅스 및 페도라와 같은 많은 인기있는 리눅스 배포판에 기본적으로 포함되므로 이런 플랫폼에 고 소스를 배포하기도 비교적 쉽다. 또한 마이크로소프트 비주얼 스튜디오 코드부터 액티브스테이트(ActiveState) 코모도 IDE에 이르기까지 다수의 서드파티 개발 환경에서도 고에 대한 지원이 탄탄하다.
 

고의 장점이 가장 잘 발휘되는 분야
모든 작업에 다 맞는 언어는 없지만 다른 언어에 비해 더 많은 종류의 작업에 적합한 언어는 있다. 고는 다음과 같은 유형의 애플리케이션 개발에서 가장 빛을 발한다.

 

- 분산 네트워크 서비스(Distributed networked services): 네트워크 애플리케이션의 핵심은 동시성이며 고의 기본 동시성 기능(주로 고루틴과 채널)은 이와 같은 작업에 잘 맞는다. 네트워킹, 분산 기능, 클라우드 서비스, 즉 API와 웹 서버, 웹 애플리케이션을 위한 최소한의 프레임워크 등을 위한 고 프로젝트가 많은 이유다.

 

- 클라우드 네이티브 개발(Cloud-native development): 고의 동시성 및 네트워킹 기능과 높은 이식성은 클라우드 네이티브 앱을 구축하는 데 적합하다. 실제로 고는 도커(Docker), 쿠버네티스(Kubernetes), 이스티오(Istio)를 포함한 여러 클라우드 네이티브 컴퓨팅의 기반을 구축하는 데 사용됐다.

 

- 기존 인프라 대체: 인터넷 인프라에 의존하는 소프트웨어의 대부분은 현재 노후화되고 익스플로잇이 넘쳐난다. 이런 소프트웨어를 고로 다시 작성하면 더 높은 메모리 안전성, 크로스 플랫폼 배포, 이후의 용이한 유지보수를 위한 정돈된 코드 베이스 등 많은 이점을 얻을 수 있다. 텔레포트(Teleport)라는 새로운 SSH 서버와 네트워크 타임 프로토콜의 새 버전은 고로 작성되어 기존 요소를 대체하고 있다.

 

- 유틸리티와 독립형 툴(Utilities and stand-alone tools): 고 프로그램은 최소한의 외부 종속성을 갖는 바이너리로 컴파일된다. 따라서 시작 속도가 빠르고, 간편히 패키징해서 재배포할 수 있으므로 유틸리티 및 기타 툴 제작에 적합하다.
 

 

고 언어의 제약
고의 고집스러운 여러 기능에 대해서는 칭찬과 비판이 공존한다. 고는 작고 이해하기 쉬운 언어라는 목표에 집착해서 설계된 언어이며 이를 위해 일부 특정 기능은 제외됐다. 그 결과 다른 언어에서 일반적인 몇몇 기능이 고에는 의도적으로 빠졌다.

 

이런 기능 가운데 하나는 함수가 많은 유형의 변수를 받을 수 있게 해주는 제네릭(generics)이다. 고에는 제네릭이 없고, 고 언어 개발진도 제네릭이 고 언어의 단순함에 반한다는 이유로 제네릭 추가에 반대하는 입장이다. 이 제약을 우회하는 방법은 있지만 많은 개발자들은 여전히 어느 방식으로든 고에 제네릭이 추가되기를 열망하고 있다. 고에 제네릭을 구현하기 위한 제안이 하나 나오긴 했지만 확실히 정해진 것은 없다.

 

고의 또 다른 단점은 생성된 바이너리의 크기다. 고 바이너리는 기본적으로 정적으로 컴파일되므로 런타임에 필요한 모든 요소가 바이너리 이미지에 포함된다. 덕분에 빌드 및 배포 프로세스가 간소화되지만 대신 64비트 윈도우에서 간단한 “Hello, world!”를 출력하는 바이너리의 크기도 1.5MB에 육박한다. 고 팀은 릴리스마다 바이너리의 크기를 줄이고 있다. 또한 압축, 또는 고의 디버그 정보 삭제를 통해 바이너리 크기를 줄이는 방법도 있다. 디버그 정보를 삭제하는 방법은 서비스 실패 시 디버그 정보를 유용하게 사용할 수 있는 클라우드 또는 네트워크 서비스보다는 독립형 배포 앱에 적합하다.

 

고의 장점 가운데 하나로 꼽히는 자동 메모리 관리 역시 가비지 수집을 위해 특정 양의 처리 오버헤드가 필요하므로 보기에 따라서는 단점이 될 수도 있다. 고는 수동 메모리 관리를 제공하지 않으며, 고의 가비지 수집은 엔터프라이즈 애플리케이션에서 발생하는 종류의 메모리 부하에 효과적으로 대처하지 못한다는 비판을 받아왔다. 고 1.8에서는 메모리 관리와 가비지 수집의 많은 부분이 개선되어 지연 시간이 줄어들었다. 물론 고 개발자는 C 확장 또는 서드파티 수동 메모리 관리 라이브러리를 통해 수동 메모리 할당을 이용할 수 있다.

 

데스크톱 애플리케이션의 GUI와 같은 다채로운 GUI를 고 애플리케이션에 적용하는 소프트웨어 문화가 여전히 빈약한 것도 단점이다.

 

대부분의 고 애플리케이션은 명령줄 툴 또는 네트워크 서비스다. 그래도 고 애플리케이션을 위한 풍부한 GUI를 구현하기 위한 다양한 프로젝트가 진행 중이다. GTK 및 GTK3 프레임워크를 위한 바인딩이 있고, 순수한 고로 작성되는 것이 아니라 C 바인딩에 의존하긴 하지만 플랫폼 네이티브 UI 제공을 목표로 개발 중인 프로젝트도 있다. 윈도우 사용자는 워크(walk)를 사용해볼 수 있다. 그러나 이 분야에서 확고한 주도권을 가진 프로젝트나 장기적으로 안정적인 프로젝트는 아직 없고, 구글의 크로스 플랫폼 GUI 라이브러리 구축 시도를 비롯한 일부 프로젝트는 흐지부지됐다. 또한 고는 근본적으로 플랫폼 독립적이므로 이러한 요소가 표준 패키지 세트의 일부가 될 가능성도 높지 않다.

 

고는 네이티브 시스템 함수와 통신할 수 있지만 커널 또는 장치 드라이버, 임베디드 시스템과 같은 저수준 시스템 구성 요소를 만드는 용도로는 설계되지 않았다. 결국 고 런타임과 고 애플리케이션용 가비지 수집기는 기반 OS에 의존한다(이러한 종류의 작업을 위한 첨단 언어에 관심이 있는 개발자라면 러스트(Rust) 언어를 살펴볼 만하다).
 

 

고 언어의 미래
고 개발의 향방은 개발자들의 요구 사항에 따라 결정될 가능성이 높다. 고의 주 개발진도 고집스러운 예시를 통해 이끌기보다는 개발자들의 의견을 더 많이 수용하는 쪽으로 바뀌고 있다. 즉, 제네릭과 같이 원래 설계에는 고려되지 않았던 기능이 추가될 가능성이 있다.

 

고 개발자들이 이러한 기능을 원한다는 점은 확실하다. 2018 고 사용자 설문을 보면, 개발자들은 고의 도입을 늘리기 위한 세 가지 핵심 과제로 제네릭과 더 나은 종속성 및 패키지 관리를 꼽았다. 제네릭을 위한 깃허브의 기존 제안은 고 2.x를 위한 제안으로 여전히 유효하다. 이와 같은 변화는 현재 자바와 자바스크립트, 파이썬이 주도하는 엔터프라이즈 개발에서 고의 역할을 확대하는 데 도움이 될 수 있다.

 

큰 변화가 없더라도 향후 인프라 재구축 프로젝트에서 앞서 언급한 SSH 및 NTP의 대안, 그리고 다중 언어 프로젝트의 일부로 고의 사용 빈도는 늘어날 전망이다.

 

고 툴체인의 서드파티 구현 역시 빠르게 확산됐다. 액티브스테이트의 액티브고(ActiveGo)는 상업적으로 지원되는 고 언어 에디션을 제공하며 LLVM과 gccgo 프로젝트는 대체 툴체인을 거쳐 자유롭게 라이선스가 부여되는 고의 오픈소스 구현을 제공한다.

 

마지막으로, 고는 완전히 새로운 언어 개발의 기반 역할도 했다. 다만 두 가지 모두 개발이 중단된 상태다. 하나는 헤브(Have) 언어다. 


헤브는 고 구문을 간소화하고 몇 가지 동일한 개념을 자체적인 방식으로 구현했으며 쉽게 실행할 수 있도록 고를 트랜스파일했다. 현재는 폐기된 또 다른 프로젝트는 오덴(Oden)이다. 오덴은 고의 어셈블러와 툴체인을 사용해서 리스프(Lisp), 하스켈(Haskell)과 같은 언어의 영향을 받은, 새로운 언어를 설계했다.

 

앞서 소개한 두 프로젝트는 IT 혁신이 진정한 혁명으로 이어지는 과정 중 하나를 잘 보여준다. 즉, 기존의 것을 해체해서 다른 목적에 맞게 개조하고 최초 고안자가 생각하지 못했던 용도를 찾는 것이다. 해킹 가능한 프로젝트로서 고 언어의 미래는 이제 막 시작됐다. 그러나 주요 프로그래밍 언어로서 고의 미래는 이미 확고하다. 클라우드에서 고의 속도와 간소함을 통해 장기적으로 유지 가능한 확장성 있는 인프라를 쉽게 개발할 수 있다.
 

 

※ 본 내용은 한국IDG(주)(http://www.itworld.co.kr)의 저작권 동의에 의해 공유되고 있습니다.
Copyright ⓒITWORLD. 무단전재 및 재배포 금지

[원문출처 : http://www.itworld.co.kr/howto/134027]

맨 위로
맨 위로