go 刪除 檔案 某行 Go 編譯器概述

2021-10-17 09:39:54 字數 2350 閱讀 2670

本文基於go 1.13。

go編譯器是go生態系統中的乙個重要工具,因為它是將程式構建為可執行二進位制檔案的基本步驟之一。編譯器的歷程是漫長的,它已經用c語言編寫,轉移到go,許多優化和清理將在未來繼續發生。讓我們發現它的高水平運作。

go編譯器由四個階段組成,可分為兩類:

為了更好地理解每個階段,讓我們使用乙個簡單的程式:

package mainfunc main() }func add(a, b int)
第一階段非常簡單,並在文件中做了很好的解釋:

在編譯的第一階段,源**被標記化(詞法分析),解析(語法分析),並且為每個原始檔構造語法樹。

詞法分析器將是第乙個為了標記源**而執行的包。這是前乙個示例標記化的輸出:

去源**標記化

一旦被標記化,將被解析並用於構建語法樹。

由於帶有標誌的命令,可以顯示對抽象語法樹的轉換:go tool compile``-w

生成ast的樣本

此階段還將包括內聯等優化。在我們的示例中,該方法add可以已經內聯,因為我們沒有看到callfunc該方法的任何指令add。讓我們使用禁用內聯的標誌-l執行again命令:

ast生成後,它允許編譯器使用ssa表示轉到較低階別的中間表示。

在靜態單賦值形式是階段,其中優化會發生:死**消除,刪除不使用的分支,具有恆定值等替換一些表示式

由於gossafunc=main go tool compile main.go && open ssa.html生成html文件的命令將在ssa包中完成所有不同的傳遞,因此可以轉儲ssa**:

生成的ssa位於「開始」選項卡中:

ssa**

這裡的變數a和b突出顯示以及if條件將允許我們稍後檢視這些行是如何更改的。該**也向我們展示了編譯器如何管理println是在4個步驟分解函式:printlock,printint,printnl,printunlock。編譯器會自動為我們新增乙個鎖,並根據引數的型別呼叫相關方法來正確列印它。

在我們的示例中,由於編譯時已知a並且b已知,編譯器可以計算最終結果並將變數標記為不再需要。通行證opt將優化此部分:

v11這裡已經被新增的結果替換,v4並且v5已被標記為死**。該傳遞opt deadcode將刪除該**:

關於if條件,opt階段將常量標記true為死**,然後將被刪除:

常量布林值被刪除

然後,另乙個過程將通過將不必要的塊和條件標記為無效來簡化控制流程。這些塊稍後將被另乙個專用於死**的傳遞刪除:

不必要的控制流程被刪除

完成所有傳遞後,go編譯器現在將生成乙個中間彙編**:

下一階段將生成機器**到二進位制檔案中。

main.o在我們的示例中,編譯器的最後一步是生成目標檔案。從該檔案中,現在可以使用objdump執行相反過程的工具對其進行反彙編。這是grant seltzer richman建立的乙個很好的圖表:

go 工具編譯

go 工具objdump

您可以在「 dissecting go binaries 」中找到有關目標檔案和二進位制檔案的更多資訊。

生成目標檔案後,現在可以使用該命令go tool link將其直接傳遞給鏈結器,您的二進位制檔案最終將準備就緒。

翻譯自:

Go語言編譯器安裝

臨近回家的日子,在公司比較清閒,所以找來google新出的go語言研究研究,也是看到最新出來的程式語言排名,竟然公升到了13,一下激起了我的興趣,閒話少出。參考文章 http golang.org doc install.html 關於go語言的介紹就不在這裡羅嗦,網上會有很多,我只記錄一下我的安裝...

go編譯靜態檔案

最近用go語言寫了個 成都房地產薪酬 抓取網上的招聘資訊並進行統計。中間遇到一些坑在這裡記錄下來方便以後查閱 go在編譯成二進位制檔案時並沒有把我們的靜態資源檔案編譯進去,如果我們開發的是web應用的話就需要想辦法把我們的靜態檔案也編譯進去,這裡我們使用 go bindata 它可以把我們的靜態檔案...

Go檔案右鍵編譯

辛辛苦苦寫好了.go檔案 發現編譯還得敲命令才行,或許配置乙個好用點的ide環境可以解決 但是有時候實在不想開ide 於是在右鍵新增了乙個編譯功能 首先保證go相關的環境變數配置正確 1 windows registry editor version 5.00 23 hkey classes roo...