GHC如何实现unsafePerformIO?

时间:2017-12-21 16:32:06

标签: linux haskell ghc

x='hello $world' 开始,到RTS,libc或OS API结束,GHC如何实现IO?

我试图了解当标准序言不可用时,如果IO在Haskell中如何工作(例如,如果我们出于任何原因自行实现标准序言)。

我原本希望在GHC的Haskell代码中找到对C函数的包装调用,但事实并非如此。 unsafePerformIO建立在unsafePerformIO之上,这是重型魔法开始的地方,我们开始崩溃到Haskell中未实现的函数和类型,而是内置到编译器中。 runRW#似乎能够对现实世界的状态(即runRW#)执行IO操作。

试图从另一个方向走,我还没有在RTS找到立足点。它似乎不包含我希望调用State# RealWorldfread()fwrite()read()等函数的调用。

从哪里继续关注IO实施?从这开始是什么基本路线图?

1 个答案:

答案 0 :(得分:2)

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

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

至少,我相信它是如何工作的,尽我所能记住。毋庸置疑,这完全是高度特定于GHC的特定实现,而不是任何官方Haskell语言规范的一部分。