Haskell和低级IO操作

时间:2012-10-15 12:06:15

标签: linux haskell ghc

如何在Haskell中实现套接字,管道和文件IO等低级内容?我猜这些IO方法在Haskell中不是原生的,但是Haskell会快速包装一些低级C库,是不是?

2 个答案:

答案 0 :(得分:9)

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

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

答案 1 :(得分:4)

“快速包装”并不总是这里最好的描述。

  1. 有时它包裹在你包裹一个包裹的意义上(例如wxcore包裹wx) 这最接近你提到的“快速包装”, 但我认为最好称之为薄包装因为 我认为这并不像所有那样直截了当。
  2. 有时它像包裹一样包裹椅子(例如wxHaskell包裹wx)。
    我称之为“内置”。
  3. 有时它被包裹成汽车包裹发动机(例如反应性香蕉包裹wx) 我称之为“使用”,如果你看一下,你可以看到里面有一个引擎, 但它看起来不像引擎,而且你的使用方式也大不相同。
  4. 有时它像卡车一样包裹货物列车(例如,haskell的线程包裹OS线程)。 我称之为“重新实现”。 (Haskell可以使用OS线程, 但是Haskell的“原生”线程要轻得多。)
  5. 你可能会说,因为GHC的运行时系统是用C语言编写的,而你的操作系统可能是用C语言编写的,所以Haskell是C的包装,但这就像是说Spyker C8汽车包装了一台奥迪V8引擎。如果你把他们可爱的C8称为带有奥迪的盒子,世爵可能会感到不安。当你驾驶汽车时,你正在使用发动机,但不能直接使用发动机。有些人喜欢调整他们的汽车,就像有些人喜欢超频他们的CPU一样,但除非你愿意,否则你不需要。有些人说,如果你想了解你的车,你应该知道引擎是如何工作的。

    如果你能原谅一级方程式的参考,主要是Haskell“包裹”C就像一辆Torro Rosso包裹一辆法拉利,但偶尔它就像一辆Maclaren包裹着一辆梅赛德斯。 (在你将Torro Rosso称为慢速之前,请将其与福特相提并论。)