GHC如何实现unsafePerformIO?

Pra*_*tic 5 linux haskell ghc

unsafePerformIO从RTS、libc 或操作系统 API开始和结束,GHC 如何实现 IO?


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

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

尝试从另一个方向走,我在RTS中还没有找到立足点。它似乎不包含我期望的像fread()andfwrite()read()and 之类的函数的调用write()

我在哪里继续关注 IO 实现?从现在开始的基本路线图是什么?

Mat*_*hid 3

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

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

至少,据我所知,我相信这就是它的运作方式。不用说,这都是针对 GHC 的特定实现的,而不是任何官方 Haskell 语言规范的一部分。