Utiliser Haskell pour des systèmes en temps réel de grande taille: comment (si?)?

j'ai été curieux de comprendre s'il est possible d'appliquer la puissance de Haskell dans le monde réel intégré, et dans googling ont trouvé le paquet Atom . Je suppose que dans le cas complexe le code pourrait avoir tous les bugs c classiques-accidents, corruption de mémoire, etc, qui devraient alors être tracés à l'origine du code Haskell que sont à l'origine. Ainsi, c'est la première partie de la question: "si vous avez eu l'expérience avec Atom, comment avez-vous la tâche de déboguer les bogues de bas niveau dans le code C compilé et de les corriger dans le code original D'Haskell ?"

j'ai cherché d'autres exemples pour Atom, ce billet de blog mentionne le code C 22KLOC résultant (et évidemment pas de code:), le exemple inclus est un jouet. Ce et ce références un peu plus de code, mais c'est là que cela se termine. Et la raison que j'ai mis "taille" dans le sujet est, je suis le plus intéressé si vous pourriez partager vos expériences de travail avec le code C généré dans la gamme de 300KLOC+.

comme je suis un internaute novice de Haskell, évidemment, il peut y avoir d'autres moyens que je n'ai pas trouvé en raison de mes inconnues inconnues inconnues, de sorte que tout autre pointeur pour l'auto-éducation dans ce domaine serait grandement apprécié - et c'est la deuxième partie de la question - "ce qui serait d'autres méthodes pratiques (si) de faire le développement en temps réel dans Haskell?". Si le multicore est aussi dans l'image, c'est un plus supplémentaire: -)

(à propos de l'utilisation de Haskell lui-même dans ce but: de ce que j'ai lu dans ce billet de blog , la collecte des ordures et la paresse à Haskell le rend plutôt non-déterministe de planification, mais peut-être dans deux ans quelque chose a changé. Real world Haskell programmation question était DONC le plus proche de ce que j'ai pu trouver à ce sujet)

Note: "real-time" ci - dessus est serait plus proche de "hard realtime" - je suis curieux s'il est possible de s'assurer que le temps de pause lorsque la tâche principale n'est pas l'exécution est inférieure à 0,5 ms.

54
demandé sur Community 2009-08-12 04:43:19

5 réponses

chez Galois nous utilisons Haskell pour deux choses:

  • Soft real time (OS device layers, networking), où les temps de réponse de 1-5 ms sont plausibles. GHC génère du code rapide, et a beaucoup de soutien pour ajuster le GC et le scheduler pour obtenir le bon timing.
  • pour les systèmes temps réel réels les DEL sont utilisées pour générer du code pour d'autres langues qui offrent des garanties de synchronisation plus fortes. Par exemple: Cryptol, atome et copilote.

veillez donc à distinguer L'EDSL (copilote ou atome) de la langue hôte (Haskell).


quelques exemples de systèmes critiques et, dans certains cas, de systèmes en temps réel, écrits ou générés à partir de Haskell, produits par Galois.

EDSLs

Systèmes

  • HaLVM -- un léger micro-noyau pour les systèmes embarqués et applications mobiles
  • TSE -- inter-domaine (niveau de sécurité), réseau de l'appliance
47
répondu Don Stewart 2018-06-28 14:41:36

il faudra beaucoup de temps avant qu'il n'y ait un système Haskell qui s'adapte dans une petite mémoire et peut garantir des temps de pause de moins de millisecondes. La communauté de Haskell réalisateurs ne semble pas être intéressé par ce genre de cible.

il y a un intérêt sain à utiliser Haskell ou quelque chose comme Haskell pour compiler vers le bas à quelque chose de très efficace; par exemple, Bluespec compiles au matériel.

Je ne pense pas sera répondre à vos besoins, mais si vous êtes intéressé par la programmation fonctionnelle et les systèmes intégrés, vous devriez en savoir plus sur Erlang .

6
répondu Norman Ramsey 2009-08-12 03:36:35

Andrew,

Oui, il peut être difficile de déboguer les problèmes à travers le code généré vers la source d'origine. Une chose que fournit Atom est un moyen de sonder les expressions internes, puis laisse si à l'utilisateur comment gérer ces sondes. Pour les essais de véhicules, nous construisons un transmetteur (en atome) et diffusons les sondes au-dessus d'un bus CAN. Nous pouvons ensuite capturer ces données, les formater, puis les visualiser avec des outils comme GTKWave, soit en post-traitement ou en temps réel. Pour simulation logicielle, les sondes sont manipulées différemment. Au lieu d'obtenir des données de sonde à partir d'un protocole CAN, des crochets sont faits sur le code C pour lever les valeurs de sonde directement. Les valeurs de la sonde sont ensuite utilisées dans le cadre d'essai unitaire (distribué avec L'atome) pour déterminer si un essai réussit ou échoue et pour calculer la couverture de simulation.

6
répondu Tom 2009-10-17 13:14:17

Je ne pense pas que Haskell, ou d'autres langages de collecte D'ordures sont très bien adaptés aux systèmes en temps réel, car les GC ont tendance à amortir leurs temps d'exécution en courtes pauses.

l'Écriture dans l'Atome n'est pas exactement la programmation Haskell, comme Haskell ici peut être considéré comme purement un préprocesseur pour le programme que vous écrivez.

je pense que Haskell est un impressionnant préprocesseur, et en utilisant DSEL comme atome est probablement un grand façon de créer des systèmes dur-temps réel, mais je ne sais pas si Atom correspond à la facture ou pas. Si ce n'est pas le cas, je suis presque sûr que c'est possible (et j'encourage tous ceux qui le font!) pour mettre en œuvre un DSEL qui le fait.

avoir un pré-processeur très fort comme Haskell pour un langage de bas niveau ouvre une énorme fenêtre d'opportunité pour implémenter des abstractions via la génération de code qui sont beaucoup plus maladroites lorsqu'elles sont implémentées en tant que générateurs de texte de code C.

4
répondu Peaker 2009-08-12 12:31:05

J'ai flirté avec Atom. Il est assez cool, mais je pense que c'est mieux pour les petits systèmes. Oui, il fonctionne dans des camions et des bus et met en œuvre des applications critiques dans le monde réel, mais cela ne signifie pas que ces applications sont nécessairement grandes ou complexes. Il est vraiment pour les applications dur-temps réel et va à de grandes longueurs pour faire chaque opération prendre la même quantité de temps. Par exemple, au lieu d'une instruction if / else qui exécute conditionnellement l'une des deux branches de code qui peut différer dans le temps d'exécution, il a une instruction" mux " qui exécute toujours les deux branches avant de sélectionner conditionnellement l'une des deux valeurs calculées (donc le temps total d'exécution est la même quelle que soit la valeur sélectionnée). Il n'a pas de système de type significatif autre que les types intégrés (comparable à C's) qui sont appliqués par les valeurs GADT passé par le Monad atome. L'auteur travaille sur un outil de vérification statique qui analyse le code de sortie C, ce qui est assez cool (il utilise un solveur SMT), mais je pense Qu'Atom profiterait de plus de fonctionnalités et de vérifications au niveau des sources. Même dans mon application de la taille d'un jouet (led flashlight controller), j'ai fait un certain nombre d'erreurs de débutant que quelqu'un plus expérimenté avec le paquet pourrait éviter, mais qui a abouti à code de sortie buggy que j'aurais préféré avoir été attrapé par le compilateur au lieu de par le biais de tests. D'autre part, il est toujours à la version 0.1.quelque chose d'aussi positif se profile à l'horizon.

4
répondu solrize 2010-01-19 22:48:42