Programowanie systemów w Haskell?

Czy można przejść bardzo niski poziom w językach funkcyjnych, takich jak Haskell? (jak tworzenie sterownika jądra lub urządzenia). A czy funkcje funkcjonalne (jak monady) będą tam szybkie i wydajne?

Author: Chris Martin, 2010-10-05

3 answers

Haskell sam w sobie nie robi nic, aby włączyć kodowanie na poziomie systemów. Poprzez foreign function interface (FFI) możesz wykonywać połączenia do procedur C / assembly, ale tutaj tak naprawdę po prostu outsourcujesz problem do innego języka.

Głównym wyzwaniem - a użycie FFI jest tego zwiastunem-jest upewnienie się, że wspierasz (a nie utrudniasz) runtime. Środowisko uruchomieniowe Haskell jest (z konieczności) bardzo złożone, zarówno ze względu na automatyczne zarządzanie pamięcią, jak i zarządzanie leniwym kodem.

Obsługa przerwań jest klasycznym problemem jądra / Haskella. Jeśli przerwanie przychodzi, gdy Kod Haskell jest głęboko w systemie uruchomieniowym, nie będzie w stanie obsłużyć przerwania w odpowiednim czasie. Na wielu architekturach, jeśli zbyt wiele przerwań stanie w kolejce przed obsługą, sprzęt ulegnie awarii i zatrzyma się lub zrestartuje. Problem ten wydaje się być centralnym punktem w używaniu Haskell na poziomie jądra.

Edit: o dalszej refleksji, monady mogą być bardzo użytecznym idiomem w kodzie na poziomie systemowym. Pomyśl o tym, w jaki sposób IO jest używany w zwykłym kodzie Haskella: jest to zanieczyszczenie na poziomie typu, które infekuje funkcje, które dobrze robią IO-rzeczy.

Ponieważ programowanie systemów polega na zarządzaniu zasobami, pożądane jest śledzenie, który Kod współdziała z jakimi zasobami. Można sobie wyobrazić transformator monad dla każdego Zasobu, o którym mowa, Z FUNKCJAMI specyficznymi dla zasobów abstrakcyjnymi w klasie typów. Na przykład, my might have

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

Kod, który musi używać zarówno sieci, jak i napędu dyskowego, nosi ograniczenia takie jak

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

Jest to oczywiście przykład na wysokim poziomie (nie spodziewałbym się tego znaleźć w jądrze), ale myślę, że ilustruje ten pomysł. Z pewnością byłby to rozsądny sposób na wystawienie swojego API OS na użytkownika, jeśli nie przeszkadza ci łamanie tradycji i posiadanie (gasp) non-C API.

Takie API na pewno sprawi, że będę czuł się bezpieczniej uruchamiając kod z niezaufanych źródła, jako typy następnie dokumentują (z drobną ziarnistością), jakie rodzaje IO-owskich rzeczy kod zamierza zrobić.

Tak więc tak, uważam, że monady są przydatne w programowaniu na poziomie systemów, nie ze względu na wydajność, ale po prostu dlatego, że uruchamiając kod, który nie jest w piaskownicy, chcesz poznać jego intencje.

 19
Author: intoverflow,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-05 17:49:43

Czy to możliwe? Tak W Haskell istniały systemy operacyjne (Zobacz dom, LightHouse, hOp, an l4 kernel , i jest drugie jądro l4 zbudowane przez NICTA podczas tworzenia L4.verified), a także niskopoziomowe komponenty systemu operacyjnego (np: HALVM ). Możesz również napisać Moduły linuksowe .

Czy Monady Są Tu Wydajne? Monady to idiom programistyczny. Nie są jakąś specjalną właściwością kodu assembly, więc raczej nie jestem pewien o co pytasz. W odniesieniu do Haskell konkretnie powiedziałbym, że trudność rozumowania o wykorzystaniu przestrzeni algorytmu jest główną blokadą w pracy modułu Linuksa, jest to częściowo spowodowane GC, a częściowo z powodu lenistwa. Problem nieco pogłębia niemożność poinformowania GHC RTS o bieżącym kontekście wykonania (dla FLAG kmalloc), ale to naprawdę Polski szczegół, który można wyczyścić i obecnie przykryć pesymistycznymi założeniami (wszędzie GFP_KERNEL). Możesz przejrzeć moje slajdy z wysiłku modułu jądra, ale wiedz, że zostały stworzone po to, aby skłonić mnie (prezentera) do rozmowy w pewnych punktach i nie są stworzone po to, aby być samotnym.

 15
Author: Thomas M. DuBuisson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-04 15:43:00

Było wiele niskopoziomowych programów napisanych w Haskell. Zobacz http://www.haskell.org/haskellwiki/Applications_and_libraries/Operating_system

Monady nie są z natury wydajne lub nieefektywne-zależy to od tego, której konkretnej monady używasz i jak jej używasz. To, o co chcesz zapytać, to funkcje wyższego rzędu (które, nawiasem mówiąc, to wszystko, czego potrzebujesz, aby stworzyć monadę). W dzisiejszych czasach wiele zastosowań Hof można skompilować do wydajnego niskopoziomowego kod.

 2
Author: luqui,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-05 11:46:42