2017년 9월 2일 토요일

golang 1.9 업데이트

golang 1.9

golang 1.9 release news

소개

최신 Go 버전 1.9 버전은 Go 1.8 이후 6 개월 후에 출시되고, Go 1.x 시리즈에서 10 번째 릴리스입니다. 언어에는 두 가지 변경 사항이 있습니다.
type alias에 대한 지원 추가 및 구현이 부동 소수점 연산을 통합 할 수 있는 시점 정의하는 부분입니다. 대부분의 변경 사항은 toolchain, runtime 및 라이브러리의 구현에 있습니다. 언제나 그렇듯이 이 릴리스는 Go 1 호환성을 유지합니다. 거의 모든 Go 프로그램이 이전처럼 계속해서 컴파일되고 실행될 것입니다.

이 릴리스에서는 명쾌한 단조로운 시간 지원 기능을 추가하고, 패키지 내의 기능 컴파일을 병렬화하며 test helper 기능을 보다 잘 지원하고 새로운 비트 조작 패키지를 포함하며, 새로운 동시 map type을 제공합니다.

오늘 brew update를 했더니 golang이 업그레이드가 된 사실을 알게 되었습니다. 그래서 중요한 변경부분을 적어 봅니다.

언어의 변경점

두가지 변경점이 있습니다.

Go는 패키지간에 유형을 이동하면서 점진적인 코드 복구를 지원하는 type alias을 지원합니다. type 디자인 문서리팩토링에 대한 기사에서 문제를 자세히 설명합니다. 즉, type alias 선언은 다음과 같은 형식을 취합니다.

type T1 = T2

이 선언은 T2로 표시된 type에 대한 대체 철자 인 alias T1을 도입합니다. 즉, T1과 T2는 모두 같은 type을 나타냅니다.

언어의 작은 변경점은 아키텍처의 “fused multiply and add”(FMA) 명령어를 사용하여 중간 결과를 반올림하지 않고, x*y+z를 계산하는 것과 같이 부동 소수점 연산을 함께 구현할 수 있는 언어구현을 의미합니다 x * y. 강제적으로 중간의 반올림을 실시하려면, float64 (x * y) + z라고 기입합니다.

Ports

이 릴리스에는 지원되는 새로운 운영 체제 또는 프로세서 아키텍처가 없습니다.

ppc64x requires POWER8

FreeBSD

OpebBSD 6.0

known Issue

NetBSD 커널 충돌로 인해 1.9 개발동안 NetBSD 빌더 실행이 중단되었습니다 (NetBSD 7.1까지 포함). Go 1.9가 릴리스됨에 따라 NetBSD 7.1.1이 수정되었습니다. 그러나 현재로서는 테스트 통과 한 NetBSD 빌더가 없습니다. 다양한 NetBSD 문제를 조사하는 데 도움을 주시면 감사하겠습니다.

Tools

병렬 컴파일

Go 컴파일러는 이제 다중 코어를 활용하여 패키지의 함수를 병렬로 컴파일하는 기능을 지원합니다. 이것은 별도 패키지의 병렬 컴파일에 대한 go 명령의 기존 지원에 추가됩니다. 병렬 컴파일은 기본적으로 켜져 있지만 환경 변수를 아래와 같이 변경하면 비활성화 할 수 있습니다.

GO19CONCURRENTCOMPILATION = 0

Vendor matching with ./…

Moved GOROOT

Compiler Toolchain

어샘블러

Doc

긴 인수 목록들이 생략됩니다. 이 것은 go doc 의 가독성을 개량했습니다.
구조체 필드에 대한 문서보기가 지원됩니다. 예를 들어 doc http.Client.Jar로 이동하십시오.

type Client struct {
    // Jar specifies the cookie jar.
    //
    // The Jar is used to insert relevant cookies into every
    // outbound Request and is updated with the cookie values
    // of every inbound Response. The Jar is consulted for every
    // redirect that the Client follows.
    //
    // If Jar is nil, cookies are only sent if they are explicitly
    // set on the Request.
    Jar CookieJar

    // ... other fields elided ...

ENV

go env --json을 통해 json 형식으로 출력할 수 있습니다.

Test

Pprof

Vet

vet명령은 go tool에 더 잘 통합되어 있어서 vet는 모든 표준 빌드 플래그를 지원하고, vet 플래그는 이제 vet와 go tool vet에서 사용할 수 있습니다.

Gccgo

Runetime

inlined frames이 포함된 스택호출

성능

언제나 그렇듯이 변경 사항은 매우 일반적이며 다양하여 성능에 대한 정확한 설명을 하기 어렵습니다. 대부분의 프로그램은 가비지 컬렉터의 속도 향상, 향상된 코드 생성 및 코어 라이브러리의 최적화로 인해 조금 더 빠르게 실행될 것입니다.

가비지 콜렉터(Garbage Collector)

세계 표준 가비지 콜렉션을 트리거하는데 사용 된 라이브러리 함수는 이제 동시 가비지 콜렉션을 트리거합니다. 특히 runtime.GC, debug.SetGCPercent 및 debug.FreeOSMemory는 동시 가비지 콜렉션을 트리거하고, 가비지 콜렉션이 완료 될 때까지 호출 goroutine 만 차단합니다.

debug.SetGCPercent 함수는 새로운 GOGC 값으로 인해 즉시 필요한 경우에만 가비지 수집을 트리거합니다. 이렇게하면 GOGC를 즉석에서 조정할 수 있습니다.

큰 오브젝트 할당 성능은 대형 오브젝트가 많은 대형 (> 50GB) 힙을 사용하는 어플리케이션에서 상당히 향상됩니다.

매우 큰 힙에 대해서도 runtime.ReadMemStats 함수는 이제 100μs보다 적게 걸립니다.

코어 라이브러리

새로운 비트조작 패키지

Go 1.9에는 새로운 패키지 인 math/bits가 포함되어 있으며 비트 조작을위한 최적화 된 구현이 포함되어 있습니다. 대부분의 아키텍처에서이 패키지의 함수는 컴파일러에서 추가로 인식되며 추가 성능을 위해 내장 함수로 처리됩니다.

Test.Helper function

새로운 (T).Helper( B).Helper 메서드는 호출 함수를 테스트 도우미 함수로 표시합니다. 파일 및 줄 정보를 인쇄 할 때 해당 기능은 건너 뜁니다. 이렇게하면 사용자에게 유용한 줄 번호를 사용하면서 테스트 도우미 함수를 작성할 수 있습니다.

동시 발생하는 MAP

sync 패키지의 새로운 map 패키지는 amortized-constant-time, 저장 및 삭제가 포함 된 동시 map입니다. 여러 goroutine이 Map의 메소드를 동시에 호출하는 것이 안전합니다.

Profiler Labels

기타 소규모 변경점

문서가 너무 많다… ㅠㅠ