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