2015-10-15 51 views
1

我一直在爲LLVM編寫玩具語言。我想實現的最雄心勃勃的功能是光纖。我已經閱讀了很多關於這個問題的內容,我想我對他們傳統上的實現有一個模糊的概念。據我所知,光纖通常建模爲指令指針和堆棧。 (參見:Golang運行時)有沒有辦法在LLVM中維護多個堆棧/指令指針?

是否支持異步執行的LLVM支持,具有不同的指令指針?多個堆棧?

我知道LLVM是一個註冊機,有沒有什麼辦法可以確保所有的相關數據都保存在堆棧中?和/或一種方法來保存和恢復當前的寄存器狀態?

實現這個手工將是一個真正的害蟲,所以任何幫助表示讚賞!

+0

關於保存/恢復寄存器狀態的問題是一個有趣的問題。儘管它可能值得它自己的問題。 –

回答

0

對於玩具語言,一個快速解決方案是模擬使用線程的纖維行爲。製作一堆線程,但確保只有其中一個線程正在做任何事情。您可以讓其他線程冷靜下來,讓他們對連接到主線程的套接字進行阻塞調用。

顯然,線程比光纖更昂貴。所以這不會是理想的,在性能方面。

不幸的是,據我所知,唯一的辦法就是自己明確地管理前端堆棧。例如,一種方法是

的「延續」的對象,然後履行的作用指令指針(儘管以一種非常不同的方式!),並且您的手動分配內存實現了堆棧數據的角色。更多細節可以在here找到。