1148 votes

Qu'est-ce que (fonctionnelle) de réactif de programmation?

J'ai lu l'article de Wikipedia sur la programmation réactive. J'ai aussi lu le petit article sur fonctionnel réactif de programmation. Les descriptions sont assez abstrait.

Ce n'fonctionnel réactif de programmation (PRF) signifie dans la pratique? Ce n'réactif de programmation (par opposition à la non-réactif de programmation?) composé de? Mon fond est impératif/OO langues, donc une explication qui se rapporte à ce paradigme serait appréciée.

931voto

Conal Points 9874

Si vous souhaitez obtenir une sensation pour le fibre de verre, vous pourriez commencer avec l'ancien Fran tutoriel à partir de 1998, qui a des illustrations animées. Pour les livres, commencer avec Fonctionnel Réactif de l'Animation et le suivi des liens sur le lien publications sur ma page d'accueil et le PRF lien sur le Haskell wiki.

Personnellement, j'aime à penser à ce que les PRF moyens, plutôt que la façon dont elle pourrait être mise en œuvre. Donc, je ne décrivent pas PRF dans la représentation/mise en œuvre des termes que Thomas K dans une autre réponse (graphiques, des nœuds, arêtes, de tir, de l'exécution, etc). Il existe de nombreux styles de mise en œuvre, mais pas de la mise en œuvre dit ce PRF est.

Je ne résonnent avec Laurence G est simple description de FRP est sur "les types de données qui représentent une valeur 'dans le temps' ". Classiques de programmation impératif capture dynamique de ces valeurs ne sont qu'indirectement, par l'intermédiaire de l'état et des mutations. L'histoire complète (passé, présent, futur) n'a pas de première classe de la représentation. En outre, seulement discrètement l'évolution des valeurs peut être (indirectement) capturés, depuis l'impératif de paradigme est temporellement discrète. En revanche, les PRF capture à l'évolution des valeurs directement et n'a pas de difficulté avec en permanence l'évolution des valeurs.

FRP est également inhabituel en ce qu'il est simultanées sans aller à l'encontre de la partie théorique et pragmatique des rats nid que fléaux impératif de la concurrence. Sémantiquement, PRF simultanéité est fine, déterminée, et continue. (Je parle de la signification, pas de mise en œuvre. Une mise en œuvre peut ou peut ne pas impliquer de la simultanéité ou de parallélisme.) Sémantique déterminisme est très important pour le raisonnement, à la fois rigoureux et informelle. Alors que la simultanéité ajoute une énorme complexité de la programmation impérative (en raison de non-déterministes interleaving), c'est sans effort dans les PRF.

Alors, qu'est-PRF? Vous pourriez avoir inventé vous-même. Commencez avec ces idées:

  • Dynamique et de l'évolution des valeurs (c'est à dire, les valeurs de "plus de temps") sont de première classe, des valeurs en elles-mêmes. Vous pouvez les définir et de les combiner, de les transmettre dans et hors de fonctions. J'ai appelé ces choses "comportements".

  • Les comportements sont construites à partir de quelques primitives, comme constante (statique) des comportements et de l'heure (comme une horloge), puis avec séquentielle et parallèle combinaison. n les comportements sont combinées par l'application d'un n-aire fonction (à valeurs statiques), "point-sage", c'est à dire, en continu au fil du temps.

  • Pour rendre compte de phénomènes discrets, ont un autre type (famille) des "événements", dont chacune a un flux (finie ou infinie) d'occurrences. Chaque événement est associé à un temps et de valeur.

  • À venir avec la composition de vocabulaire à partir de laquelle tous les comportements et les événements peuvent être construits, de jouer avec quelques exemples. Garder la déconstruction en morceaux qui sont plus générales/simple.

  • De sorte que vous savez que vous êtes sur la terre ferme, donnent à l'ensemble un modèle de composition de la fondation, en utilisant la technique de denotational sémantique, ce qui signifie simplement que (un) de chaque type correspond à un de simple et de mathématique précise le type de "sens", et (b) chaque primitive et l'opérateur a un de simple et de sens précis en fonction de la signification des mandants. Jamais, jamais mélanger les considérations de mise en œuvre dans votre processus d'exploration. Si cette description est du charabia pour vous, consultez (a) Denotational de conception de type de classe morphisms, (b) Push-pull fonctionnel réactif de programmation (en ignorant la mise en œuvre bits), et (c) la Denotational Sémantique Haskell wikibooks page. Méfiez-vous que denotational sémantique est en deux parties, à partir de ses deux fondateurs Christopher Strachey et Dana Scott: le plus facile & plus utile Strachey partie et la plus difficile et la moins utile (pour la conception de logiciels) Scott.

Si vous vous en tenez à ces principes, je m'attends à obtenir quelque chose de plus ou moins dans l'esprit de FRP.

Où avais-je obtenir ces principes? Dans la conception de logiciel, je demande toujours la même question: "que signifie-t-il?". Denotational sémantique m'a donné un cadre précis pour cette question, et celle qui correspond à mon esthétique (contrairement à opérationnelles ou de la sémantique axiomatique, qui me laisse insatisfaits). Alors je me suis demandé qu'est-ce que le comportement? J'ai vite réalisé que le temporellement nature discrète de l'impératif de calcul est une adaptation à un style particulier de la machine, plutôt que d'un naturel description du comportement lui-même. Le plus simple description précise de comportement à laquelle je pense est tout simplement "fonction (continue) de temps", c'est mon modèle. Délicieusement, ce modèle gère en continu, déterministe de la simultanéité avec la facilité et la grâce.

C'est tout un défi pour mettre en œuvre ce modèle correctement et efficacement, mais c'est une autre histoire.

739voto

Laurence Gonsalves Points 50783

Dans la pure programmation fonctionnelle, il n'y a pas d'effets secondaires. Pour de nombreux types de logiciels (par exemple, tout à l'interaction de l'utilisateur) les effets secondaires sont nécessaire à un certain niveau.

Une manière d'obtenir des effets secondaires comme le comportement, tout en conservant un style fonctionnel est d'utiliser fonctionnel réactif de programmation. C'est la combinaison de la programmation fonctionnelle et programmation réactive. (L'article de Wikipédia vous-même liée à ce sujet.)

L'idée de base derrière réactif de programmation est qu'il y a certains types de données qui représentent une valeur "au fil du temps". Les calculs qui impliquent ces changements de temps les valeurs elles-mêmes ont des valeurs qui changent au fil du temps.

Par exemple, vous pouvez représenter les coordonnées de la souris comme une paire de entier-plus de valeurs de temps. Disons que nous avons eu quelque chose comme (c'est un pseudo-code):

x = <mouse-x>;
y = <mouse-y>;

À tout moment dans le temps, x et y aurait les coordonnées de la souris. Contrairement à la non-réactif de programmation, nous avons seulement besoin de faire de cette mission une fois, et les variables x et y resteront "à jour" automatiquement. C'est pourquoi réactif de programmation et programmation fonctionnelle travaillent si bien ensemble: réactif de programmation élimine le besoin de muter les variables tout en laissant vous faire beaucoup de ce que vous pourriez accomplir avec la variable de mutations.

Si l'on puis faire quelques calculs sur cette base, les valeurs obtenues seront également des valeurs qui changent au fil du temps. Par exemple:

minX = x - 16;
minY = y - 16;
maxX = x + 16;
maxY = y + 16;

Dans cet exemple, minX sera toujours 16 de moins que la coordonnée x du pointeur de la souris. Avec réactif en conscience des bibliothèques, vous pouvez dire quelque chose comme:

rectangle(minX, minY, maxX, maxY)

Et 32x32 boîte sera tracée autour du pointeur de la souris et va le suivre partout où il se déplace.

Voici un très bon papier sur fonctionnel réactif de programmation.

131voto

user712092 Points 789

Pour moi, il est d'environ 2 sens du symbole =:

  1. En mathématiques, x = sin(t) signifie, que x est l' autre nom pour l' sin(t). Ainsi écrit x + y est la même chose que sin(t) + y. Fonctionnel réactif de programmation est comme les maths à cet égard: si vous écrivez x + y, il est calculé avec la valeur de t est au moment où il est utilisé.
  2. C-comme les langages de programmation (langages), x = sin(t) une mission: il signifie que l' x stocke la valeur de sin(t) prises au moment de la cession.

71voto

Thomas Kammeyer Points 2743

OK, à partir des connaissances de base et à la lecture de la page Wikipedia à qui vous l'avez souligné, il semble que réactif de programmation est quelque chose comme des flux de données, de l'informatique, mais avec externe spécifique "stimuli" le déclenchement d'un ensemble de nœuds à feu et à effectuer leurs calculs.

C'est assez bien adapté à la conception de l'INTERFACE utilisateur, par exemple, en ce qui touche un contrôle de l'interface utilisateur (par exemple, le contrôle du volume sur une application de lecture de musique) peut-être besoin de mettre à jour les différents éléments d'affichage et le volume de la sortie audio. Lorsque vous modifiez le volume (un curseur, disons) qui correspondrait à la modification de la valeur associée à un nœud dans un graphe orienté.

Différents nœuds ayant les bords de ce "volume valeur" nœud sera automatiquement déclenchée et, au besoin, les calculs et les mises à jour devraient naturellement se propagent par le biais de l'application. L'application "réagit" à l'utilisateur de relance. Fonctionnel réactif de programmation serait juste de la mise en œuvre de cette idée dans un langage fonctionnel, plus généralement, à l'intérieur d'un paradigme de la programmation fonctionnelle.

Pour en savoir plus sur "flux de données" l'informatique, recherche pour ces deux mots sur Wikipédia ou à l'aide de votre moteur de recherche préféré. Voici l'idée générale: le programme est un graphe orienté de nœuds, chacun effectuant un simple calcul. Ces nœuds sont reliés les uns aux autres par le graphique des liens qui fournissent les sorties de certains nœuds aux entrées des autres.

Lorsqu'un nœud incendies ou effectue son calcul, les nœuds sont connectés aux sorties ont leurs entrées correspondantes "déclenché" ou "marqué". Tout nœud ayant toutes les entrées déclenché/marqué/disponible déclenche automatiquement. Le graphique peut être implicite ou explicite selon exactement comment réactif de programmation est mis en œuvre.

Les nœuds peuvent être regardé comme un tir en parallèle, mais souvent, ils sont exécutés en série ou avec peu de parallélisme (par exemple, il peut y avoir un peu de threads d'exécution). Un exemple célèbre est le Manchester de Flux de données de la Machine, qui (IIRC) utilisé marqué l'architecture de données pour planifier l'exécution de nœuds dans le graphe par une ou plusieurs unités d'exécution. Des flux de données, le calcul est assez bien adapté aux situations dans lesquelles le déclenchement des calculs de manière asynchrone donnant lieu à des cascades de calculs fonctionne mieux que d'essayer d'exécution régi par une horloge (ou les horloges).

Réactif de programmation des importations de cette "cascade de l'exécution" idée et semble penser de ce programme dans un flux de données comme la mode, mais à la condition que certains nœuds sont accrochés au "monde extérieur" et des cascades, de l'exécution est déclenchée lorsque ces sensori-comme les nœuds de changement. L'exécution du programme ressemblerait à quelque chose d'analogue à un complexe arc réflexe. Le programme peut ou peut ne pas être essentiellement sessiles entre les stimuli ou de régler dans un essentiellement sessiles état entre les stimuli.

"non réactif" de la programmation la programmation avec une vision très différente de l'écoulement de l'exécution et de la relation à des intrants extérieurs. Il est susceptible d'être quelque peu subjective, puisque les gens seront probablement tentés de dire quelque chose qui répond à des intrants extérieurs "réagit". Mais en regardant l'esprit de la chose, un programme qui interroge un événement de la file d'attente à un intervalle fixe et distribue tous les événements trouvé de fonctions (ou threads) est moins réactif (car il ne s'occupe de la saisie de l'utilisateur à un intervalle fixe). Encore une fois, c'est l'esprit de la chose: on peut imaginer de placer un bureau de vote de la mise en œuvre rapide de l'intervalle d'interrogation dans un système à un niveau très bas et le programme d'une manière réactive sur le dessus de cela.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X