GHC如何实施unsafePerformIO?

unsafePerformIO开始到RTS,libc或OS API结束,GHC如何实现IO?


我试图了解当标准前奏不可用时,IO如何在Haskell中工作(例如,如果我们由于某种原因而自己实现标准前奏)。

我原本期望在GHC的Haskell代码中找到对C函数的封装调用,但事实并非如此。 unsafePerformIO建立在runRW#基础上,这是重魔开始的地方,我们开始崩溃到没有在Haskell中实现的函数和类型中,而是嵌入到编译器中。 runRW#似乎能够运行在真实世界的状态的IO动作(即一State# RealWorld )。

试图从另一个方向走,我还没有找到RTS的立足点。 它似乎不包含我期望像fread()fwrite()read()write()这样的函数。

我在哪里继续从这里执行IO实施? 从这里开始的基本路线是什么?


据我所知, IO x类型的值实际上是从RealWorld#RealWorld#x的[strict]元组的x 。 换句话说,一个简单的状态monad。

你不会在RTS本身中找到read()等; 我相信通常的Prelude接口通过FFI调用它们。 也就是说,执行它的代码位于base包中,而不是RTS本身。 (然而,RTS的确拥有自己的线程调度器,它可能调用pthread或其他任何东西,还有垃圾收集器和内存管理器,它们可能会调用mmap 。)

至少,我相信这就是它的工作方式,尽我所能记得。 不用说,这对GHC的特定实现非常具体,而不是任何官方Haskell语言规范的一部分。

链接地址: http://www.djcxy.com/p/7493.html

上一篇: How does GHC implement unsafePerformIO?

下一篇: XAllowAmbiguousTypes appropriate?