1

我一直在为 LLVM 编写一种玩具语言。我想要实现的最雄心勃勃的功能是纤维。我已经阅读了很多关于此事的内容,并且我认为我对传统上它们是如何实现的有一个模糊的概念。据我所知,纤维通常被建模为指令指针和堆栈。(参见:Golang 运行时)

是否有任何 LLVM 支持异步执行,具有不同的指令指针?多栈?

我知道 LLVM 是一台注册机,有没有办法确保所有相关数据都保存在堆栈上?和/或一种保存和恢复当前寄存器状态的方法?

手动实施这将是一个真正的害虫,所以任何帮助表示赞赏!

4

1 回答 1

0

对于玩具语言,一个快速的解决方案是使用线程模拟纤维的行为。制作一堆线程,但要确保只有其中一个在做任何事情。您可以通过告诉其他线程对连接到主线程的套接字进行阻塞调用来让它们冷静下来。

显然,线比纤维贵。所以这在性能方面并不理想。

不幸的是,据我所知,如果您想要性能,唯一的方法是自己明确地管理前端堆栈。例如,一种方法是

  • 为所有前端局部变量手动分配内存
  • 将每个前端函数转换为延续传递风格

然后,“延续”对象扮演指令指针的角色(尽管方式非常不同!),而您手动分配的内存则扮演堆栈数据的角色。更多细节可以在这里找到。

于 2015-11-12T22:12:14.307 回答