go可以在安卓運(yùn)行的,github點(diǎn)抗 /golang/mobile,這是用golang做移動(dòng)端開(kāi)發(fā)的庫(kù),
疏附ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書未來(lái)市場(chǎng)廣闊!成為成都創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:13518219792(備注:SSL證書合作)期待與您的合作!
go是靜態(tài)編譯語(yǔ)言,不是腳本語(yǔ)言
匯編比較特殊,他主要應(yīng)用的環(huán)境別人都替代不了,別的語(yǔ)言能干的事情沒(méi)誰(shuí)會(huì)傻到用匯編。這玩意一般用來(lái)做一些高級(jí)語(yǔ)言運(yùn)行環(huán)境還沒(méi)初始化的時(shí)候運(yùn)行的程序比如BIOS,還有內(nèi)核里需要操作一些特殊的寄存器的時(shí)候,比如x86下讀寫CR0,CR3之類的控制寄存器的情況,這些高級(jí)語(yǔ)言都沒(méi)法辦到。
我們都知道goroutine的在golang中發(fā)揮了很大的作用,那么當(dāng)我們創(chuàng)建一個(gè)新的goroutine時(shí),它是怎么一步一步創(chuàng)建的呢?都經(jīng)歷了哪些操作呢?今天我們通過(guò)源碼來(lái)剖析一下創(chuàng)建goroutine都經(jīng)歷了些什么?go version 1.15.6
對(duì)goroutine最關(guān)鍵的兩個(gè)函數(shù)是 newproc() 和 newproc1() ,而 newproc1() 函數(shù)是我們最需要關(guān)注的。
我們先看一個(gè)簡(jiǎn)單的創(chuàng)建goroutine的例子,找出來(lái)創(chuàng)建它的函數(shù)。
輸出結(jié)果:
通過(guò)使用 go tool compile -S main.go 命令輸出的匯編我們基本可以看到有一個(gè) runtime.newproc() 函數(shù)的調(diào)用(CALL 是匯編調(diào)用函數(shù)指令) ,這個(gè)正是runtime創(chuàng)建goroutine的關(guān)鍵函數(shù)。
我們先看一個(gè)官方對(duì)newproc() 函數(shù)的注釋說(shuō)明。
通過(guò)官方注釋,可得知以下信息:
創(chuàng)建一個(gè)goroutine,是通過(guò)調(diào)用一個(gè) fn 函數(shù)來(lái)實(shí)現(xiàn)的,調(diào)用時(shí)需要指定參數(shù)大小
創(chuàng)建完后需要將goroutine放在一個(gè)運(yùn)行隊(duì)列(P的本地隊(duì)列或全局隊(duì)列)
編譯器通過(guò)一個(gè)go關(guān)鍵字 實(shí)現(xiàn)對(duì)函數(shù)的調(diào)用
stack layout 是特殊的
函數(shù)是nosplit ,不允許分裂的
funcval 是一個(gè)結(jié)構(gòu)體類型
可以看出newproc()函數(shù)只是對(duì)newproc1() 函數(shù)的一個(gè)封裝。
getcallerpc() 函數(shù)用來(lái)獲取調(diào)用者的program counter(PC) ,最終會(huì)轉(zhuǎn)換為匯編實(shí)現(xiàn)調(diào)用,類似的還有g(shù)etcallersp()。官方注釋如下
getcallersp() 函數(shù)調(diào)用時(shí)結(jié)果是正確的,但隨著隨后堆棧的擴(kuò)容和縮容結(jié)果很可能是錯(cuò)誤的。一般規(guī)則是將 getcallersp() 的結(jié)果立即傳遞給nosplit函數(shù),正如這里 newproc() 函數(shù)對(duì) newproc1() 的調(diào)用方法一樣。
對(duì)PC寄存器的介紹參考 這里 。
我們還是先看一下函數(shù)注釋。
創(chuàng)建一個(gè)G(狀態(tài)為 _Grunnable),從 fn 開(kāi)始。其參數(shù)大小為 nargs 字節(jié),從argp開(kāi)始。
callerpc 是創(chuàng)建go 語(yǔ)句的地址,caller負(fù)責(zé)將新創(chuàng)建的g發(fā)送調(diào)度程序。
函數(shù)必須運(yùn)行在系統(tǒng)棧上(go:systemstack),不允許 split,它和函數(shù) newproc() 是連續(xù)一起的。
參數(shù)說(shuō)明
fn: 要執(zhí)行的函數(shù)
argp: 函數(shù)的第一個(gè)參數(shù)地址
narg: 參數(shù)總字節(jié)大小
callergp: 這里是g0
callerpc: caller PC, 創(chuàng)建go語(yǔ)句的地址
現(xiàn)在我們?cè)倏匆幌潞瘮?shù)體內(nèi)容
至此,goroutine已經(jīng)創(chuàng)建成功并處于_Grunnable 狀態(tài),對(duì)于它的執(zhí)行只需要有個(gè)P來(lái)執(zhí)行就可以了。
這里再提醒一次,newproc1() 函數(shù)是運(yùn)行在系統(tǒng)棧上,地址和 newproc() 一起且連續(xù)的。
對(duì)于字段 newg.sched.pc 值為賦值 goexit() 函數(shù)+1, 請(qǐng)參考 這里
這里重點(diǎn)理解下這幾個(gè)字段的作用
newg.sched.sp
newg.sched.pc
newg.gopc
newg.startpc
理解SP PC 這些概念時(shí),需要知道棧的布局 Stack frame layout 。
// Stack frame layout
//
// (x86)
// +------------------+
// | args from caller |
// +------------------+ - frame-argp
// | return address |
// +------------------+
// | caller's BP ( ) | ( ) if framepointer_enabled varp sp
// +------------------+ - frame-varp
// | locals |
// +------------------+
// | args to callee |
// +------------------+ - frame-sp
騰訊:匯編是深入理解 Go 的基礎(chǔ)
程式計(jì)數(shù)器
本文出自:
單片機(jī)不像一些應(yīng)用軟件,和硬件結(jié)合十分緊密,必須要求“高效”,所以匯編語(yǔ)言是最好選擇,其次就是C語(yǔ)言了。其他語(yǔ)言編譯效率都太低,滿足不了要求。
分享標(biāo)題:go語(yǔ)言需要轉(zhuǎn)匯編嗎 go語(yǔ)言能做啥
本文路徑:http://www.rwnh.cn/article12/ddcpggc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站制作、建站公司、商城網(wǎng)站、外貿(mào)網(wǎng)站建設(shè)、App設(shè)計(jì)、網(wǎng)站改版
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)