最近一直在寫Go,對這個語言的體會也是越來越深。

go作為編譯類語言,能直接構建對應平臺的二進制文件,但是實際上語言本身也是有runtime的。

這點其實和其他語言很不一樣,所以這篇文章就來講講這個。

首先需要知道,go編譯出來的二進制,確實是實打實的純彙編產物。

中間不會經過任何的指令翻譯層,這也意味著不需要模擬任何寄存器的操作。

具體,go是如何在純指令的彙編中加入rt的:

goroutine是什麼具體我就不說了,主要講講goroutine是如何調度的。

首先go的rt並不是時時刻刻都在運行的,因為go不是虛擬機語言,沒有寄存器模擬這種東西。

系統線程在執行指令的時候rt不可能會插入進來。

rt具體是如何介入指令之中的:

go編譯器在編譯go代碼的時候會在生成的彙編指令中加入一些安全點,也可以叫做樁。

運行到安全點後,goroutine的上下文就會保存,rt就會開始運行,判斷此刻是否要讓出資源,或者要不要做GC