Meandering Trajectory

Go 패키지의 정체 본문

컴퓨터/GoLang

Go 패키지의 정체

latentis 2017. 6. 29. 22:45

Go의 마스코트 Gopher

C는 몇몇 스크립팅 언어를 제외하면 프로그래머가 된 이후로 내가 사실상 유일하게 사용[각주:1]했던 언어다. 최근에 프로그래머로서의 삶을 시작했던 회사를 떠나게 됐다. 이직한 회사는 전혀 C를 사용하지 않는 회사다.

이직한 회사의 주요 개발 언어는 Go다. Go는 구글에서 개발한 언어로 이 언어가 지원하는 독특한 동시성 프로그래밍 기능인 고루틴 외에 유닉스의 아버지 켄 탐슨(Ken Thomson)과 벨연구소의 유닉스 개발팀의 일원인었던 랍 파이크(Rob Pike)가 직접 개발에 참여한 것으로 잘 알려져 있다.

일을 하려면 배워야 하니 리눅스에서 Go로 이것저것을 해 보다가 특이한 점을 발견했다.  빌드된 실행파일에 C 라이브러리(libc)나 POSIX 스레드 라이브러리(libpthred)와 같은 필수적인 것 이외에 링크된 다른 공유 라이브러리(shared library)가 없었다.

이것은 import한 패키지들이 전부 실행파일 안에 들어있다는 것을 의미했다. 그래서 난  Go 패키지의 정체에 대해 조사했다. 그 정체는 바로 다름아닌 정적 라이브러리[각주:2] 파일.

Go에서 import한 패키지는 정적 라이브러리에 포함되어 있었다. 이 얘기는 Go 패키지에서 사용된 패키지 내에 의존성을 갖는 모든 오브젝트 파일이 실행파일에 포함된다는 것을 의미한다. 예를들어 리눅스에서 io 패키지는 GOROOT 딕렉토리 내에 패키지 파일들을 모아둔 디렉토리에 다음과 같은 이름의 파일로 존재한다.

libio.a

그래서 Go로 만든 어지간한 규모의 프로그램의 실행파일은 크기가 메가바이트 단위를 훌쩍넘는다.


  1. 여기서 사용했다 함은 대량의 코드를 작성해본 경험이 있음을 말한다. [본문으로]
  2. 단순히 설명하자면 공유 라이브러리에 있는 함수를 호출하는 실행파일은 해당 함수의 코드를 실행파일에 직접 포함하는 대신 일종의 바로가기 정보만 포함한다. 따라서 실행파일의 크기가 작아진다는 장점이 있다. 반면 정적 라이브러리를 사용하여 빌드된 실행파일은 필요한 코드를 전부 실행파일에 포함하게 된다. 그래서 동적으로 빌드된 실행파일에 비해 크기가 크다. [본문으로]

'컴퓨터 > GoLang' 카테고리의 다른 글

Go 채널  (0) 2017.08.09
Go: 리플렉션 #2  (0) 2017.07.16
Go: 리플렉션 #1  (0) 2017.07.15
Go 언어 - 벤치마크  (0) 2017.07.08
Go 언어: 환경변수 설정  (0) 2017.05.08
Comments