Go 语言学习的必要性(对于运维工程师)

Go 语言开发-作者们

1941年9月9日,Ritchie出生于纽约布朗克斯区,丹尼斯·利奇是美国计算机科学家。通常称他为"dmr"。
 他是C语言的创造者、Unix操作系统的关键开发者,对计算机领域产生了深远影响。
 父亲是贝尔实验室的交换系统工程师Alistair Ritchie。Ritchie在新泽西长大
1943年汤普逊出生于美国新奥尔良。
1960年汤普森就读加州大学伯克利分校主修电气工程,取得了电子工程硕士的学位。
1966年加入了贝尔实验室。汤普逊参与了贝尔实验室与麻省理工学院以及通用电气公司联合开发的一套多用户,分时操作系统名叫Multics,
  同时他自己写了一个“startravel”游戏可运行于Multics之上。贝尔实验室后来撤出Multics计划。汤普逊只好找到一台老式PDP-7机器,重写了他的“startravel”游戏。  
  在开发Multics的期间,汤普逊创造出了名为Bon的程式语言。汤普逊花了一个月的时间开发了全新的操作系统,UNiplexedInformation and ComputingSystem(UNICS),
   可执行于PDP-7机器之上,后来改称为UNIX。第一版的Unix就是基于B语言来开发的。所以unix诞生于贝尔实验室的一台被丢弃的仅有8K个18位字长内存的DEC PDP-7计算机上
  Bon语言在进行系统编程时不够强大,所以肯·汤普森和丹尼斯·利奇对其进行了改造,并与1971年共同发明了C语言。 
   可以这样认为,比较好理解
   Multics-->bon
             UNICS--->unix--->c语言
1973年Thompson和Ritchie用C语言重写了UNIX。安装于PDP-11的机器之上。  
1983年, 美国计算机协会将 杜林奖(图灵奖)授予汤普逊与 丹尼斯。  2000年12月时,汤普逊退休,离开贝尔实验室,成为了一名飞行员。   
  KenThompson,C语言前身B语言的作者,Unix的发明人之一(另一个是Dennis M.Riche,被尊为DMR),Belle(一个厉害的 国际象棋程序)的作者之一,
   操作系统Plan9的主要作者(另一个是Rob Pike,前不久被google挖走了)。Ken爷爷也算是计算机历史上开天辟地的人物了。
1969年,普通人都认为只有大型机才能运行通用的操作系统,早期的计算机都很大,。至于用高级语言来写操作系统,更是不可能的事。
   汤普逊自然不是池中物,于是他和DMR怒了,在1969年到1970间用汇编在PDP-7上写出了UNIX的第一个版本。
   他们并不知道,一场轰轰烈烈的UNIX传奇由此拉开了序幕。汤普逊在1971年又把Unix用C重写。
   汤普逊的故事:
   装了UNIX的PDP-11最早被安装在BellLab里供大家日常使用。很快大家就发现汤普逊总能进入他们的帐户,获得最高权限。BellLab里的科学家都心比天高,
   当然被搞得郁闷无比。于是有高手怒了,跳出来分析了UNIX代码,找到 后门,修改代码,然后重新编译了整个UNIX。就在大家都以为“这个世界清净了”的时候,
   他们发现汤普逊还是轻而易举地拿到他们的帐户权限,百思不解后,只好继续郁闷。谁知道这一郁闷,就郁闷了14年,直到汤普逊道出个中缘由。原来,代码里的确有后门,
   但后门不在Unix代码里,而在编译Unix代码的C编译器里。每次C编译器编译UNIX的代码,就自动生成后门代码。而整个BellLab的人,都是用肯·汤普逊的C编译器.
  
  plan 9
   来自贝尔实验室的概念网络操作系统,定义为新型下一代操作系统。
  Plan 9由 unix 创造者 Ken Thompson、Dennis Ritchie等开发,意在基于unix优秀的思想,更好的融入网络以及新型设备如三键鼠标,新式显示器等,创造无缝的用户体验和
   更加现代化的操作系统。
   golang的开发团队和bell实验室开发plan9操作系统的开发团队是同一批人(因为都被google挖去了)。
   美国贝尔实验室(https://www.bell-labs.com/)
   是晶体管、激光器、太阳能电池、发光二极管、数字交换机、通信卫星、电子数字计算机、C语言、UNIX操作系统、蜂窝移动通信设备、长途电视传送、仿真语言、有声电影、
   立体声录音,以及通信网等许多重大发明的诞生地。自1925年以来,贝尔实验室共获得两万五千多项专利,现在,平均每个工作日获得三项多专利。
   贝尔实验室的使命是为客户创造、生产和提供富有创新性的技术,这些技术使朗讯科技(Lucent Technologies)公司在通信系统、产品、元件和网络软件方面处于全球领先地位。
   一共获得8项(13人)诺贝尔奖(其中7项物理学奖,1项化学奖)。

 
Go 语言的核心创作者分别是:
1.肯·汤普逊(Ken Thompson),2.罗布·派克(Rob Pike),以及 3.罗伯特·格瑞史莫(Robert Griesemer)。

 

 

  肯·汤普逊(Ken Thompson)

 肯·汤普逊(英语:Ken Thompson)即肯尼斯·蓝·汤普逊(英语:Kenneth Lane Thompson,1943年2月4日-),是美国计算机科学学者和工程师。汤普逊设计和实现了Unix操作系统B语言,是Plan 9操作系统的创造者和开发者之一。2006年,汤普逊进入Google公司工作,与他人共同设计了Go语言。肯·汤普逊与丹尼斯·里奇同为1983年图灵奖得主。

2021年1月14日,ACM Fellow名单公布,Ken Thompson在列

     丹尼斯·利奇(Dennis Ritchie) 

 

 

 

 罗布·派克(Rob Pike)-加拿大人 Rob Pike

罗布·派克是 《UNIX环境编程》(The Unix Programming Environment)和《程序设计实践》 (The practice of programming)两本书的作者之一,
这两本书几乎是所有的程序员当做经典系列丛书。 
罗伯特·格瑞史莫(Robert Griesemer),作为 Go 语言最初的设计者之一,也是当时三人团队最年轻的创作人之一。
曾参与 V8 JavaScript 引擎和 Java HotSpot 虚拟机的研发。目前主要维护 Go 白皮书和代码解析器等。
肯·汤普逊(Ken Thompson)、罗布·派克(Rob Pike)、罗伯特·格瑞史莫(Robert Griesemer)这被称为是计算机领域「发明之父」所组成的黄金团队,
他们对系统编程语言,操作系统和并行都有着非常深刻的见解。
来 Google 之前 Rob 一直在贝尔实验室维护 Plan9 操作系统,Plan9 这个项目到现在已经很多年,到现在还有不少人在继续维护,
Plan9 的官方主页是 


首先让我们来看一下 Go 语言的版本情况来分析下。

Go语言

Go 语言自己的早期源码使用C语言和Plan 9 C和AT&T汇编语言写成。从 Go 1.4 版本后, Go 语言尝试编译器部分也全部用go代码编写,包括底层的词法和语法分析器等。
对Go 语言编译器的源码了解,对于Go 语言的底层调度有极大的参考意义,同时对与我们深入理解例如: docker,k8s等项目具有很大的帮助.

go项目链接:

 https://github.com/golang/go (包括了自2007年孵化以来的go原生编译器代码)
2007年:Go 语言在 Google 内部孵化。
2012年:Go 正式版本1.0 发布。
2013年:Go 1.1 和 Go 1.2 正式版本发布。
2014年:Go 1.3 和 Go 1.4 正式版本发布。
2015年:Go 1.5 正式版本发布。
2016年:Go 1.6 和 Go 1.7 正式版本发布。
2017年:Go 1.8 和 Go 1.9 正式版本发布。
2018年:Go 1.10 和 Go 1.11 正式版本发布。
2019年:Go 1.12 和 Go 1.13 正式版本发布。
2020年:Go 1.14 和 Go 1.15 正式版本发布。

 我们取样源码情况分析下:
 go-go1.1\go-go1.1\src\cmd\...

E:\go语言集成开发工具\go-go1.1\go-go1.1\src\pkg
下为汇编+c+go(大部分为go代码)
E:\go语言集成开发工具\go-go1.1\go-go1.1\src\cmd
基本都为c代码
//这个阶段基本上都是分的很清楚,pkg基本为go的核心,cmd为编译器核心(java中同jvm一样,具有词法分析器和语法分析器,
简单说编译器就是将高级语言程序解释成为计算机所需的详细机器语言指令集的程序)

go-go1.2\go-go1.2\src\cmd\...(c和go的混合代码)
\go-go1.4.2\go-go1.4.2\src\ (汇编和go的混合代码)

1.go-go1.4.2\go-go1.4.2\src\syscall
使用了不少汇编代码
2.为1.5转为go实现做了不少准备
 很多代码都提出来了
3.E:\go语言集成开发工具\go-go1.4.2\go-go1.4.2\src\cmd
有不少变化

go-go1.5\go-go1.5\src\cmd\dist (这个版本就是go和汇编的混合代码,但是c代码几乎很少了,基本都是go+汇编一部分)

go-go1.5\go-go1.5\src\cmd\dist
汇编写的代码在里面
cpuid_386.s
cpuid_amd64.s
cpuid_default.s
go-go1.5\go-go1.5\src\runtime
asm.s
asm_386.s
asm_amd64.s
asm_amd64p32.s
asm_arm.s
asm_arm64.s
asm_ppc64x.s
duff_386.s 等
E:\go语言集成开发工具\go-go1.5\go-go1.5\src\reflect
asm_386.s
asm_amd64.s
asm_arm.s等

 
从源码安装go编译器.(类似java里面的jdk,c,c++里面的gcc)

参考:https://docs.studygolang.com/doc/install/source
我们编译好之后,就能使用go命令等,使用go run demo.go来编译我们写的程序了

go编译器简单理解

编译器负责生成编译器本身所在的硬件和操作系统相同的环境下运行的目标代码,这种编译器又叫做“本地”编译器。
另外,编译器也可以生成用来在其它平台上运行的目标代码,这种编译器又叫做交叉编译器。交叉编译器在生成新的硬件平台时非常有用。 1.预处理器: 预处理器作用是通过代入预定义等程序段将源程序补充完整。(包括根据编译开关和平台不同等加入必要程序段) 2.编译器前端:前端主要负责解析输入的源代码,由词法分析器和语法分析器协同工作。词法分析器负责把源代码中的"单词"找出来,
语法分析器把这些分散的单词按预先定义好的语法组装成有意义的表达式,语句 ,函数等等。 3.编译器后端:编译器后端主要负责分析,优化中间代码(Intermediate representation)以及生成机器代码(Code Generation)。
前端将高级语言的源代码翻译成IR(Intermediate Representation)序列,并传递给中端;中端对输入的原始IR序列做通用优化,并输出优化后的IR序列给后端;
后端接收中端传来的IR序列,将其映射成真正的汇编指令序列,并做进一步和硬件相关的特殊优化。最终经过链接生成可执行程序
实际编译的基本原理是一样的,但是实现方式不同.
 java的编译器是javac,编译成中间代码(字节码),字节码被在jvm上解释执行,jvm负责和底层的具体转换等工作.

   Go编译器在go-1.7之前,采用的是AST编译技术,从go-1.7开始SSA-IR的前中后三阶段编译技术。

   golang官方提供的几个包,可以帮助我们进行AST分析:

  • go/scanner:词法解析,将源代码分割成一个个token
  • go/token:  token类型及相关结构体定义
  • go/ast:    ast的结构定义
  • go/parser: 语法分析,读取token流生成ast

  虽然Go编译器无需支持别的高级编程语言, 但是上述的第二点和第三点好处仍然适用。
  Go编译器的中端和后端被做成了独立的库"golang.org/x/tools/go/ssa"。这就意味着,你可以自己写一个新的语言前端(甚至不兼容Go语法),并调用Go的ssa库,生成可执行程序;
  甚至于你自己定义的编程语言可以无缝地调用其它Go的代码;进一步,你可以借助于Go的生态系统打造自己的编程语言!类似于Scala语言和Java语言的关系

  https://github.com/golang/tools

  SSA-IR
  SSA-IR(Single Static Assignment)是一种介于高级语言和汇编语言的中间形态的伪语言,从高级语言角度看,它是(伪)汇编;而从真正的汇编语言角度看,它是(伪)高级语言。
  

  另外go使用的是 Mercurial (http://mercurial.selenic.com)进行版本管理.

 

Go 语言的核心优势

1. 高速的效率

Go 语言在保证了快速编译的同时,也保证了高效的开发效率和程序运行性能。

Go 语言的特性也不多,摒弃了其他语言关键特性的问题,使开发变得更快和更加容易。

 并且除了追求快速的编译和开发之外,还需要保证语言带来的性能问题,Go 语言可以让程序员的开发速度更快、更容易,并且带来的可以和 C 和 C++ 差不多的性能。

2. 标准库

Go 里面的标准库基本上已经是非常稳定了,特别是网络层、系统层的库非常实用。Go 语言的 lib 库很全

由于 Go 语言诞生时间比较晚,因此它天生具备了去中心化、分布式等特性,具体表现之一就是提供了丰富便捷的网络编程接口。

3.高并发

  C、C++、Java、Python 和 JavaScript 这些语言的并发和异步方式等控制比较复杂,而且容易出错,而 Go 就是为解决这个问题。

4. 部署方便

5.go语言的创立者

6. 规范性

除了 Go 语言带来的代码规范之外,还有强大的编译检查、完整的软件生命周期工具,具有很强的稳定性。Go提供了软件生命周期(开发、测试、部署、维护等等)的各个环节的工具,如 go tool、gofmt、go test。  

 Go(golang)语言的使用

1. 使用 Go 语言与贡献的企业

Google(https://github.com/google)
  golang语言

Facebook(https://github.com/facebook/)

    facebookgo项目

腾讯

  腾讯在 2015年 已经做了 docker 万台规模的实践。
 https://www.infoq.cn/article/tencent-millions-scale-docker-application-practice

 https://github.com/TarsCloud/TarsGo

阿里

https://github.com/search?q=org%3Aalibaba+go

小米

https://github.com/XiaoMi

360

https://github.com/Qihoo360/poseidon

还有 Docker(docker等)、Apple、Cloud Foundry、CloudFlare、Couchbase、CoreOS(rkt)、Dropbox、MongoDB、AWS 等国外公司。
也有 百度、七牛、PingCAP、华为、金山软件、猎豹移动、饿了么等国内公司。

2. 使用 Go 语言典型应用

docker(docker公司)

项目链接:

kubernetes(cncf基金会)

项目链接:

etcd(coreos 公司)

一款分布式、可靠的 KV 存储系统,可以快速进行云配置。

项目链接:

posted @ 2022-05-06 15:43  jinzi  阅读(466)  评论(0编辑  收藏  举报