À l'aide de Haskell importante pour les systèmes temps-réel: comment (si?)?
J'ai été curieux de comprendre si il est possible d'appliquer le pouvoir de Haskell et intégrés en temps réel du monde, et dans googler ont trouvé l' Atom paquet. Je suppose que dans le cas complexe, le code pourrait avoir tous les classiques C bugs - accidents, des corruptions de mémoire, etc, qui devraient ensuite être tracée à l'origine du code Haskell qui
sont à l'origine. Donc, ce est la première partie de la question: "Si vous avez eu l'expérience avec l'Atome, comment avez-vous face à la tâche de débogage, le faible niveau des bugs dans compilé en code C et en les fixant en Haskell code d'origine ?"
J'ai cherché quelques exemples de plus pour Atom, ce blog mentionne le code C résultant 22KLOC (et évidemment, pas de code:), le exemple est un jouet. Cette et cette références ont un peu plus de code, mais c'est là que cela se termine. Et la raison, j'ai mis "considérable" dans le sujet, je suis plus intéressé de savoir si vous pourriez partager vos expériences de travail avec le code C généré dans la gamme de 300KLOC+.
Que je suis un Haskell débutant, évidemment, il peut y avoir d'autres façons que je n'ai pas trouver la cause de mon inconnues inconnues, de sorte que toute les autres pointeurs pour l'auto-éducation dans ce domaine serait grandement apprécié - et c'est la deuxième partie de la question "quels seraient certains d'autres pratiques (si) de le faire en temps réel de développement en Haskell?". Si le multicœur est aussi dans l'image, c'est un petit plus 🙂
(À propos de l'utilisation de Haskell lui-même à cette fin: d'après ce que j'ai lu dans ce blog, la collecte des ordures et de la paresse en Haskell rend plutôt programmation non déterministe-sage, mais peut-être que 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)
Remarque: "en temps réel" ci-dessus est plus proche serait "dur en temps réel" - je suis curieux de savoir si il est possible de s'assurer que le temps de pause lorsque la tâche principale n'est pas en cours d'exécution est moins de 0,5 ms.
OriginalL'auteur Andrew Y | 2009-08-12
Vous devez vous connecter pour publier un commentaire.
À Galois nous utilisons Haskell pour deux choses:
Il convient donc de bien distinguer les EDSL (Copilot ou un Atome), à partir de la langue d'accueil (Haskell).
Quelques exemples de systèmes critiques, et, dans certains cas, les systèmes temps réel, soit écrite, soit généré à partir de Haskell, produit par Galois.
EDSLs
Systèmes
OriginalL'auteur Don Stewart
Ce sera un long temps avant qu'il y est un Haskell système qui s'adapte à petit la mémoire et la garantie du sous-ordre de la milliseconde des temps de pause. La communauté de Haskell réalisateurs ne semble pas être intéressé par ce genre de cible.
Il y a un vif intérêt dans l'utilisation de Haskell ou quelque chose Haskell-comme pour compiler vers quelque chose de très efficace; par exemple, Bluespec compile de matériel.
Je ne pense pas que cela va répondre à vos besoins, mais si vous êtes intéressé par la programmation fonctionnelle et systèmes embarqués, vous devriez en apprendre davantage sur Erlang.
Vous pouvez également jeter un oeil à Ocaml. Il est fonctionnel et prend même en charge l'évaluation différée si vous le souhaitez pour un algorithme, mais ne force pas tout à être évalué paresseusement. Je me souviens d'audience utilisé en temps réel des systèmes, bien que je n'ai pas fait moi-même. Il devrait être plus rapide et plus petit que Erlang, de toute façon.
OCaml, Haskell, Erlang et tous s'habituer soft en temps réel. Aucun garantir des temps de réponse par exemple. Dans un système que nous utilisons au travail, nous happly ont ~1ms de temps de réponse sur un périphérique réseau en Haskell, de sorte que c'est le genre de ballon parc de. Le réglage de la GC afin de réduire au minimum le bruit est également utile.
Merci pour la mention de OCaml. Mon sentiment subjectif de jouer avec le code Ocaml est un peu mélangé. Le trivial exemples d'ajouter deux nombres m'oblige à rappeler supplémentaires fonctionnalités de la langue qui, je trouve, sont des frais généraux, alors que les expériences avec Haskell m'obliger à se souvenir de la langue des fonctionnalités qui peuvent exprimer les choses d'une manière plus succinct moyen (interprétations de la liste, par exemple) - ou sont très spéciaux bêtes (les monades). C'est subjectif et que j'avais besoin d'acquérir plus d'expérience avec soit de mieux comprendre - mais les premières impressions sont difficiles à battre. 🙂
OriginalL'auteur Norman Ramsey
Andrew,
Oui, il peut être difficile de déboguer des problèmes par le biais de la génération de code vers la source d'origine. Une chose Atome fournit un moyen de la sonde interne expressions, puis de feuilles jusqu'à l'utilisateur la façon de gérer ces sondes. Pour les essais de véhicules, nous construisons un émetteur (Atom) et stream les sondes sur un bus can. On peut alors capturer ces données, mise en page, puis de l'afficher avec des outils comme GTKWave, soit en post-traitement ou en temps réel. Pour les logiciels de simulation, les sondes sont traitées différemment. Au lieu d'obtenir les données de la sonde à partir d'un protocole can, les crochets sont faits pour le code C pour soulever la sonde directement les valeurs. La sonde valeurs sont ensuite utilisées dans le framework de test unitaire (distribué avec l'Atome) afin de déterminer si un test a réussi ou échoué et pour calculer la simulation de la couverture.
OriginalL'auteur Tom
Je ne pense pas que Haskell, ou d'autres Déchets Collectés langues sont très bien adaptés à la dur en temps réel des systèmes, les GC ont tendance à amortir leurs durées courtes pauses.
Écrit 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 génial préprocesseur, et à l'aide de DSEL est comme l'Atome est probablement un excellent moyen de créer de taille durs-en temps réel des systèmes, mais je ne sais pas si l'Atome correspond à la facture ou pas. Si ça ne marche pas, je suis sûr que c'est possible (et j'encourage tous ceux qui n'!) pour mettre en œuvre un DSEL qui ne.
Ayant une très forte pré-processeur comme Haskell, un langage de bas niveau s'ouvre une énorme fenêtre d'opportunité pour mettre en œuvre les abstractions par le biais de la génération de code, qui sont beaucoup plus maladroit lors de la mise en œuvre comme code C générateurs de texte.
> l'Atome est probablement un excellent moyen de créer de taille durs-en temps réel des systèmes, il n'est pas vraiment un "préprocesseur" ifit offre une grammaire, des variables, des fonctions et un système de type. À ce stade, il devient vraiment un langage avec un générateur de code, comme un Atome. Comme pour la création d'importants systèmes: l'Atome est utilisé dans les autobus et les camions à ordures en cours d'exécution dans les rues des villes américaines. Voir Eaton parler à CUFP à ce sujet. Si mettre Haskell EDSLs dans les rues n'est pas prêt pour la production, je ne sais pas ce que c'est.
ok, cela devient de +1 dans mon livre ainsi à un minimum grâce à votre commentaire. Muchas gracias pour le partage de l'expérience pratique. Le temps pour moi de prendre une pause et de ne plus pratiquer.
OriginalL'auteur Peaker
J'ai été faire les fous avec l'Atome. Il est assez cool, mais je pense que c'est mieux pour les petits systèmes. Oui il fonctionne dans les camions et les autobus et les met en œuvre dans le monde réel, les applications critiques, mais cela ne signifie pas que ces applications sont nécessairement de grande taille ou complexes. C'est vraiment dur en temps réel des applications et se donne beaucoup de mal pour faire de chaque opération, prendre exactement le même laps de temps. Par exemple, au lieu de if/else qui exécute de façon conditionnelle de l'une des deux branches de code qui peuvent différer dans le temps d'exécution, il a un "mux" instruction qui s'exécute toujours les deux branches avant conditionnelle de la sélection d'une des deux valeurs calculées (donc le temps d'exécution total est le même selon la valeur choisie). Ce n'est pas une catégorie importante des autres types intégrés (comparable à C) qui sont appliquées par l'intermédiaire GADT valeurs transmises par le biais de l'Atome, à la monade. L'auteur travaille sur une statique outil de vérification qui analyse la sortie du code C, ce qui est plutôt cool (il utilise un solveur SMT), mais je pense que l'Atome serait plus au niveau de la source de fonctionnalités et de contrôles. Même dans mon jouet de la taille de l'application (lampe de poche LED contrôleur), j'ai fait un certain nombre d'erreurs de débutant que quelqu'un de plus expérimenté avec le paquet peut éviter, mais qui a abouti en buggy de code de sortie, que je préfère avoir été pris par le compilateur au lieu de passer par des tests. D'autre part, il est toujours à la version 0.1.quelque chose de si des améliorations sont sans doute à venir.
OriginalL'auteur solrize