rein's world

Gccgo in GCC mainline

Go 프로그래밍 언어는 크게 두 종의 컴파일러를 가지고 있다. 하나는 gc라고 통칭해 부르는 플랫폼 별 8g, 6g, 5g, … 등의 컴파일러고, 다른 하나는 GCC의 프런트 엔드인 Gccgo 라는 컴파일러다. 이 두 개는 크게 몇 가지 차이를 갖고 있다.1

  • gccgo와 gc가 goroutine 을 다루는 방식이 상이하다. gccgo는 goroutine당 1개의 OS 수준 thread를 써야 한다 반대로 gc는 적정 수(runtime.GO_MAX_PROCS( ))의 OS 수준 스레드 위에 goroutine들을 multiplexing한다.
  • gccgo는 GCC에서 만드는 linkage들을 활용할 수 있다 – C 뿐만 아니라 C++링크도 가능하다; 반면에 gc는 cgo를 통한 C 언어 모듈들만 링크할 수 있다. 물론 이것도 linkage 핵을 잘 쓰면 C++이 될 것 같지만…
  • gccgo와 gcc는 서로 다른 백엔드를 쓴다. 이에 따라 런타임도 다르고(이거 때문에 언급한 첫 번째 차이가 생긴다), 컴파일러가 최적화 해주는 수준이 다르다. GCC를 백엔드로 쓰는 gccgo가 최적화가 더 잘 이루어지지만, goroutine관련해서는 gc가 더 나은 구현을 하기 때문에, 응용에 따라 성능이 더 잘 나오는 쪽이 다르다.

Ian Lance Taylor의 블로그 포스팅(Gccgo in GCC)을 보고 확인해보니, 이 중 Gccgo가 드디어 GCC mainline에 포함되었다 – trunk 에서 gcc.c 등에 해당 스텁이 추가된 상태다. 다음은 해당 commit log,

r167407 | ian | 2010-12-03 13:34:57 +0900 (2010-12-03, 금) | 22 개의 행

Add Go frontend, libgo library, and Go testsuite.

gcc/: * gcc.c (default_compilers): Add entry for “.go”. * common.opt: Add -static-libgo as a driver option. * doc/install.texi (Configuration): Mention libgo as an option for –enable-shared. Mention go as an option for –enable-languages. * doc/invoke.texi (Overall Options): Mention .go as a file name suffix. Mention go as a -x option. * doc/frontends.texi (G++ and GCC): Mention Go as a supported language. * doc/sourcebuild.texi (Top Level): Mention libgo. * doc/standards.texi (Standards): Add section on Go language. Move references for other languages into their own section. * doc/contrib.texi (Contributors): Mention that I contributed the Go frontend. gcc/testsuite/: * lib/go.exp: New file. * lib/go-dg.exp: New file. * lib/go-torture.exp: New file. * lib/target-supports.exp (check_compile): Match // Go.

이제 다음 GCC release (4.6; 내년 초 예정) 가 설치된 시스템에서는 – 일단 GNU/linux 한정; 가능한 아키텍처는 정확히 모르겠지만? – go 프로그래밍 언어를 그냥 사용할 수 있을 듯. go 소스 트리 hg로 받아다가, 빌드하고, 사용하는 환경에 비하면야 훨씬 더 많은 수의 프로그래머들이 새 언어를 접해보고, 시험해 볼 기회를 갖게 될 듯 하다 – 더불어, 많은 수의 프로그래머가 사용하는 환경만 갖춰지면, 더 많은 기여가 이루어질 듯 하니 이 쪽이 더 좋은(?) 일인 듯 하다..

그런 점에서 내년 초가 기대 된다. 안 그래도 GCC 4.6에는 C++ 0x의 range 기반 for 문과 nullptr가 추가된단 말이다(…).


  1. Do Go programs link with C/C++ programs? Gccgo in GCC , 그리고 이 블로그의 예전 Go 관련 포스팅을 참조 및 요약. ↩︎