Go


만약 바둑의 영문명인 Go를 찾아오셨다면 여기로.

The Go Programming Language
frontpage.png
최초 개발자로버트 그리즈머, 롭 파이크, 켄 톰슨
운영 및 개발구글
공식 사이트[1]
라이센스BSD 라이센스
최신 버전1.7 (2016.8.15)

1 내용

구글이 2009년에 만든 프로그래밍 언어. 로버트 그리즈머, 롭 파이크, 켄 톰슨에 의해 디자인되었다.[1][2] 이름이 이름인만큼, 검색이 불편한 경우가 제법 있다. 그래서인지 보통 golang으로도 많이들 이야기한다.

Go 언어의 사용자들은 고퍼(Gopher)라고 부르며, 고퍼들을 위한 연례행사인 고퍼콘(Gophercon)이 세계 각국에서 매년 열리고 있다.

2016년 8월 현재 최신 버전은 1.7이다. 2009년 11월에 첫 선을 보인 이래, 2014년 12월에 1.4 버전이 나온 데 이어 2015년 8월에 1.5 버전이 나왔다. 1.5 버전에서는 드디어 Go 컴파일러가 Go로 작성되었다.[3] 그 이전까지는 C언어로 작성. 자기 자신으로 구현된 컴파일러가 생겼다는 것은 개발 속도에 상당한 가속이 붙게 되었다는 의미가 될 수 있다.[4] 2016년 2월 중순에는 HTTP/2가 기본으로 지원되고 템플릿 문법의 개선 등이 이루어진 1.6 버전이 릴리즈되었고, 8월에는 컴파일 속도의 개선, 실행 퍼포먼스 향상, /x/net/context 패키지의 기본 패키지화 등이 이루어진 1.7 버전이 릴리즈되었다. 여전히 1.4 버전에 비해 컴파일 속도는 느리다

전반적으로 C에서 영향을 많이 받았으며, 나온 지 5년 동안은 구글에 취직이라도 하지 않는 이상[5] 배워봤자 딱히 쓸 데가 없다는 이유로 새로운 언어에 관심이 많은 덕후얼리어답터 개발자들 사이에서나 알음알음 쓰여지던 정도였지만, 다름아닌 구글이 만든 것이기도 하고, 언어 자체가 가진 매력도 있어서 사용자 층이 점차 늘어나는 추세다. 특히 Go 언어를 이용해서 안드로이드iOS 앱을 제작할 수 있게 적용 중이다.[6] 또한 Python이 그렇듯 웹 개발에도 쓰이고 있고[7] 특히 서버 사이드 언어로서 좋은 평가를 받고 있다. 또한, Go가 자체적으로 지원하는 라이브러리만으로도 간결하게 웹사이트를 만들어낼 수 있다.[8]

묘하게도 Go 언어는 중국에서 상대적으로 인기가 제법 있는 편이다.[9][10]

Go 언어의 특징은 컴파일 언어이지만 컴파일러의 컴파일 속도가 매우 빨라 인터프리터 언어처럼 쓸 수 있다는 점에 있다.[11] 이는 언어의 문법 구조를 개선함으로써 달성하였다. 컴파일러가 소스 코드를 해석하는 pass 수를 줄여서 달성한 것으로 보인다. 접근하기 어렵지 않고, 코드 역시 간결하면서도 컴파일 언어답게 높은 성능을 낼 수 있다는 점이 호평을 받는다. 자료형 체계에 있어 정적 타입(static type) 검사가 이루어지는만큼, Python 등에 익숙해져 있다가 넘어올 경우 조금 애로사항이 꽃필 수 있다. 간결하게 코드를 작성할 수 있으면서도 풍부한 라이브러리 등의 덕택에 막강한 기능을 쉽게 구현할 수 있다는 것은 큰 장점이다.

그러나 컴파일 언어의 태생적인 한계를 극복한 것은 아니라서 대형 모듈을 이것저것 붙이면 컴파일에 필요한 시간이 있기에 Python 등의 인터프리터 언어보다는 기동할 때에 확실히 반응이 늦다. 물론 컴파일 언어 중에서는 매우 빠른 편이지만 아무래도 인터프리터 언어의 즉응성까지 바라는 건 무리. 물론 컴파일 언어인만큼 실행 시 퍼포먼스는 확실하다.

또한 Go는 GoRoutine이라는 비동기 메커니즘을 제공한다. 이 비동기 메커니즘은 Erlang에서 영향을 받은 것으로 각각의 고루틴은 병렬로 동작하며 메시지 채널을 통해 값을 주고받는다. 고루틴을 사용하면 이벤트 처리, 병렬 프로그래밍 등이 간단해진다. 단 병렬화된 고루틴의 동기화 문제는 프로그래머가 챙겨 줘야 하며 동기화를 무시할 경우 프로그램이 비정상 종료할 수도 있다. 예를 들어 부모 루틴이 자식 루틴보다 먼저 끝나버리면 자식 루틴은 OS에 의해 메모리에서 강제로 사출되어 버린다. 단 동기화 방법은 기존 멀티스레드 응용프로그램에 비해 매우 간단한 편. 단순히 고루틴으로부터 반환값을 받는 줄을 메인 스레드에 추가하면 된다.

고루틴은 멀티스레드 메커니즘이지만 자체적인 스케줄러에 의해 관리되는 경량 스레드이며 OS에서 관리하는 경량스레드보다 더 경량이다. 따라서 고루틴은 CPU 코어수와 무관하게 수백 수천만 고루틴을 작성해도 성능에 문제가 생기지 않는다. 이는 Erlang도 마찬가지.

다만 컴파일 언어이므로 바이너리만 배포할 경우 해당 타깃 머신에 맞춰서 컴파일해야 한다. 바이트코드를 생성하는 방식이 아니므로 다중 플랫폼을 지원하려면 소스코드 째로 배포해야 한다.

2015년 현재 구글은 자바 가상머신 관련 문제로 오라클매우 귀찮은 일을 치르고 있기 때문에 Go가 본 궤도에 오르면 어느 쪽을 더 밀어줄지가 뻔히 보이는지라 어쩌면 애플Objective-C처럼 Swift처럼 구글 하나만 믿고서라도 배워야 하는 언어가 될 지도 모른다.[12] 아직까지는 사용자 수가 적은 신생 언어 정도의 입지를 벗어나지는 못했으나[13] 장래성이 밝은 언어 정도로 요약할 수 있을 듯. 사족으로 구글이 자바를 대신할 안드로이드 주사용언어로 Swift를 고려하고있다는 소식이 떴다. 코틀린도 고려하고 있으나 컴파일이 느리다고...[14]

2 코드 예시

<syntaxhighlight lang="go" line="1">
package main

import "fmt"

func main() {
fmt.Println("Hello, World")
}
</syntaxhighlight>

  • printf함수를 사용하려면

<syntaxhighlight lang="go" line="1">
package main

import "fmt"

func main() {
i := 3j := 9fmt.Printf("Hello World! %d %d\n", i, j);
}
</syntaxhighlight>

3 사용한 사례

컨테이너 기반 가상화 도구인 Docker를 작성하는데 사용된 언어로 유명하다.

그리고 전부를 Go로 만든 것은 아니지만, 당연히 구글을 비롯해[15] 드랍박스클라우드플레어[16], 사운드클라우드, 넷플릭스 등에서도 기존의 기능들 중 상당수를 새롭게 Go를 이용해 바꿨다고 한다. 트위치 TV도 많은 부분이 Go로 작성되었다고 하며, 언론사인 뉴욕 타임즈에서도 Gizmo라는 API 백엔드 서비스를 Go를 이용해 만들어 그 소스를 깃허브에 공개한 바 있고, SpaceX에서도 원격 측정 프로그램에서 Go를 사용한다고 한다.

4 참고

컴파일 언어인 덕분에, 속도가 느린 스크립트 언어에서 연산 퍼포먼스가 필요한 부분을 Go로 대체해 넣을 수도 있다. 예를 들면, Go로 만든 코드를 공유 라이브러리로 컴파일해 Ruby에서 FFI를 이용해 컴파일한 .so 파일을 가져와 사용하는 식. PHP에서도 역시 가능하다.[17] 다만 기본 패키지들 중에서는 성능보다는 편의성에 초점을 맞춘 탓에 극한의 성능을 추구하는 경우라면 사용을 권하기 어려운 것들이 있다. 예를 들면 웹 서버 제작시에 쓰이는 net/http나 html/template 등이 그러한데, 이런 경우엔 기본 패키지를 대체하는 별도의 패키지를 이용하면 (실제 체감효과는 별론으로 하되 벤치마크상으로는 심지어 수십 배나 수치가 좋아지는(...) 경우도 있다.[18]

Go 언어의 설계 지향점이 시스템 프로그래밍 언어이었으나, 가비지 컬렉션의 지원이나 제네릭의 부재로 인해 불필요하게 많이 사용되는 박싱/언박싱 등으로 인해 C/C++을 대체할 수 있는 언어는 아니라는 것에 합의가 이루어지고 있는 상황이다. 실제로 고성능 연산에 사용하기에는 C/C++에 비해 너무 느리며, 저수준 시스템 개발에서는 가비지 컬렉션과 고루틴을 지원하기 위한 무거운 런타임 등으로 인해 사용이 불가능에 가깝다. 그런 이유로 대체로 개발 속도와 실행 속도, 병행성 사이의 적정 지점이 필요한 서버 애플리케이션 개발 등에 많이 사용되는 편. 이전 버젼에서는 저수준 시스템 프로그래밍에서도 C/C++보다 낫다는 식의 서술이 있었으나, 이는 go를 개발하던 당시 개발진의 목표였을 뿐 이를 실제로 달성했다고 보는 사람은 드믈다.

5 여담

net 패키지에서 net.go를 열어보면, aLongTimeAgo라는 유닉스 시간 233431200의 값을 가지는 변수가 들어 있다. 오래 전의 시각을 미리 설정해 둔 것.[19]

겨울왕국Write in Go Let It Go(겨울왕국)를 패러디한 아래와 같은 노래도 있다.

번역:

The schedule's tight on the cluster tonight
스케줄로 뒤덮인 오늘 밤
So I parallelized my code
코드를 병렬화 하고 있어
All those threads and continuations
모든 스레드와 연속들
My head's going to explode
머리 터질 것만 같아
And all that boilerplate
이 모든 상용구[20]
That FactoryBuilderAdapterDelegateImpl
'FactoryBuilderAdapterDelegateImpl'
Seems unjustified
영 아닌 것 같아
Give me something simple
좀 간단한 걸 줘

Don't write in Scheme
스킴 쓰지 마
Don't write in C
C로 짜지 마
No more pointers that I forget to free() 스마트 포인터라면?
해제해줄 포인터도 이제 그만
Java's verbose, Python's too slow
Java는 너무 길고, 파이썬은 느려
It's time you know
이젠 알거야

Write in Go! Write in Go!
Go로 짜, Go로 짜!
No inheritance anymore
이젠 상속은 일없어
Write in Go! Write in Go!
Go로 짜, Go로 짜!
There's no do or while, just for
do도 while도 없어, for뿐
I don't care what your linters say
괜찮아, lint[21]가 뭐라 해도
I've got tools for that
내겐 툴이 있어
The code never bothered me anyway
코드 따윈 두렵지 않다네
  1. 데니스 리치와 함께 유닉스 운영체제, C언어를 만드신 그 분 맞다(1943년생). 2007년 경에 이들 세 사람이 새로운 언어에 대한 스케치를 하면서 프로젝트가 시작되었다고 한다.
  2. 지금도 패키지에 무엇을 포함할지는 이 세 사람이 만장일치로 합의해야 이뤄진다고 한다.
  3. 다만 이 때부터 컴파일에 걸리는 속도가 약간 떨어졌다는 불평을 흔히 찾아볼 수 있다. 벤치마크 자료들에 따르면 1.4.3 버전이 1.5나 1.6 버전보다 컴파일에 걸리는 시간이 2~3배씩이나 빠르다는 것들도 흔히 보인다. 2016년 8월에 배포될 1.7 버전에서 이 문제는 어느 정도 개선될 것으로 보인다. 사전 공개된 1.7 베타 버전에서는 컴파일 속도가 1.6.2 버전에 비해 3분의 2 이하로 줄어들었다는 벤치마크 자료들이 보인다.
  4. 부트스트래핑(Bootstrapping)
  5. 구글 내부에서는 이걸 시스템 프로그램용으로 일부 사용하고 있다고 한다.
  6. [2]
  7. 프레임워크를 찾자면, Godoc.org나 깃허브 스타 기준으로 Gin, Beego 등의 웹 개발 프레임워크들이 인기있는 편이고 Martini는 한국어 안내도 있다.
  8. 굳이 풀 스택 프레임워크 등을 사용할 필요가 없다는 것이 중론. net/http 등에서 제공하는 자체 기능만으로도 간단히 웹사이트를 만들 수 있기 때문이기도 하고, 프레임워크를 쓰지 않고 [3] 같은 최소한의 툴만을 사용하는 게 선호되는 편이다. golang-nuts나 레딧에서 웹 개발 프레임워크 관련글이 나오면 으레 달리는 댓글이 "프레임워크 왜 쓰냐?"일 정도.
  9. [4] [5]
  10. 그런데 정작 중국에서 golang.org는 황금방패 혹은 만리장성으로 불리우는 중국 정부의 방화벽에 차단을 먹었다(...). 어쨌거나 이 또한 구글의 서비스이기 때문. 따라서 golang.org에 속한 패키지들을 get할 수가 없는 문제가 있다. 덕분에 중국의 Gopher들은 VPN 등 우회망을 쓰든지, golang.org가 아닌 github.com의 패키지로 대체하는 방법을 쓴다고. 중국 정부와 구글의 사이가 개선된다면 차단이 해제될 것이다.
  11. 사실 C++의 컴파일 속도가 복잡한 문법으로 인해 매우 느린 것이다.
  12. 흔히 하는 잘못된 생각이다. 상술했듯 C언어에서 많은 영향을 받은 흔적이 있으며, 그런 만큼 Go의 철학도 어플리케이션 레벨의 개발을 주 타겟으로 삼고 있지 않다.
  13. 2015년 12월 현재 github.com 리포지터리 수 기준으로 14위. 2009년에 나온 언어라는 것을 생각하면 좋은 성적(?)이기는 하다.
  14. 안드로이드 주 사용언어로 Swift를 고려하고 있다는 소식은 떡밥일 가능성이 상당한 게, 당장 애플과 안드로이드에서 주 사용언어를 동일한 언어로 사용하게 될 경우 앱 성능이나 퍼포먼스 가지고 비교질 당할게 뻔하다.(자기 제품에 개발환경을 미친듯이 최적화하는 애플 특성을 생각하면...) 이런걸 예상한다면 구글이 애플과 같은 언어를 사용하는 것은 부담스러울 수 있다. 물론 IBM이나 마이크로소프트 등 타 기업도 이미 스위프트와 관련한 유의미한 결과물을 만드는 만큼 섣부른 확신은 금물. 정말 채택할지도 모른다!
  15. 구글의 파일 다운로드 서버인 dl.google.com도 Go로 되어 있는데, 덕분에 간혹 해외 커뮤니티에서는 기본 net/http 패키지의 성능에 대해 의문을 표하면 dl.google.com조차 기본 패키지로 잘만 쓰는데 뭐라고? 같은 반응이 나타나기도 한다.
  16. Go 기본 패키지 중 crypto 관련 처리 속도가 클라우드플레어 정도의 대형 서비스가 쓰기에는 최적화되지 않은 면이 있어 자체적으로 이 부분을 개선한 것을 배포하고 있기도 하다. (1.4 버전 기준)
  17. 그 역도 역시 가능하다. PHP를 예로 들면, libphp5.so를 이용해 Go에서 PHP 코드를 불러와 실행하는 식이다.
  18. 예를 들어 html/template의 경우 성능 저하의 주범으로 여겨지는 reflect를 사용해서 템플릿을 생성할 때 (코드 작성자 입장에서는 할 일이 줄어서 편리하지만) 자동으로 모두 이스케이프 처리를 해서 렌더링을 하므로 속도가 느려지게 된다. 당연하지만 이런 대체 패키지들을 쓰게 되면 대신 코드 작성은 조금 귀찮아지게 되고, 또한 기본 패키지의 문법이 호환되지 않는 경우도 잦다. 다만, 실제 서비스를 구성할 때에는 통상적으로 템플릿 캐싱을 추가할 것이므로 느린 파싱 속도는 사실 문제가 되지 않는다. net/http의 경우에도 Nginx 못지 않은 성능을 보여주는 대체 패키지가 존재한다. 이런 물건들을 사용한 몇몇 프레임워크들은 유독 벤치마크 그래프가 하늘을 뚫을 기세로 눈에 띈다(...).
  19. 스타워즈 4가 A long time ago, in a galaxy far, far away....라는 스타워즈 시리즈의 전통의 오프닝과 함께 미국에서 개봉된 시각이다.
  20. 상용구 코드 참고
  21. Lint 참고