Haskell和低级IO操作

8

在Haskell中,低级别的东西如套接字、管道和文件IO是如何实现的呢?我猜这些IO方法在Haskell中并不是本地的,而是Haskell快速包装了一些低级别的C库,是吗?

2个回答

9

套接字、管道和文件在内核中实现;要从用户空间程序中使用它们,您需要调用内核。如果您将内核视为库,则是的,I/O必须由低级C/汇编语言库实现。

实际上,像GHC这样的Haskell实现将使用C库的包装器来封装系统调用。例如,请参阅GHC RTS评论,其中描述了组成使用GHC编译的任何Haskell程序核心的C部分。如果有疑问,请查阅源代码


4
“quickly wraps”在这里并不总是最好的描述。
  1. 有时它的包装类似于您包装包裹(例如wxcore包装wx)。 这是最接近您提到的“快速包装”的说法, 但我认为最好称之为薄包装,因为 我认为它并不那么简单。
  2. 有时它的包装方式类似于装饰包裹椅子(例如wxHaskell包装wx)。 我会称之为“围绕构建”。
  3. 有时它的包装方式类似于汽车包裹发动机(例如reactive banana包装wx)。 我会称之为“使用”,如果你看一下就可以看到其中有一个发动机, 但它看起来不像发动机,并且使用方式也非常不同。
  4. 有时它的包装方式类似于卡车包裹货车列(例如Haskell的线程包装OS线程)。 我会称之为“重新实现”。 (Haskell可以使用OS线程, 但Haskell的“本地”线程更加轻量级。)

您可以争论说,因为GHC的运行时系统是用C编写的,而您的操作系统可能也是用C编写的,所以Haskell是C的包装器,但这就像说Spyker C8汽车包裹了Audi V8发动机一样。如果您称他们可爱的C8是一个有Audi发动机的盒子,Spyker可能会感到不满。当您驾驶汽车时,您使用了发动机,但并非直接使用。有些人喜欢调整他们的汽车,就像有些人喜欢超频他们的CPU一样,但除非你想这样做,否则你不必这样做。有些人说,如果你想了解你的汽车,就应该知道发动机的工作原理。

如果您可以原谅F1的参考,那么Haskell主要是像Torro Rosso包装Ferrari一样“包装”C,但有时它像Maclaren包装Mercedes一样。(在您将Torro Rosso称为慢车之前,请将其与Ford进行比较。)


1
这可能是我今天读过的最有趣的事情。谢谢你。 - MathematicalOrchid
如果我完全不理解这些类比,这是不好的吗? - Cubic
1
@Cubic,类比警察会逮捕你的,没错。如果你能找出哪里不太清楚,也许我可以用更好的方式解释我的意思,这样你就可以逃脱被判有期徒刑的命运了。 - AndrewC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接