中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

go語(yǔ)言需要轉(zhuǎn)匯編嗎 go語(yǔ)言能做啥

Go語(yǔ)言能在安卓運(yùn)行嗎? Go是腳本語(yǔ)言還是匯編?

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ǔ)言

Go語(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)法辦到。

Runtime: 創(chuàng)建一個(gè)goroutine都經(jīng)歷了什么?

我們都知道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ù)器

本文出自:

為什么不用Go語(yǔ)言寫單片機(jī)程序

單片機(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)

小程序開(kāi)發(fā)
鹿邑县| 如皋市| 六安市| 彭水| 牡丹江市| 蒙阴县| 武威市| 浦江县| 永德县| 仙居县| 治县。| 蒙阴县| 贡嘎县| 鄂州市| 五莲县| 松潘县| 北辰区| 宁晋县| 万载县| 定结县| 泾川县| 通许县| 永修县| 靖安县| 阿城市| 呈贡县| 平阳县| 鄂伦春自治旗| 玉山县| 锦州市| 洪泽县| 修文县| 安乡县| 浑源县| 洪泽县| 云龙县| 海伦市| 靖西县| 河西区| 彭阳县| 武安市|