gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区

站長資訊網
最全最豐富的資訊網站

go語言是否需要編譯

go語言需要編譯。Go語言是編譯型的靜態語言,是一門需要編譯才能運行的編程語言,也就說Go語言程序在運行之前需要通過編譯器生成二進制機器碼(二進制的可執行文件),隨后二進制文件才能在目標機器上運行。

go語言是否需要編譯

php入門到就業線上直播課:進入學習
Apipost = Postman + Swagger + Mock + Jmeter 超好用的API調試工具:點擊使用

本教程操作環境:windows7系統、GO 1.18版本、Dell G3電腦。

Go語言是一門需要編譯才能運行的編程語言,也就說代碼在運行之前需要通過編譯器生成二進制機器碼,隨后二進制文件才能在目標機器上運行。

簡單來說,Go語言是編譯型的靜態語言(和C語言一樣),所以在運行Go語言程序之前,先要將其編譯成二進制的可執行文件。

如果我們想要了解Go語言的實現原理,理解它的編譯過程就是一個沒有辦法繞過的事情。下面就來看看Go語言是怎么完成編譯的。

預備知識

想要深入了解Go語言的編譯過程,需要提前了解一下編譯過程中涉及的一些術語和專業知識。這些知識其實在我們的日常工作和學習中比較難用到,但是對于理解編譯的過程和原理還是非常重要的。

1) 抽象語法樹

在計算機科學中,抽象語法樹(Abstract Syntax Tree,AST),或簡稱語法樹(Syntax tree),是源代碼語法結構的一種抽象表示。它以樹狀的形式表現編程語言的語法結構,樹上的每個節點都表示源代碼中的一種結構。

之所以說語法是“抽象”的,是因為這里的語法并不會表示出真實語法中出現的每個細節。比如,嵌套括號被隱含在樹的結構中,并沒有以節點的形式呈現。而類似于 if else 這樣的條件判斷語句,可以使用帶有兩個分支的節點來表示。

以算術表達式 1+3*(4-1)+2 為例,可以解析出的抽象語法樹如下圖所示:

go語言是否需要編譯

圖:抽象語法樹

抽象語法樹可以應用在很多領域,比如瀏覽器,智能編輯器,編譯器。

2) 靜態單賦值

在編譯器設計中,靜態單賦值形式(static single assignment form,通常簡寫為 SSA form 或是 SSA)是中介碼(IR,intermediate representation)的屬性,它要求每個變量只分配一次,并且變量需要在使用之前定義。在實踐中我們通常會用添加下標的方式實現每個變量只能被賦值一次的特性,這里以下面的代碼舉一個簡單的例子:

x := 1 x := 2 y := x
登錄后復制

從上面的描述所知,第一行賦值行為是不需要的,因為 x 在第二行被二度賦值并在第三行被使用,在 SSA 下,將會變成下列的形式:

x1 := 1 x2 := 2 y1 := x2
登錄后復制

從使用 SSA 的中間代碼我們就可以非常清晰地看出變量 y1 的值和 x1 是完全沒有任何關系的,所以在機器碼生成時其實就可以省略第一步,這樣就能減少需要執行的指令來優化這一段代碼。

根據 Wikipedia(維基百科)對 SSA 的介紹來看,在中間代碼中使用 SSA 的特性能夠為整個程序實現以下的優化:

  • 常數傳播(constant propagation)
  • 值域傳播(value range propagation)
  • 稀疏有條件的常數傳播(sparse conditional constant propagation)
  • 消除無用的程式碼(dead code elimination)
  • 全域數值編號(global value numbering)
  • 消除部分的冗余(partial redundancy elimination)
  • 強度折減(strength reduction)
  • 寄存器分配(register allocation)

因為 SSA 的作用的主要作用就是代碼的優化,所以是編譯器后端(主要負責目標代碼的優化和生成)的一部分。當然,除了 SSA 之外代碼編譯領域還有非常多的中間代碼優化方法,優化編譯器生成的代碼是一個非常古老并且復雜的領域,這里就不展開介紹了。

3) 指令集架構

最后要介紹的一個預備知識就是指令集架構了,指令集架構(Instruction Set Architecture,簡稱 ISA),又稱指令集或指令集體系,是計算機體系結構中與程序設計有關的部分,包含了基本數據類型,指令集,寄存器,尋址模式,存儲體系,中斷,異常處理以及外部 I/O。指令集架構包含一系列的 opcode 即操作碼(機器語言),以及由特定處理器執行的基本命令。

指令集架構常見種類如下:

  • 復雜指令集運算(Complex Instruction Set Computing,簡稱 CISC);
  • 精簡指令集運算(Reduced Instruction Set Computing,簡稱 RISC);
  • 顯式并行指令集運算(Explicitly Parallel Instruction Computing,簡稱 EPIC);
  • 超長指令字指令集運算(VLIW)。

不同的處理器(CPU)使用了大不相同的機器語言,所以我們的程序想要在不同的機器上運行,就需要將源代碼根據架構編譯成不同的機器語言。

編譯原理

Go語言編譯器的源代碼在 cmd/compile 目錄中,目錄下的文件共同構成了Go語言的編譯器,學過編譯原理的人可能聽說過編譯器的前端和后端,編譯器的前端一般承擔著詞法分析、語法分析、類型檢查和中間代碼生成幾部分工作,而編譯器后端主要負責目標代碼的生成和優化,也就是將中間代碼翻譯成目標機器能夠運行的機器碼。

go語言是否需要編譯

Go的編譯器在邏輯上可以被分成四個階段:詞法與語法分析、類型檢查和 AST 轉換、通用 SSA 生成和最后的機器代碼生成,下面我們來分別介紹一下這四個階段做的工作。

1) 詞法與語法分析

所有的編譯過程其實都是從解析代碼的源文件開始的,詞法分析的作用就是解析源代碼文件,它將文件中的字符串序列轉換成 Token 序列,方便后面的處理和解析,我們一般會把執行詞法分析的程序稱為詞法解析器(lexer)。

而語法分析的輸入就是詞法分析器輸出的 Token 序列,這些序列會按照順序被語法分析器進行解析,語法的解析過程就是將詞法分析生成的 Token 按照語言定義好的文法(Grammar)自下而上或者自上而下的進行規約,每一個 Go 的源代碼文件最終會被歸納成一個 SourceFile 結構:

SourceFile = PackageClause ";" { ImportDecl ";" } { TopLevelDecl ";" }
登錄后復制

標準的 Golang 語法解析器使用的就是 LALR(1) 的文法,語法解析的結果其實就是上面介紹過的抽象語法樹(AST),每一個 AST 都對應著一個單獨的Go語言文件,這個抽象語法樹中包括當前文件屬于的包名、定義的常量、結構體和函數等。

如果在語法解析的過程中發生了任何語法錯誤,都會被語法解析器發現并將消息打印到標準輸出上,整個編譯過程也會隨著錯誤的出現而被中止。

2) 類型檢查

當拿到一組文件的抽象語法樹 AST 之后,Go語言的編譯器會對語法樹中定義和使用的類型進行檢查,類型檢查分別會按照順序對不同類型的節點進行驗證,按照以下的順序進行處理:

  • 常量、類型和函數名及類型;
  • 變量的賦值和初始化;
  • 函數和閉包的主體;
  • 哈希鍵值對的類型;
  • 導入函數體;
  • 外部的聲明;

通過對每一棵抽象節點樹的遍歷,我們在每一個節點上都會對當前子樹的類型進行驗證保證當前節點上不會出現類型錯誤的問題,所有的類型錯誤和不匹配都會在這一個階段被發現和暴露出來。

類型檢查的階段不止會對樹狀結構的節點進行驗證,同時也會對一些內建的函數進行展開和改寫,例如 make 關鍵字在這個階段會根據子樹的結構被替換成 makeslice 或者 makechan 等函數。

其實類型檢查不止對類型進行了驗證工作,還對 AST 進行了改寫以及處理Go語言內置的關鍵字,所以,這一過程在整個編譯流程中是非常重要的,沒有這個步驟很多關鍵字其實就沒有辦法工作。【

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区
中文字幕一区二区三区四| 国产精品无码人妻一区二区在线| 国产一区二区三区精彩视频| 狠狠精品干练久久久无码中文字幕| 在线观看岛国av| 久草福利视频在线| 最新中文字幕免费视频| 99草草国产熟女视频在线| www.亚洲天堂网| 欧美韩国日本在线| 超碰97人人射妻| 在线视频日韩一区| 人人爽人人av| 粉色视频免费看| 天天操精品视频| 四虎免费在线观看视频| 色乱码一区二区三区熟女| 九九热精品国产| 交换做爰国语对白| 91嫩草国产丨精品入口麻豆| 久久av高潮av| 亚洲熟妇无码另类久久久| 六月丁香激情网| 日韩亚洲在线视频| 亚洲欧美日韩精品一区| 欧美h视频在线观看| 99久久久精品视频| 欧美日韩激情视频在线观看| 国产成人无码av在线播放dvd| 一级片视频免费观看| 日本国产一级片| 精品国产一区二区三区在线| 欧美久久久久久久久久久久久久| 欧美视频免费看欧美视频| 少妇高潮喷水久久久久久久久久| 日本久久精品一区二区| 久久精品国产精品亚洲精品色| www.亚洲视频.com| 欧美三级在线观看视频| 国产精品无码av无码| 国产九九九视频| 欧美图片激情小说| 色综合手机在线| 视色,视色影院,视色影库,视色网 日韩精品福利片午夜免费观看 | 欧美成人三级在线视频| 国产一级不卡毛片| 一级特黄妇女高潮| 成人一级片网站| 久久人人爽人人片| 免费成人午夜视频| 亚洲免费999| 九九爱精品视频| 色啦啦av综合| 青青草视频在线免费播放| 欧美成年人视频在线观看| 国产精品三级一区二区| 牛夜精品久久久久久久| 男人天堂手机在线视频| 亚洲欧洲日本精品| 国产中文字幕乱人伦在线观看| 女人另类性混交zo| 欧美三级午夜理伦三级老人| 黄色片久久久久| 精品一区二区三区毛片| 免费观看成人网| 国产精品久久久久9999爆乳| 亚洲小视频网站| 一女被多男玩喷潮视频| 激情视频小说图片| 亚洲 激情 在线| 91免费视频网站在线观看| 亚洲一级片av| 毛片av免费在线观看| 欧美精品卡一卡二| xxx中文字幕| 国产小视频精品| 欧美极品欧美精品欧美图片| 久久久天堂国产精品| 91丨九色丨蝌蚪| 无限资源日本好片| 免费黄色福利视频| 色欲色香天天天综合网www| 吴梦梦av在线| 亚洲欧美日韩综合网| 日本精品一区在线观看| 欧美精品卡一卡二| 久久精品在线免费视频| 91日韩精品视频| 男女爽爽爽视频| 久久久久免费精品| 国产成人a亚洲精v品无码| 隔壁人妻偷人bd中字| 欧美少妇一区二区三区| 午夜天堂在线视频| 久久99999| 香港日本韩国三级网站| 国产视频一区二区视频| 看av免费毛片手机播放| 日韩伦理在线免费观看| 97久久国产亚洲精品超碰热| 亚洲国产一二三精品无码 | 国产又大又黄又猛| 久热精品在线播放| 天天综合网久久| 亚洲无吗一区二区三区| 999精彩视频| www.精品在线| 亚洲 国产 图片| 色噜噜狠狠一区二区三区狼国成人| www.精品在线| caoporm在线视频| 日韩欧美中文视频| 国产又粗又长又爽视频| 成人免费a级片| 人妻av中文系列| 精品久久久久久无码国产| 欧美色图色综合| 免费日韩中文字幕| 男女视频在线看| 亚洲天堂av一区二区三区| 伊人免费视频二| 永久免费看av| 久久99中文字幕| 99视频在线免费| 国产三级三级看三级| 国内精品国产三级国产aⅴ久| 六月婷婷激情网| 大伊香蕉精品视频在线| www.四虎成人| 免费黄频在线观看| 亚洲中文字幕无码一区二区三区| 草b视频在线观看| 青青在线免费观看视频| 捷克做爰xxxⅹ性视频| 欧美又粗又长又爽做受| 欧美日韩第二页| 亚洲欧美日韩网站| 国产免费观看高清视频| av污在线观看| 精品久久久无码人妻字幂| 91精品91久久久中77777老牛| 日本xxxxxxx免费视频| 爱爱爱视频网站| 国产av人人夜夜澡人人爽麻豆| 久久九九国产视频| 福利视频999| 成人在线观看你懂的| 国产探花在线看| 黄色激情在线视频| 奇米影视四色在线| 日韩一级性生活片| 日本在线一二三区| www.九色.com| 中文av一区二区三区| 欧美一级欧美一级| 中文av字幕在线观看| 国产无限制自拍| 亚洲18在线看污www麻豆| 日韩视频在线视频| 亚洲第一成肉网| 波多野结衣50连登视频| 欧美日韩亚洲国产成人| 国产又黄又猛视频| 国产aaa免费视频| 亚洲综合日韩欧美| 夫妻免费无码v看片| 特级黄色录像片| 九九视频精品在线观看| 久久久久99精品成人片| 亚洲18在线看污www麻豆| 国产美女三级视频| 日韩小视频网站| 在线观看免费视频污| 538在线视频观看| 337p粉嫩大胆噜噜噜鲁| www.欧美黄色| 色黄视频免费看| 亚洲综合婷婷久久| 国产精品99久久免费黑人人妻| 免费的一级黄色片| 欧美日韩久久婷婷| 一个色综合久久| 一区二区三区视频在线观看免费| 9久久9毛片又大又硬又粗| 久久最新免费视频| 色香蕉在线观看| 在线一区二区不卡| 国产原创精品在线| 黄色三级视频在线| 亚洲人成无码www久久久| 免费看一级大黄情大片| 国产真实老熟女无套内射| 肉大捧一出免费观看网站在线播放| 911福利视频| 一级黄色录像在线观看| 最近中文字幕一区二区| 啊啊啊国产视频| 人妻丰满熟妇av无码区app| 免费av网址在线| 成人黄色片视频|