• 50 【Go版本变化】


    Go的版本介绍:https://golang.org/project/

    https://golang.org/doc/go1.4

    #Go1.4#

    语言层面变化较少,但是编译器而言是有巨大的突破的,体现在指针间的转换。

    这个release核心聚焦在实现工作上,重点是garbage collector(垃圾回收)和并行处理的垃圾回收器,这些改动也会在之后的几个版本中不断优化。
    并且,栈区是连续的,需要内存时能真实分配地址,而不是通过link方式链接到其它区。这个版本也减轻了“hot stack split”的问题。

    Go1.4也保证了兼容性,绝大部分代码可以直接运行在上面,而不需要改动。

    ===改变:range===
    for i, v := range x {
    ...
    }
    for i := range x {
    ...
    }
    Go1.3支持以上两种range格式
    Go1.4增加了一种range遍历:
    for range x {
    ...
    }

    ===改变: Methods calls on **T===
    type T int
    func (T) M() {}
    var x **T

    both gc and gccgo accepted the method call
    x.M()

    这里x是二维指针,需要两次解引用。这种调用方式在Go1.4不再被允许

    ===change: 支持的平台===
    Android, NaCi on ARM, Plan9 on AMD64

    ===change: 兼容性指导===
    unsafe的类型转换不保证兼容性

    ===change: runtime的改进===
    在Go1.4之前的版本,runtime(garbage collector, concurrency support, interface management, maps, slices, strings, ..)大部分是用c语言完成的,和少量的汇编语句。
    Go1.4做出了改变,runtime已经完全换成Go语言了。这意味着Go能很精确的知道分配的空间和变量。

    ...

    ===Assembly===
    ===gccgo===
    ==改变: internal packages===
    可能有些包仅放在包内,而不希望被外部所访问。之前的Go是不支持的,Go1.4为了让这种需求变得可能,定义了internal packages机制。
    /a/b/c/internal/d/e/f,这里的internal包仅允许/a/b/c所访问,而不能被/a/b/g所调用。


    ===source layout调整===
    去除了src/pkg这一层,从src/pkg/fmt调整为src/fmt

    ===SWIG===
    Go1.4需要SWIG3.0.3版本

    ===性能===
    大部分程序,1.4和1.3的性能相差相近,甚至有时候Go1.4会更慢。
    GC肯定是更快了


    =====标准库=====
    A,没有新的packages
    B,Major packages
    . bufio.Scanner
    . syscall
    C. Minor packages
    不再一一列出,参考:https://golang.org/doc/go1.4

    ==========Go1.5=========

    Big:
    . complier全部用C重写,C编译器不再需要了
    . GC垃圾回收器现在是并行处理的(concurrent)
    . 默认状态,GOMAXPROCS变量和可用core数一致,之前的版本默认是1;
    . internal packages机制全部支持,不是仅限于core package
    . go提供了实验性质的支持,对于vendor目录
    . go tool trace命令可一直追踪调试
    . go doc可以custom,之前仅支持默认格式,不可修改

    ===Language change===
    m := map[Point]string{
    Point{29.935523, 52.891566}: "Persepolis",
    Point{-25.352594, 131.034361}: "Uluru",
    Point{37.422455, -122.084306}: "Googleplex",
    }
    m := map[Point]string{
    {29.935523, 52.891566}: "Persepolis",
    {-25.352594, 131.034361}: "Uluru",
    {37.422455, -122.084306}: "Googleplex",
    }
    Go1.5可以支持Point不再显式写出来

    ===Implement===
    ==No more C==
    编译器和汇编器不再依赖C,是全部用Go重写了。
    仅仅C source是由cgo来处理的。这里在Go1.4是由c编译器处理的。Go1.5版本,即使C source tree,编译的时候用的也是Go编写的编译器。

    ==编译器和tools==
    编译器重写后,编译时会生成一些中间obj,之前的版本这些obj的后缀是.8g, .6g。Go1.5开始,这些object的后缀全部修改成.o

    ==GC垃圾回收器==
    Go1.5 重新设计了GC的部分。GC的调度更优,期待GC延迟比之前要更好.

    ==Runtime & Build & Ports==


    ===Tools===
    ==Translating==
    ==Renaming==
    ==Moving==
    ==Compiler==
    ==Assembler==
    ==Linker==
    ==Go commands==
    ==Go vet command==
    ==Trace command==
    ==Go doc==
    ==Cgo==

    ===性能===
    没办法准确地衡量,有的会更快,有的会更慢。很多剩余工作需要完成,这些会放在Go1.6之后的版本完成。

    ===Core library===
    . Flag
    . Floats in math/big
    . Go types
    . Net
    . Reflect
    . Hardening

    ===Minor changes===
    不再一一列出,参考:https://golang.org/doc/go1.5

    =====Go1.6====


    ===语言变化===
    没有
    ===Ports===
    ===Tools===
    ==Cgo==
    Cgo编译器之前用go重写了,这次又再次进行了优化。
    主要变化:go和c可以共享Go分配的内存了

    ==Compiler工具链==
    ==Gccgo===
    ==Go command==
    Go1.5开始对vendor进行实验性的支持,Go1.6不再只是实验性质,而是默认支持了。
    ==Go doc==
    ==Go vet==

    ===性能===
    相比较Go1.5,有的更快,有的更慢了

    ===Core lib===
    ==Http2==
    支持了Http2协议,client和server在使用HTTPS时能恰当地处理HTTP2请求

    ==Runtime==
    runtime提供了maps轻量级的冲突检测机制。
    程序结束时的panic,tuntime默认打印当前running的goroutine栈信息。而不是所有的goroutines,能显著地快速定位到问题原因。

    ==Reflect==
    ==Sorting==
    排序减少了10%的calls
    ==Templates==
    {{block}}可以支持明明的子模板,能增加复用性
    ==Minor changes==
    不再一一列出,参考:https://golang.org/doc/go1.6

    ===============Go1.7=====================


    Go1.7增加了一些平台的支持。更新了X86-64编译器的后端模块。
    也包含了以下包的修改:context包,x/net。testing包提供了对层次结构的testing的支持,以及benchmark的支持。
    该版本彻底完成了对vendor的支持

    ====Language change====
    ==Ports==

    ====Tools====
    ==Assembler,Compiler Toolchain==
    ==Cgo==
    Cgo的包现在可能可以支持Fortran源码(包括C,c++, Objective-C, SWIG),尽管Go绑定必须使用C语言API
    Go绑定当前可能可以使用新的helper函数(C.CBytes)。
    C.CString能把GO的string转换成*C.byte(C语言的char*)
    C.CBytes能把GO的[]byte转换成unsafe.Pointer(C语言的void*)

    ==Gccgo==
    ==Go command==
    ==Go doc==
    ==Go vet==
    ==Go tool dist==
    go tool dist list能将GO目前支持的所有的OS和平台都列出来

    ==Go tool trace==
    go tool trace已经在之前的版本中支持
    1 收集traces信息比之前的版本都更有效。收集trace的消耗时间是25%,之前的版本是400%。
    2 trace file支持file和line number.
    3 trace工具会break up大的trace以避免感染到正在请求的用户

    ==性能==
    当前版本,在我们的基础性能测试中,code generation changes alone typically reduce program CPU time by 5-35%
    感觉不是二进制运行时间有调整,是代码编译时间有降低

    很多包有做优化,包括crypto/sha1, crypto/sha256等包

    垃圾回收的pause也比Go1.6更短

    ==Core library==
    =Context=
    Go1.7把golang.org/x/net/context移动到标准库context包。这就允许取消context,context超时,传递request-scoped数据,包括net包,net/http,os/exec等包
    更多信息参考release note
    ==http tracing==
    go1.7引入了net/http/httptrace,这个包提供了对HTTP request的tracing event的支持

    ==Testing==
    testing支持了subtest和subbenchmark的支持,使得层次化testing更方便

    ==Runtime==
    runtime有多处改变,详情请看release note,不再一一列出

    ==Minor change==
    bufio...,不再一一列出,详情请看release note
    net/http中有较多修改


    =====GO1.8=====


    更新了compiler后端(生成更有效的代码)
    减少了gc的pause时间(消除了stop-the-world的rescan)
    增加了HTTP/2 push支持
    增加了http的gracefull shutdown
    增加了更多的context支持
    启用了profiling mutexes
    简化了sort slice

    ==语言变化==
    func example() {
    type T1 struct {
    X int `json:"foo"`
    }
    type T2 struct {
    X int `json:"bar"`
    }
    var v1 T1
    var v2 T2
    v1 = T1(v2) // now legal
    }
    之前的转换忽略了tag信息,现在加上了tag的转换

    ====ports====
    增加了更多的平台的移植

    ====Tools====
    ==Assembler==
    ==Yacc==
    yacc工具被移除。Go1.7中,yacc工具不再被go编译器使用。它被放在golang.org/x/tools/cms/goyacc工具包中

    ==Fix==
    ==Pprof==
    pprof工具可以检测TLS server并且可以忽略证书验证,使用https+insecure模式

    ==Trace==
    trace工具支持了--pprof选项

    ==Vet==
    ==compiler toolchain==
    ==Cgo, Gccgo, Default GOPATH, Go get, Go doc, Plugins==


    ====Runtime====
    Argument liveness:参数的存活时间,Go1.7支持一个变量长时间存活
    Concurrent maps:并发情况下的maps下的乱用,增加了race detector,竞争检测
    Memstats:增加了运行时的内存监控,runtime.Memstats

    ====性能====
    对性能影响比较难以估量,有一点点优化,包括bytes, crypto/aes等package

    ==GC==
    gc的pause时间要比go1.7更少,通常是100毫秒,而且大部分是在10毫秒以内。有篇文章专门描述了此次优化 https://github.com/golang/proposal/blob/master/design/17503-eliminate-rescan.md

    ==Defer==
    defer的开销降低一半

    ==cgo==
    go转c的开销降低一半

    ====标准库====
    ==Sort==
    sort包支持了less函数,意味着它更加通用,不用再重复编写sort相关的代码

    ==Http2/push==
    net/http包支持了发送HTTP/2的server push
    类似于Flusher/hijacker接口,http2的ResponseWriter实现了新的Pusher接口

    ==Http server graceful shutdown==
    http服务器能支持graceful shudown,使用Server.shutdown方法

    ==More context support==

    ==Mutex contention profiling==
    支持对包含内容的mutext进行profile

    =====Minor changes===
    细小改变很多,不再一一列出,详情请看release note
    其中改动较多的有net/http, net/url, os, time等包


    ======GO1.9=====

    ====语言上的变动====
    1,支持类型重命名: type T1 = T2
    2,x*y + z,float64(x*y)+z这两种形式不同,具体为啥不同,没看懂

    ===Ports移植平台====
    ====Tools====
    并行编译
    vendor: 用./...不再匹配vendor的包,新的格式: ./vendor/...
    GOROOT
    Compiler toolchain
    Aessmbler
    Doc
    Env
    Test
    Pprof
    Vet

    ====runtime===
    支持打印栈内帧
    runtime.CallersFrames在Go1.7就支持了

    ====性能====
    大部分程序会更快那么一点点,原因是GC的加速,better generated code,核心库的优化


    ====Core library====
    Transparent Monotonic Time support:看不懂
    New bit manipulation package:数学的bits运算,看不懂
    Test helper func:(*T).Helper (*B).Helper
    Concurrent maps:并发的maps操作是支持的,这个包在package sync中,map type。在多个goroutine的增删改是安全的
    Profiler labels:runtime/pprof包现在支持对pprof加标签

    ====Minor changes====
    不再一一列出,详情请看release notes
    比较多的修改点有:database/sql, net/http, time

  • 相关阅读:
    ONVIFclient搜索设备获取rtsp解决开发笔记(精华文章)
    openldap---ldapsearch使用
    简单工厂模式
    编译和运行时,库在何处
    Linux 双网卡绑定技术
    统计某个字符个数,小数运算,小数加减乘除
    2cifang.com_2次方学习
    c/c++ extern “C”
    环境变量0831
    股票技巧
  • 原文地址:https://www.cnblogs.com/helww/p/10170436.html
Copyright © 2020-2023  润新知