2010-10-05 51 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