2012-10-15 101 views
8

Haskell中实现的低层次的东西,如套接字,管道和文件IO如何实现?我猜这些IO方法在Haskell中不是本地的,但Haskell很快包装了一些低级C库,是不是?Haskell和低级IO操作

回答

9

套接字,管道和文件在内核中实现;要从用户空间程序使用它们,您需要call into the kernel。如果将内核视为一个库,那么是的,I/O必然由低级C /汇编程序库实现。

实际上,像GHC这样的Haskell实现将使用C库的系统调用的包装器。见例如其中描述了构成GHC编译的任何Haskell程序核心的C位。如有疑问,请查阅source code

4

“快速换行”在这里并不总是最好的描述。

  1. 有时它被包裹在包裹宗地(例如wxcore包裹wx)的意义上。
    这是最接近你提到的“快速包装”, ,但我认为它会更好地称为薄包装,因为 我不认为它是那么简单。
  2. 有时它被包裹像装饰包裹椅子(例如wxHaskell包裹wx)。
    我会称之为“内置”。
  3. 有时它像汽车一样包裹发动机(例如反应性香蕉包裹wx)。
    我会称之为“使用”,如果你看它,你可以看到里面有一个引擎,但它看起来不像引擎,而且你使用它的方式很不一样。
  4. 有时候它会像卡车一样包裹货物列车(例如haskell的线程包装OS线程)。 我会称之为“重新实现”。 (哈斯克尔可以使用操作系统线程, 但Haskell的“天然”的线程是更加轻便。)

你可能会说,因为GHC的运行时系统是用C语言编写的操作系统可能是用C写的,Haskell是一个包装在C周围,但这就像说一辆世爵C8车包装奥迪V8发动机。如果您将可爱的C8车型称为带有奥迪的盒子,世爵可能会很不高兴。当你驾驶你的汽车时,你使用的是引擎,但不是直接。有些人喜欢调整他们的车,就像有些人喜欢超频他们的CPU一样,但是除非你想要,否则你不需要。有些人说如果你想了解你的汽车,你应该知道发动机的工作原理。

如果你可以原谅F1的参考资料,主要是Haskell“包装”C,就像托罗罗索包装一辆法拉利,但偶尔它就像一辆麦克拉伦包裹梅赛德斯。 (在你称之为Torro Rosso缓慢之前,将其与福特进行比较。)

+1

这可以说是我今天看过的最有趣的东西。谢谢。 – MathematicalOrchid

+0

如果我完全不理解这些类比,这是不好的? – Cubic

+1

@Cubic比喻警察会逮捕你,是的。如果你能指出什么是不透明的,也许我可以解释我的意思是一种更好的方式,而你会因缓刑而逃脱。 – AndrewC