2010-10-05 83 views
14

是否有可能在Haskell等函数式语言中变得非常低级? (如制作内核或设备驱动程序)。功能特性(如monad)在那里会快速高效吗?Haskell中的系统编程?

回答

18

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

中心挑战 - FFI的使用是此的一个预兆 - 确保您支持(而不是阻碍)运行时。由于自动内存管理和懒惰代码的管理,Haskell运行时(非常复杂)非常复杂。

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

编辑:进一步反思,monads在系统级代码中可能是一个非常有用的习惯用法。想想在常规Haskell代码中使用IO的方式:它是一种类型级别的污染物,它会感染执行IO事务的函数。

由于系统编程完全是关于资源管理的,因此需要跟踪哪些代码与哪些资源进行交互。人们可以想象每个资源都有一个monad变换器,资源特定的函数被抽象为一个类型类。例如,我们可能有一个需要同时使用网络和磁盘驱动器将进行约束像

downloadToFile :: (MonadNetwork m, MonadDiskDrive m) => URL -> FilePath -> m() 

这显然是一个高层次的例子(人们不会想到

class Monad m => MonadNetwork m where ... 
class Monad m => MonadDiskDrive m where ... 

代码在内核中找到这个),但我认为它说明了这个想法。如果你不介意打破传统并且拥有非C API,那肯定会是将OS API暴露给用户空间的一种合理方式。

这样的API肯定会让我感觉更安全一些,从不受信任的源代码运行代码,因为随后类型文件(细粒度)代码打算执行什么样的IO-IS事情。

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

+0

对,monads是一个有用的工具 - 只要看看H Monad(在我的答案中看到L4链接) - 但是Ishihara似乎更关心性能(注意'速度'标签,无论如何),而不是正确性或好的程序员习语。 (编辑:任何你说的不是不同意,基本上想叫出来为H单子) – 2010-10-05 18:12:56

2

在Haskell中编写了许多低级别的软件。请参阅http://www.haskell.org/haskellwiki/Applications_and_libraries/Operating_system

Monads本身不是高效或低效的 - 它取决于您使用的是哪个特定monad以及您如何使用它。你想问的是高阶函数(顺便说一句,你只需要做一个monad)。目前,HOF的许多用途可以被编译为高效的低级代码。

+1

也借此看看[哈斯克尔系统编程(http://book.realworldhaskell.org/read/systems-programming-in-haskell.html)一章中_REAL世界Haskell_书。 – 2010-10-05 12:22:11

+0

RWH章节只与切线相关,因为它讨论了如何将用户空间应用程序与内核以及占用系统C程序(管道/套接字,日期,文件,目录)中大量代码的其他基元进行接口连接。它不会谈论真正的低层次工作,例如司机。 – 2010-10-05 17:44:04

16

这可能吗?是的 Haskell已经有操作系统(参见House,LightHouse,hOp,L4 kernel,并且在开发L4时还有由NICTA构建的第二个L4内核。已验证)以及低级操作系统组件(例如:HALVM)。另外,你可以写Linux modules

是单子高效这里? Monads是一个程序员习惯用法。它们不是汇编代码的一些特殊属性,所以我不清楚你在问什么。关于Haskell,我想说的是,在Linux模块工作中,空间使用算法的推理困难是主要的阻碍,部分原因在于GC,部分原因在于懒惰。由于无法通知GHC RTS当前的执行上下文(对于kmalloc标志),这个问题稍微加剧了,但这实际上是一个可以清除并且目前被悲观假设掩盖的抛光细节(到处都是GFP_KERNEL)。您可以从内核模块努力中查看my slides,但知道它们是为了促使我(主持人)在某些方面进行讨论而不是单独进行讨论。

+0

L4是有几个实现(大部分是用C实现的) – 2015-12-21 16:40:40

+0

的“KernelModulesInHaskell.pdf”链接是不幸死了规范。最初的谈话信息是[在galois.com上](https://galois.com/blog/2009/10/tech-talk-writing-linux-kernel-modules-with-haskell/)。它有同样的死链接。 – 2016-11-03 14:01:17

+1

@DavidTonhofer的信息在https://tommd.wordpress.com/2009/09/13/kernel-modules-in-haskell/我觉得幻灯片永远丢失了,但他们没有太大的损失。 – 2016-11-03 14:11:49