Haskell中的系统编程?

Ish*_*ara 15 performance haskell operating-system

是否有可能在像Haskell这样的函数式语言中达到非常低的水平?(比如制作内核或设备驱动程序).功能特性(如monad)会在那里快速高效吗?

int*_*low 20

Haskell本身没有做任何事情来启用系统级编码.通过外部函数接口(FFI),您可以调用C /汇编程序,但在这里您只是将问题外包给另一种语言.

主要挑战 - 以及FFI的使用是这方面的预兆 - 是确保您支持(而不是阻碍)运行时.由于自动内存管理和惰性代码管理,Haskell运行时(必要时)非常复杂.

中断处理是经典的内核/ Haskell问题.如果在Haskell代码深入运行时系统时出现中断,则无法及时处理中断.在许多体系结构中,如果在处理之前有太多中断排队,则硬件将出现故障并停止或重新启动.这个问题似乎是在内核级别使用Haskell的核心关键.

编辑:进一步思考,monads在系统级代码中可能是一个非常有用的习惯用法.想想IO在常规Haskell代码中使用的方式:它是一种类型级别的污染物,它会感染功能,这些功能也可以用于IO事物.

由于系统编程全部与资源管理有关,因此需要跟踪哪些代码与哪些资源进行交互.可以想象每个资源的monad变换器,在类型类中抽象出特定于资源的函数.例如,我们可能有

class Monad m => MonadNetwork m where ...
class Monad m => MonadDiskDrive m where ...
Run Code Online (Sandbox Code Playgroud)

需要同时使用网络和磁盘驱动器的代码会带来类似的限制

downloadToFile :: (MonadNetwork m, MonadDiskDrive m) => URL -> FilePath -> m ()
Run Code Online (Sandbox Code Playgroud)

这显然是一个高级示例(人们不希望在内核中找到它),但我认为它说明了这个想法.如果您不介意打破传统并拥有(非喘息)非C API,那么将OS API暴露给用户土地当然是一种合理的方式.

这样的API肯定会让我觉得从不受信任的源运行代码更安全,因为类型然后记录(具有细粒度)代码打算做什么样的IO事情.

所以是的,我相信monad在系统级编程中非常有用,不是出于效率原因,而仅仅是因为当你运行不在沙箱中的代码时,你想知道代码的意图.


Tho*_*son 16

可能吗?是 Haskell中有操作系统(参见House,LightHouse,hOp,L4内核,以及在开发L4.verified时由NICTA构建的第二个L4内核)以及低级操作系统组件(例如:HALVM).此外,您可以编写Linux模块.

Monads在这里有效吗? Monads是程序员的习语.它们不是汇编代码的一些特殊属性,所以我不清楚你在问什么.关于Haskell,我特别指出,算法空间使用的推理难度是Linux模块工作的主要障碍,部分原因在于GC,部分原因是由于懒惰.由于无法告知GHC RTS当前的执行上下文(对于kmalloc标志),问题稍微加剧了,但这确实是一个可以清理并且目前被悲观假设(GFP_KERNEL无处不在)所掩盖的抛光细节.您可以从内核模块工作中查看我的幻灯片,但知道它们是为了提示我(演示者)谈论某些点并且不是'