Ⅰ Go 是怎麼使用 Go 來編譯自身的
最早的go語言編譯器是使用c語言編寫的。編譯器在windows中其實就是一個.exe執行程序。後期,1.3版本之後google採用go語言來編寫go語言編譯器。所以就是go語言編譯自己了
Ⅱ Go 是怎麼使用 Go 來編譯自身的
是Go語言嗎?
Go 編譯過程 九個步驟
第一步. all.bash
% cd $GOROOT/src
% ./all.bash
第一步 all.bash 只是調用了另外兩個 shell 腳本:make.bash 和run.bash。若使用 Windows 或 Plan9,其過程也基本類似,只是腳本分別以 .bat 或 .rc 結尾。在文章的其他部分,請用適當的操作系統對應的擴展來補全命令。
第二步. make.bash
. ./make.bash --no-banner
make.bash 作為 all.bash 內容的一部分,如果它退出也會中斷構建過程
第三步. cmd/dist
gcc -O2 -Wall -Werror -ggdb -o cmd/dist/dist -Icmd/dist cmd/dist/*.c
當健全檢查完成後,make.bash 開始編譯 cmd/dist。
第四步. go_bootstrap
現在 go_bootstrap 已經構建完成,make.bash 的最後一步是使用 go_bootstrap 編譯完整的 Go 標准庫,包括一個完整的 go 工具用以替換。
echo "# Building packages and commands for $GOOS/$GOARCH."
"$GOTOOLDIR"/go_bootstrap install -gcflags "$GO_GCFLAGS" \
-ldflags "$GO_LDFLAGS" -v std
第五步. run.bash
現在 make.bash 已經完成,回到 all.bash 的執行,這會調用 run.bash。run.bash 的任務是編譯和測試標准庫、運行時以及語言測試集。
bash run.bash --no-rebuild
由於 make.bash 和 run.bash 都會調用 go install -a std,因此需要使用 –no-rebuild 標志來避免重復前面的步驟,–no-rebuild 跳過了第二個 go install。
# allow all.bash to avoid double-build of everythingrebuild=trueif [ "$1" = "--no-rebuild" ]; then shiftelse echo '# Building packages and commands.' time go install -a -v std echofi
第六步. go test -a std
echo '# Testing packages.'
time go test std -short -timeout=$(expr 120 \* $timeout_scale)s
echo
接下來 run.bash 會在標准庫里所有的包上來運行用 testing 包編寫的單元測試。由於 $GOPATH 和 $GOROOT 中有著相同的命名空間,所以不能直接使用 go test … 否則 $GOPATH 中的每個包也會被逐一測試,因此創建了一個用於標准庫中的包的別名:std。由於一些測試需要比較長的時間,且會消耗大量內存,因此用 -short 標志對一些測試進行了過濾。
第七步. runtime 和 cgo 測試
run.bash 接下來的部分會運行平台對 cgo 支持的測試,執行一些性能測試,並且編譯一些伴隨 Go 發行版一起的雜項程序。隨著時間的流逝,這些雜項程序的清單會越來越長,那麼它們也就會不可避免的被從編譯過程中悄悄剝離出去。
第八步. go run test
(xcd ../test
unset GOMAXPROCS
time go run run.go
) || exit $?
run.bash 的倒數第二步會調用在 $GOROOT 下的 test 目錄里的編譯器和運行時的測試。他們是對於編譯器和運行時自身的,較為低級細節的測試。會執行語言規格測試,test/bugs 和 test/fixedbugs 子目錄保存有那些已經被發現並被修復的問題的獨立的測試。驅動測試的是一個小 Go 程序 $GOROOT/test/run.go,會執行 test 目錄里的每個 .go 文件。一些 .go 文件的首行包含了指導 run.go 對結果作出判斷的指令,例如,程序將會失敗,或提供一個確定的輸出隊列。
第九步. go tool api
echo '# Checking API compatibility.'
go tool api -c $GOROOT/api/go1.txt,$GOROOT/api/go1.1.txt \
-next $GOROOT/api/next.txt -except $GOROOT/api/except.txt
run.bash 的最後一步調用了 api 工具。
Ⅲ Go語言編譯成aar並調試
go及gomobile的環境配置這里就不介紹了,直接說aar的生成和使用。
1. 設置環境變數GOPATH
GOPATH的值可以有多個,用半形分號間隔,但不能以其結束,設置完成後需要重新做 gomobile init 。
2. 在GOPATH里創建src文件夾,用於存放go的包和源文件
3. 在src中創建hello文件夾(go文件的包名)
4. 在hello中創建hello.go文件,並輸入內容
5. 編譯
執行命令: gomobile bind -target=android hello
會生成一個hello.aar文件
6. 導入到android工程
將hello.aar文件放入工程的libs中,並配置build.gradle
在根結點加入:
在dependencies結點下加入依賴:
7. 在java中測試
運行後,結果會輸出 Hello, Android and Gopher
Ⅳ Go語言編譯器TinyGo,基於LLVM,在微控制器和小系統上編譯和運行
TinyGo是一個為微控制器、WebAssembly(Wasm)和命令行工具等小型場景設計的Go語言編譯器。TinyGo重用了Go語言工具和LLVM使用的庫,以編譯用Go語言編寫的程序。目前,該項目在GitHub上已經積累了10.1k的Star。
如下為一個示常式序,當運行在任何支持的帶板載LED的主板上時,則會點亮內置LED。
上述程序可以在單片機、Adafruit ItsyBitsy M0微控制器或任何支持的帶內置LED的板上進行編譯和不需要修改的運行,只要設置正確的TinyGo編譯器目標即可。例如,設置如下目標可以編譯和點亮 單片機。
項目概述
TinyGo項目旨在將Go語言引入到具有單進程或核心的微控制器和小系統。TinyGo類似於emgo,但主要的區別在於作者想要保留Go內存模型。另一個區別在於TinyGo在內部使用LLVM,因而可以獲得更小更高效的代碼以及更高的靈活性。
創建TinyGo項目的初衷是,如果Python可以在微控制器上運行,Go語言當然也應該能夠在更低級微設備上運行。
支持設備
你可以為微控制器、WebAssembly和Linux編譯TinyGo程序。目前,TinyGo支持以下85種微處理器板。
更多技術細節請參閱原項目。
Ⅳ Go源碼編譯
以go 1.18.2版本為例;假設你還沒有在系統裝安裝go環境;下面一步步教你源碼編譯。
系統環境:
到此,運行go命令的時候,就是使用源碼編譯的二進制了。如果之後有需求修改go源碼。重復如下步驟即可:
Ⅵ go是什麼編程語言主要應用於哪些方面
Go語言由Google公司開發,並於2009年開源,相比Java/Python/C等語言,Go尤其擅長並發編程,性能堪比C語言,開發效率肩比Python,被譽為「21世紀的C語言」。
Go語言在雲計算、大數據、微服務、高並發領域應用應用非常廣泛。BAT大廠正在把Go作為新項目開發的首選語言。
Go語言能幹什麼?
1、服務端開發:以前你使用C或者C++做的那些事情,用Go來做很合適,例如日誌處理、文件系統、監控系統等;
2、DevOps:運維生態中的Docker、K8s、prometheus、grafana、open-falcon等都是使用Go語言開發;
3、網路編程:大量優秀的Web框架如Echo、Gin、Iris、beego等,而且Go內置的 net/http包十分的優秀;
4、Paas雲平台領域:Kubernetes和Docker Swarm等;
5、分布式存儲領域:etcd、Groupcache、TiDB、Cockroachdb、Influxdb等;
6、區塊鏈領域:區塊鏈裡面有兩個明星項目以太坊和fabric都使用Go語言;
7、容器虛擬化:大名鼎鼎的Docker就是使用Go語言實現的;
8、爬蟲及大數據:Go語言天生支持並發,所以十分適合編寫分布式爬蟲及大數據處理。
Ⅶ Go 是怎麼使用 Go 來編譯自身的
是說GO編譯器是用GO語言寫成的。
一般辦法,是先寫一個簡單的基本的,然後進行幾次自我擴展,逐步完善功能。
Ⅷ Go 是怎麼使用 Go 來編譯自身的
第一步:all.bash
% cd $GOROOT/src
% ./all.bash
第一步有些突兀,因為 all.bash 僅僅調用了其它兩個 shell 腳本;make.bash 和 run.bash。如果你在使用 Windows 或 Plan 9,過程是一樣的,只是腳本擴展名變成了.bat 或.rc。對於本文中的其它腳本,請根據你的系統適當改動。
第二步:make.bash
. ./make.bash --no-banner
main.bash 來源於 all.bash,因此調用退出將正確終止便宜進程。main.bash 有三個主要工作,第一個是驗證編譯 Go 的環境是否完整。完整性檢查在過去幾年中建立,它通常嘗試避免使用已知的破損工具或必然失敗的環境進行編譯。
第三步. cmd/dist
gcc -O2 -Wall -Werror -ggdb -o cmd/dist/dist -Icmd/dist cmd/dist/*.c
一旦可用性檢查完畢,make.bash 將編譯產生 cmd/dist,cmd/dist取代了之前存在於Go 1 之前的Makefile 編譯系統。cmd/dist用來管理少量的pkg/runtime的代碼生成。cmd/dist 是C語言編寫的程序,能夠充分利用系統C編譯器和頭文件來處理大部分主機系統平台的檢測。cmd/dist通常用來檢測主機的操作系統和體系結構,即環境變數$GOHOSTOS和$GOHOSTARCH .如果是交叉編譯的話,變數 $GOOS和$GOARCH可能會由於你的設置而不同。事實上,Go 通常用作跨平台編譯器,只不過多數情況下,主機和目標系統一致而已。接下來,make.bash 調用cmd/dist 的引導參數的支持庫、 lib9、 libbio 和 libmach,使用編譯器套件,然後用自己的編譯器進行編譯。這些工具也是用 C 語言寫的中,但是由系統 C 編譯器編譯產生。
echo "# Building compilers and Go bootstrap tool for host, $GOHOSTOS/$GOHOSTARCH."
buildall="-a"
if [ "$1" = "--no-clean" ]; then
buildall=""
fi
./cmd/dist/dist bootstrap $buildall -v # builds go_bootstrap
使用的編譯器套件 cmd/dist 編譯產生一個版本的gotool,go_bootstrap。但go_bootstrap並不是完整得gotool,比方說 pkg/net 就是孤立的,避免了依賴於 cgo。要編譯的文件的列表以及它們的依賴項,是由cmd/dist編譯的 ,所以十分謹慎地避免引入新的生成依賴項 到 cmd/go。
第四步:go_bootstrap
現在, go_bootstrap 編譯完成了,make.bash 的最後一部就是使用 go_bootstrap 完成 Go 標准庫的編譯,包括整套 gotool 的替換版。
echo "# Building packages and commands for $GOOS/$GOARCH."
"$GOTOOLDIR"/go_bootstrap install -gcflags "$GO_GCFLAGS" \
-ldflags "$GO_LDFLAGS" -v std
第五步:run.bash
現在,make.bash 完成了,運行回到了 all.bash,它將引用 run.bash。run.bash 的工作是編譯和測試標准庫,運行時以及語言測試套件。
bash run.bash --no-rebuild
使用 --no-rebuild 標識是因為 make.bash 和 run.bash 可能都調用了 go install -a std,這樣可以避免重復,--no-rebuild 跳過了第二個 go install。
# allow all.bash to avoid double-build of everything
rebuild=true
if [ "$1" = "--no-rebuild" ]; then
shift
else
echo '# Building packages and commands.'
time go install -a -v std
echo
fi
第六步:go test -a std
echo '# Testing packages.'
time go test std -short -timeout=$(expr 120 \* $timeout_scale)s
echo
下一步 run.bash z則是對標准庫中的所有包進行單元測試,這是使用 testing 包編寫的。由於 $GOPATH 和 $GOROOT 中的代碼存在於同一個命名空間中,我們不能使用 go test,這可能會測試 $GOPATH 中的所有包,所以將創建別名std來標識標准庫中的包。由於有些測試需要很長時間,或耗用大量內存,測試將會通過 -short 標識將其過濾。
第七步 runtime 和 cgo 測試
run.bash的下一節將運行大量對cgo支持的平台測試,運行一些季春測試,編譯 Go 附帶的一些雜項程序。隨著時間的推移,這份雜項程序列表已經變長了,當它們發現自己並不包含在編譯過程中時,沉默將不可避免的被打破。
第八步: go run test
(xcd ../test
unset GOMAXPROCS
time go run run.go
) || exit $?
run.bash的倒數第二步調用了$GOROOT目錄下test文件夾中的編譯器和運行時測試。這其中有描述編譯器和運行時本身的低層級測試。而子目錄 test/bugs 及 test/fixedbugs 中的測試對已知問題和已解決問題進行特別的測試。所有測試的測試驅動器是 $GOROOT/test/run.go,該程序很小,它調用test文件夾中的每個.go 文件。有些 .go 文件在首行上描述了預期的運行結果,例如,程序失敗或是放出特定的輸出隊列。
第九步go tool api
echo '# Checking API compatibility.'
go tool api -c $GOROOT/api/go1.txt,$GOROOT/api/go1.1.txt \
-next $GOROOT/api/next.txt -except $GOROOT/api/except.txt
run.bash的最後一部將調用API工具,API工具的作用是執行 Go 1 約定;導出的符號,常數,函數,變數,類型和方法組成2012年確認的 Go 1 API。Go 1 寫在 api/go1.txt 文件,而 Go 1.1 則寫在 api/go1.1.txt文件中。另一個額外的文件,api/next.txt 描述了G 1.1自後添加到標准庫和運行時中的符號。當 Go 1.2 發布時,這個文件將會成為 Go 1.2 的約定,另一個新的 next.txt 文件也將被創建。這里還有一個小文件,except.txt,它包括 Go 1 約定中被批準的擴展。對文件的增添總是小心翼翼的。
Ⅸ Go 是怎麼使用 Go 來編譯自身的
Go是一個圖靈完備的語言
任何圖靈完備的語言理論上都可以用來編譯自身。比如c/c++, java, vb, php等等都可以。
至於怎麼編譯自身的:
用其它語言比如c++實現一個[Go語言編譯器-1]
用Go語言寫一個[Go語言編譯器-2]
用這個c++實現的[Go語言編譯器-1]編譯第2步裡面說的Go語言寫的[Go語言編譯器-2]
用第3步得到的[Go語言編譯器-2],再編譯一次第2步裡面說的[Go語言編譯器-2]的源碼。
OK,現在有一個Go語言實現的編譯器了,最開始那個c++寫的編譯器沒用了,可以扔掉不要了。以後就不停的優化使用這個Go語言實現的自身的編譯器就行了。
Ⅹ go編譯整個文件夾
Copyright © 1999-2020, CSDN.NET, All Rights Reserved
打開APP
銀色種子
關注
go 編譯步驟 原創
2021-04-23 16:29:49
銀色種子
碼齡7年
關注
## go 步驟
```
/*
Go項目構建及編譯
一個Go工程中主要包含以下三個目錄:
src:源代碼文件
pkg:包文件
bin:相關bin文件
1: 建立工程文件夾 goproject
2: 在工程文件夾中建立src,pkg,bin文件夾
3: 在GOPATH中添加projiect路徑 例 e:/goproject
4: 如工程中有自己的包examplepackage,那在src文件夾下建立以包名命名的文件夾 例 examplepackage
5:在src文件夾下編寫主程序代碼代碼 goproject.go
6:在examplepackage文件夾中編寫 examplepackage.go 和 包測試文件 examplepackage_test.go
7:編譯調試包
go build examplepackage
go test examplepackage
go install examplepackage
這時在pkg文件夾中可以發現會有一個相應的操作系統文件夾如windows_386z,
在這個文件夾中會有examplepackage文件夾,在該文件中有examplepackage.a文件
8:編譯主程序
go build goproject.go
成功後會生成goproject.exe文件
至此一個Go工程編輯成功。
*/