"최신 1.12부터 구버전까지"··· '구글 고' 버전별 특징 정리

InfoWorld
툴체인, 런타임, 라이브러리 구현이 변화된 구글 고(Go) 언어(고랭, Golang) 1.12 버전 베타가 공개됐다. 고 버전 1.12의 정식 출시는 2019년 2월로 예정돼 있다.

© Getty Images Bank
 

고 다운로드하기

고 프로젝트 사이트에서 고 정식 릴리스 버전을 다운로드할 수 있다. 컴파일러 툴체인에서 라이브 변수 분석 기능이 개선됐다. 이는 이전 릴리스에 비해 파이널라이저가 더 일찍 실행된다는 것을 의미할 수 있다. 문제가 된다면 개발자는 runtime.KeepAlive 호출을 추가하는 방법을 고려해야 한다. 가비지 수집기에는 드물게 충돌을 유발할 수 있는 알려진 문제점이 있다. 구글은 문제를 발견하면 보고해줄 것을 당부하고 있다. 문제 보고는 고 이슈 트래커에서 가능하다.
 
그 외에 고 1.12의 새로운 점과 변경된 점은 다음과 같다.

- GO111Module이 on으로 설정되면 go 명령은 모듈 디렉터리 외부의 모듈 인식 작업을 지원한다. 단, 이러한 작업이 현재 디렉토리의 상대 가져오기 경로를 확인하거나 mod 파일을 명시적으로 편집할 필요가 없는 경우에 한해서다.
- 모듈을 다운로드해서 추출하는 여러 go 명령을 안전하게 동시 호출할 수 있다. 모듈 캐시(GOPATH/pkg/mod)는 파일 잠금을 지원하는 파일 시스템에 위치해야 한다.
- 힙의 많은 부분이 살아있을 때 런타임의 스위핑 성능이 개선됐다. 이는 가비지 수집에 따르는 할당 지연을 줄여준다.
- 특히 기존 힙 공간을 재사용할 수 없는 대용량 할당에 대해 런타임이 OS에 더 공격적으로 메모리를 해제해 돌려준다. 리눅스의 경우 이제 런타임은 OS에서 메모리가 넉넉하지 않을 때만 OS에 메모리를 풀어준다.
- 코드의 경합 조건을 찾기 위한 고 경합 탐지기가 이제 리눅스 ARM64 아키텍처에서 지원된다.
- 빌드 캐시가 이제 $GOPATH/pkg를 제거하기 위한 단계로 필요하다. 환경 변수 GOCACHE=Off를 설정하면 캐시에 쓰는 go 명령은 실패하게 된다.
- 트레이스 툴이 실행 트레이스에 대한 교차 참조를 포함해서 변경자(mutator) 활용 곡선의 도식화를 지원한다. 가비지 수집기가 애플리케이션 지연 및 처리량에 미치는 영향을 분석할 때 유용하다.
- 코어 라이브러리에서 TLS(전송 계층 보안) 1.3을 위한 crypto/tls 패키지 지원이 추가된다.
- 버퍼링되는 I/O를 구현하는 bufio 패키지에서 리더의 UnreadRunE 및 UnreadByte 메소드는 Peek 이후에 호출되는 경우 오류를 반환한다.
 

고 1.12 베타 다운로드하기

프로젝트 웹사이트에서 고 1.12 베타를 다운로드하고 소스 및 라이브러리 배포판에 액세스할 수 있다. 현재 고 사용자는 go 명령을 사용하면 된다.

$ go get golang.org/dl/go1.12beta1
$ go1.12beta1 download

 

현재 버전: 고 1.11의 새로운 부분

2018년 8월에 출시된 고 1.11에는 웹어셈블리(WebAssembly) 바이너리 형식으로의 실험적 포트가 포함된다. 이 포트를 JS/Wasm이라고 한다. 웹어셈블리는 애플리케이션 성능 측면의 혜택 외에, 다른 언어를 위한 컴파일 타겟 역할을 하는 바이너리 형식을 제공해서 클라이언트와 서버 애플리케이션 모두 웹 배포가 가능하게 해준다.
 
고 1.11에는 관련된 고 패키지 모음인 모듈에 대한 예비적 지원이 추가됐다. 모듈은 빌드에 있는 소스 파일을 지정하기 위한 고패스(Gopath) 접근 방식을 대체한다. 모듈에서 버전 종속성 정보는 명시적이면서 가볍다. 문서에 따르면 빌드가 더 안정적이고 재현 가능성이 높다고 한다. 모듈 지원의 일부로 모듈을 인식하는 go get 명령이 추가됐다. 개발자는 모듈을 활용하려면 리포지토리를 GOPATH/src 외부의 디렉토리로 체크아웃하고 go.mod 파일을 만들고 이 파일 트리를 통해 go 명령을 실행해야 한다.
 
그 외에 고 1.11의 새로운 점은 다음과 같다.

- org/x/tools/go/packages 패키지가 소스 코드 패키지를 찾고 로드하기 위한 API를 제공한다. 아직 표준 라이브러리에는 포함되지 않지만 패키지는 사실상 모듈을 완전히 지원하지 못하는 API가 있는 go/build 패키지를 대체한다. 새로운 패키지는 벅(Buck), 바젤(Bazel)과 같은 빌드 툴과 모두 균등하게 잘 작동하는 분석 툴 개발을 가능하게 해준다.
- runtime/trace 패키지의 사용자 주석 API는 실행 트레이스의 애플리케이션 수준 정보를 기록하고 관련 고루틴 그룹을 생성할 수 있게 해준다. go tool trace 명령은 트레이스 뷰 및 새로운 사용자 작업/지역 분석 페이지에 이 정보를 시각화해 표시한다.
- 버전 1.11은 환경 변수 GOCACHE=off를 설정해서 빌드 캐시를 비활성화하도록 지원하는 마지막 릴리스다. 고 1.12에서 빌드 캐시는 $GOPATH/pkg를 삭제하기 위한 단계로서 필요하다.
- 컴파일러 툴 체인은 라인 지시문의 열 정보를 지원한다.
- 더 많은 컴파일러 툴 체인 함수가 기본적으로 인라이닝이 가능하다.
- 디버깅 시 컴파일러는 최적화된 바이너리를 위해 변수 위치 정보와 분기점 위치를 포함한 더 정확한 디버그 정보를 생성한다.
- go vet 명령은 분석 중인 패키지가 형식 확인을 하지 않을 때 치명적인 오류를 보고한다.
- 런타임은 희소 힙 레이아웃을 사용하므로 더 이상 고 힙의 크기에 제한이 없다.
- 오래된 플랫폼 지원 삭제를 포함한 표준 라이브러리의 소소한 변화
 
고 1.11 릴리스에는 맥OS 10.10 요세미티(Yosemite) 이상, 윈도우 7 이상 또는 오픈BSD 6.2 이상이 필요하다. 각 운영 체제의 이전 출시 버전에 대한 지원은 삭제됐다.
 

이전 버전: 구글 고 1.10의 새로운 기능

컴파일러 툴 체인과 성능 개선을 제공하지만 언어적으로 큰 변화는 없다. 2018년 2월에 출시된 고 1.10의 주요 특징은 다음과 같다.

- 지원되는 아키텍처 전반에서 컴파일러에 의해 생성되는 코드의 성능 개선
- 가비지 수집 속도 향상, 코드 생성 개선, 코어 라이브러리 최적화로 프로그램 실행 속도 소폭 향상
- 바이너리의 드워프 디버그 정보가 개선되어 이제 상수 값이 기록된다. 또한 라인 번호 정보가 더 정확하다.
- linux/ppc64le 포트의 경우 이제 cgo 명령을 사용해서 프로그램과의 외부 연결이 필요하다.
- go build 명령은 소스 파일의 내용, 지정된 빌드 플래그, 저장된 패키지의 메타데이터를 기반으로 날짜가 지난 패키지를 탐지한다. 수정 시간은 더 이상 의미가 없다.
- go install 명령은 명령줄에 나열된 패키지와 명령만 설치한다. 종속성 설치를 강제하려면 go install –i 플래그를 사용해야 한다.
- 메소드 표현에 적용되는 문법이 업데이트되면서 이제 구문에서 리시버로 형식 표현이 가능하게 됐다. 이미 이러한 방식으로 작동하는 컴파일러와 일치한다.
- 테스트 결과가 go test를 통해 캐시된다.
- 유니코드 패키지가 유니코드 9.0에서 버전 10.0으로 업그레이드되면서 비트코인 화폐 기호와 56개의 이모지를 포함한 8,518개의 문자가 추가됐다.
 
---------------------------------------------------------------
프로그래밍 인기기사
-> 개발자를 미치게 하는 10가지 프로그래밍 언어
-> 프로그래밍의 미래는? 9가지 예측
-> 21세기 개발자들을 괴롭히는 12가지 윤리적 딜레마
-> 상승가도 달리는 프로그래밍 언어 10선
-> '커피, 보석, 달 등에서 유래한' 프로그래밍 언어 이름 13
-> 개발자 경력에 '가산점' 될 6가지 새로운 언어
-> 프로그래머 생산성을 떨어뜨리는 15가지
-> 개발자들의 8가지 직업병, 혹시 당신도?
---------------------------------------------------------------
 

이전 버전: 구글 고 1.9의 새로운 기능

구글은 2017년 8월 고 1.9를 출시했다. 새로운 점과 개선된 점은 다음과 같다.

- 가비지 수집기의 속도 개선, 생성된 코드의 품질 향상, 코어 라이브러리 최적화로 프로그램 속도가 소폭 향상된다.
- math/bits 패키지가 비트 조작을 위한 최적화된 구현을 제공한다. 성능 개선을 위해 이 패키지의 함수는 컴파일러에서 내장(intrinsic) 함수로 취급된다.
- 고 1.9 컴파일러는 여러 프로세서 코어를 활용해서 패키지에 있는 함수의 병렬 컴파일을 지원한다. 이전 버전 go 명령에 있는 별도 패키지의 병렬 컴파일 지원은 고 1.9에서도 그대로 유지된다. 병렬 컴파일은 기본적으로 활성화되며 비활성화가 가능하다.
- 확장성을 위해 고 1.9에는 코드 복구를 위한 형식-별칭 선언 지원이 추가됐다. 고 언어의 변경된 부분으로, 형식 별칭은 패키지 사이에 형식을 이동하면서 점진적 코드 복구를 지원한다. 이전 이름을 참조하는 코드가 새 이름을 참조하는 코드와 상호운용이 가능하도록 패키지의 형식을 이동할 수 있으므로, 대규모 리팩터링 중 코드 복구에 도움이 될 것이다. 기본적으로 형식 별칭의 도입은 새 패키지와 기존 패키지에서 모두 API를 사용할 수 있는 전환 기간을 제공해서 이전 및 새 버전에 대한 참조의 상호운용성을 확보하는 역할을 한다.
- 고 1.9에 투명한 단순 시간(monotonic time) 지원이 추가됐다. 따라서 벽시계 조정이 있는 상태에서 두 Time 값 사이의 시간을 안전하게 계산할 수 있다.
- 고 1.9에서 호출 함수를 테스트 도우미 함수로 표시하는 새로운 메소드를 통해 테스트 도우미 기능이 개선됐다.
- 동기화 패키지의 새로운 형식이 분할상환 상수 시간 로드, 저장 및 삭제와의 동시 맵 역할을 한다. 따라서 여러 개의 go 루틴이 한 맵의 메소드를 동시에 호출할 수 있다. editor@itworld.co.kr