rein's world

팀 세미나: Go Programming Language #1

팀에서 매 주 한 번씩, (회사 일 이외에) 자기가 관심 갖는 주제에 대해 발표하는 시간을 가지고 있다.

나는 이 시간에 Google 에서 만드는 오픈 소스 프로그래밍 언어인 Go 에 대해 하기로 했다. 요즘 심심풀이로 만지는 언어가 Go라서…

여기 그 때 썼던 자료를 게시한다. export를 잘못했는지 슬라이드 노트들은 없다.

Introduction to Go Programming Language

사용한지 기껏해야 한달 좀 넘었지만, 기본적인 구조는 C를 따르고, 여기에 몇 가지 제약을 가하고 기본 타입과 concurrency primitive 를 더해서,1 Erlang 비슷한 언어가 되었다는 느낌.

그래서 이런 느낌을 가지고 Go 가 가지는 강점과 약점이라고 생각되는걸 간단히 요약하자면,

  • 굉장히 빠른 시스템 빌드 시간 – 대부분의 의존성(type, import,…)을 명시적으로 해결하기 때문에 빌드가 정말 빠르다
  • 간단하고 어느 정도 duck-typing이 돼서 조작하기 쉽다
  • 메시지 패싱에 기반하는 병행/병렬 프로그래밍에 특화되어 있다 – Erlang 과 유사함
  • C 와 달리 내장 타입이 좀 더 다양하다
  • UTF-8 내장 + range() 문을 사용하면 문자열을 byte 단위와 문자 단위(variable-length)로 모두 순회하기 쉽다
  • 문자열은 상수고, 배열도 그냥 복사된다. 이건 Erlang 에 대해 내가 쓴 글에서도 말했듯이, 변하지 않는 데이터가 병렬성에선 정말 중요하다.2

단점도 몇 가지,

  • 아직 툴 체인이 완성되지 않았다 – gccgo(gcc를 백엔드로 씀), 8g(x86 용), 6g(x64 용), 5g(arm 용) 등이 따로 논다. 특히 전자와 뒤의 3가지는 정말 따로 놈. 내장 기능의 수행방식도 약간 다른 수준이라.
  • 라이브러리가 아직 정말 빈약하다
  • 툴 체인이 완성되지 않았다?랑 비슷한 얘기지만, 아직 충분히 최적화된 코드가 아닌 느낌. 몇몇 벤치 마크 결과가 그리 좋지 않다. (Java 보다도 느리다니…)

뭐 그래도 Erlang 보다는 많은 수의 (예비) 프로그래머가 있으니(C/C++/Java) 상대적으로 병렬 프로그래밍 작성할 때 쓰기엔 나은 듯도 하다. 다만 얼마나 빨리 성숙한 상태에 도달하느냐가 문제지만;


  1. GC도 제약이라면 제약이지만 추가사항으로 치자. ↩︎

  2. 배열을 복사하지 않고, 배열 전체 혹은 일부를 참조하는 slice란 문법을 지원한다. ↩︎