2021.06.15

고 언어 1.17 베타 버전 출시··· 코드 단순화 및 컴파일러 향상에 초점

Paul Krill | InfoWorld
구글이 개발한 오픈소스 프로그래밍 언어 고(G)의 차기 릴리스인 고 1.17이 베타 버전으로 출시됐다. 보안을 위해 코드를 단순화하고, 함수 인수(function argument) 전달에 초점을 맞추는 등의 변화가 이뤄졌다.
 
ⓒGo

지난 10일 출시된 이번 베타 버전의 프로덕션 릴리스는 8월로 예정돼 있다. 릴리스 노트에 따르면 고 언어에 3가지의 작은 개선이 있을 예정이다. 코드 작성을 단순화해 unsafe.Pointer안전 규칙에 순응할 수 있도록 하기 위함이다. 주요 개선점은 다음과 같다.
 
  • 타입 [ ]Ts 표현 방식이 배열 포인터인 타입 *[N]T로 전환된다. 만약 그러한 전환의 결과가 a라면, 범위 내의 상응 인덱스가 동일한 기저 요소를 참조한다: &a[i] == &s[i] for 0 <= i < Nif len(s)N보다 적을 경우, 이 전환에 패닉(panic)이 이뤄진다.
     
  • unsafe.Add: unsafe.Add(ptr, len)lenptr에 추가하고 업데이트된 포인터인 unsafe.Pointer(uintptr(ptr) + uintptr(len))를 돌려보낸다. 
     
  • unsafe.Slice: 타입 *T의 ptr 표현의 경우, unsafe.Slice(ptr, len)는 타입 []T의 슬라이스를 돌려보낸다. 타입 []T의 기저 어레이는 ptr에서 시작되며 그것의 길이와 용량은 len이다. 

고 1.17은 스택보다는 레지스터를 사용해 함수 인수와 결과를 전달하는 새 방식을 도입한다. 64비트 x86 아키텍처 기반 리눅스, 맥OS, 윈도우에서 적용된다. 벤치마킹 결과, 약 5%의 성능 향상과 약 2%의 바이너리 사이즈 감소가 이뤄졌다고 구글은 밝혔다. 이 변경사항은 고 코드의 기능성에는 영향을 미치지 않지만, 호환성 가이드라인 외부의 코드에는 미미한 영향을 미칠 수 있다.

또한 컴파일러를 사용하면, 클로저가 들어있는 함수들이 인라인(inline)될 수 있다. 이로써 클로저를 갖춘 함수가 인라인된 각 위치에 대해 별개의 클로저 함수를 생성하는 효과를 낼 수 있다. 이러한 변화 덕분에 고의 함수가 포인터 값에 의해 잘못 비교되는 버그를 발견할 수 있게 된다. 고 함수는 원래 비교가 불가능하다. 

한편 한 모듈이 go.mod 파일에서 고 1.17 이상을 지정한다면, 모듈의 전이적 요구사항(transitive requirements)이 느슨하게 로드된다. 관련 없는 다른 종속성에 대해 go.mod 파일을 다운로드하거나 읽을 필요가 없다. 그리고 고 1.17에서는 As, IsUnwrap 방법에 대해 새로운 경고가 제공된다. 한편, 커버 툴은 이제 golang.org.x.tools/cover의 최적화된 파서를 사용한다. 이 파서는 대규모 파일을 파싱할 때 훨씬 속도가 빠를 수 있다. 라이브러리에도 약간의 변경사항이 있다. 

고 1.17 베타에 대한 바이너리 및 소스 배포 파일은 golang.org에서 다운로드할 수 있다. 고를 이미 설치해둔 사용자는 다음의 고 명령을 사용하여 베타 버전에 액세스할 수 있다. 

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

지난 2월에 출시됐던 고 1.16 버전은 라이브러리와 런타임 개선을 특징으로 한다. 현재의 스테이블 릴리스에는 고 1.16.5와 1.15.13가 포함된다. 고 개발자를 위한 소소한 기능들도 추후 릴리스에 도입될 예정이다. ciokr@idg.co.kr



2021.06.15

고 언어 1.17 베타 버전 출시··· 코드 단순화 및 컴파일러 향상에 초점

Paul Krill | InfoWorld
구글이 개발한 오픈소스 프로그래밍 언어 고(G)의 차기 릴리스인 고 1.17이 베타 버전으로 출시됐다. 보안을 위해 코드를 단순화하고, 함수 인수(function argument) 전달에 초점을 맞추는 등의 변화가 이뤄졌다.
 
ⓒGo

지난 10일 출시된 이번 베타 버전의 프로덕션 릴리스는 8월로 예정돼 있다. 릴리스 노트에 따르면 고 언어에 3가지의 작은 개선이 있을 예정이다. 코드 작성을 단순화해 unsafe.Pointer안전 규칙에 순응할 수 있도록 하기 위함이다. 주요 개선점은 다음과 같다.
 
  • 타입 [ ]Ts 표현 방식이 배열 포인터인 타입 *[N]T로 전환된다. 만약 그러한 전환의 결과가 a라면, 범위 내의 상응 인덱스가 동일한 기저 요소를 참조한다: &a[i] == &s[i] for 0 <= i < Nif len(s)N보다 적을 경우, 이 전환에 패닉(panic)이 이뤄진다.
     
  • unsafe.Add: unsafe.Add(ptr, len)lenptr에 추가하고 업데이트된 포인터인 unsafe.Pointer(uintptr(ptr) + uintptr(len))를 돌려보낸다. 
     
  • unsafe.Slice: 타입 *T의 ptr 표현의 경우, unsafe.Slice(ptr, len)는 타입 []T의 슬라이스를 돌려보낸다. 타입 []T의 기저 어레이는 ptr에서 시작되며 그것의 길이와 용량은 len이다. 

고 1.17은 스택보다는 레지스터를 사용해 함수 인수와 결과를 전달하는 새 방식을 도입한다. 64비트 x86 아키텍처 기반 리눅스, 맥OS, 윈도우에서 적용된다. 벤치마킹 결과, 약 5%의 성능 향상과 약 2%의 바이너리 사이즈 감소가 이뤄졌다고 구글은 밝혔다. 이 변경사항은 고 코드의 기능성에는 영향을 미치지 않지만, 호환성 가이드라인 외부의 코드에는 미미한 영향을 미칠 수 있다.

또한 컴파일러를 사용하면, 클로저가 들어있는 함수들이 인라인(inline)될 수 있다. 이로써 클로저를 갖춘 함수가 인라인된 각 위치에 대해 별개의 클로저 함수를 생성하는 효과를 낼 수 있다. 이러한 변화 덕분에 고의 함수가 포인터 값에 의해 잘못 비교되는 버그를 발견할 수 있게 된다. 고 함수는 원래 비교가 불가능하다. 

한편 한 모듈이 go.mod 파일에서 고 1.17 이상을 지정한다면, 모듈의 전이적 요구사항(transitive requirements)이 느슨하게 로드된다. 관련 없는 다른 종속성에 대해 go.mod 파일을 다운로드하거나 읽을 필요가 없다. 그리고 고 1.17에서는 As, IsUnwrap 방법에 대해 새로운 경고가 제공된다. 한편, 커버 툴은 이제 golang.org.x.tools/cover의 최적화된 파서를 사용한다. 이 파서는 대규모 파일을 파싱할 때 훨씬 속도가 빠를 수 있다. 라이브러리에도 약간의 변경사항이 있다. 

고 1.17 베타에 대한 바이너리 및 소스 배포 파일은 golang.org에서 다운로드할 수 있다. 고를 이미 설치해둔 사용자는 다음의 고 명령을 사용하여 베타 버전에 액세스할 수 있다. 

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

지난 2월에 출시됐던 고 1.16 버전은 라이브러리와 런타임 개선을 특징으로 한다. 현재의 스테이블 릴리스에는 고 1.16.5와 1.15.13가 포함된다. 고 개발자를 위한 소소한 기능들도 추후 릴리스에 도입될 예정이다. ciokr@idg.co.kr

X