• 技术文章 >后端开发 >Golang

    go语言编译快吗

    青灯夜游青灯夜游2021-06-07 14:00:08原创61

    go语言编译速度快,原因:1、使用了import的引用管理方式;2、没有模板的编译负担;3、1.5版本后的自举编译器优化;4、更少的关键字,Go语言中的关键字一共有25个,可以简化在编译过程中的代码解析。

    本教程操作环境:windows10系统、GO 1.11.2、Dell G3电脑。

    现在Go的几个主要特点,编译速度、执行速度、内存管理以及并发编程。

    Go的编译为什么快

    当然,设计Go语言也不是完全从零开始,最初Go的团队尝试设计实现一个Go语言的编译前端,由基于C的gcc编译器来编译成机器代码,这个面向gcc的前端编译器也就是目前的Go编译器之一的gccgo。

    与其说Go的编译为什么快,不如先说说C++的编译为什么慢,C++也可以用gcc编译,编译速度的大部分差异很有可能来源于语言设计本身。

    在讨论问题之前,其中需要先说明的一点是:这里比较的编译速度都是在静态编译下的。

    静态编译和动态编译的区别

    静态编译:编译器在编译可执行文件时,要把使用到的链接库提取出来,链接打包进可执行文件中,编译结果只有一个可执行文件。
    动态编译:可执行文件需要附带独立的库文件,不打包库到可执行文件中,减少可执行文件体积,在执行的时候再调用库即可。

    两种方式有各自的优点和缺点,前者不需要去管理不同版本库的兼容性问题,后者可以减少内存和存储的占用(因为可以让不同程序共享同一个库),两种方式孰优孰弱,要对应到具体的工程问题上,Go默认的编译方式是静态编译。

    回到我们要讨论的问题:C++的编译为什么慢?

    C++编译慢的主要两个大头原因:

    1、头文件的include方式

    2、模板的编译

    C++使用include方式引用头文件,会让需要编译的代码有乘数级的增加,例如当同一个头文件被同一个项目下的N个文件include时,编译器会将头文件引入到每一份代码中,所以同一个头文件会被编译N次(这在大多数时候都是不必要的);

    C++使用的模板是为了支持泛型编程,在编写对不同类型的泛型函数时,可以提供很大的便利,但是这对于编译器来说,会增加非常多不必要的编译负担。

    当然C++对这两个问题有很多后续的优化方法,但是这对于很多开发者来说,他们不想在这上面有过多时间和精力开销。

    大部分后来的编程语言在引入文件的方式上,使用了import module来代替include
    头文件的方式,import解决了重复编译的问题,当然Go也是使用的import方式;在模板的编译问题上,由于Go在设计理念上遵循从简入手,所以没有将泛函编程纳入到设计框架中,所以天生的没有模版编译带来的时间开销(没有泛型支持也是很多人不满Go语言的理由)。

    所以在我看来,Go编译速度快,主要出于四个原因:

    1、使用了import的引用管理方式;

    2、没有模板的编译负担;

    3、1.5版本后的自举编译器优化;

    4、更少的关键字。

    Go语言中的关键字一共有 25 个:

    breakdefault funcinterfaceselect
    casedefergomapstruct
    chanelsegotopackageswitch
    constfallthroughifrangetype
    continueforimportreturnvar

    之所以刻意地将Go语言中的关键字保持的这么少,是为了简化在编译过程中的代码解析。和其它语言一样,关键字不能够作标识符使用。

    所以为了加快编译速度、放弃C++而转入Go的同时,也要考虑一下是否要 放弃泛型编程的优点。

    注:泛型可能在Go 2版本获得支持。

    note:
    Go虽然还无法达到C++那样的极致性能,但是在大部分情况下已经很接近了;
    Go和Java在算法的时间开销上难分伯仲,但在内存的开销上Java就要高得多了;
    Go在上述的绝大部分情况下,至少时间和内存开销都比Python要优秀得多;

    推荐学习:Golang教程

    以上就是go语言编译快吗的详细内容,更多请关注php中文网其它相关文章!

    声明:本文原创发布php中文网,转载请注明出处,感谢您的尊重!如有疑问,请联系admin@php.cn处理
    专题推荐:go语言
    上一篇:go语言中map可以定义长度吗 下一篇:go语言跨平台吗
    第16期线上培训班

    相关文章推荐

    • go语言怎么将int转为字符串类型• 用go语言怎么实现字符串比较• go语言中字符串怎么逐个取出• go语言怎么将字符串转换成浮点数• go语言中while是关键字吗

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网