Qual è lo stato attuale Funzionali Reattivi implementazioni di Programmazione?

Sto cercando di visualizzare alcune semplici automatico sistemi fisici (tali cose come il pendolo, robot, armi,etc.) in Haskell.
Spesso questi sistemi possono essere descritti da equazioni

df/dt = c*f(t) + u(t)

dove u(t) rappresenta una sorta di “controllo intelligente’. Tali sistemi di look si adatta molto bene in Funzionali Reattivi paradigma di Programmazione.

Così ho afferrato il libro “Il Haskell Scuola di Espressione” di Paolo Hudak,
e trovato che il linguaggio specifico dominio “FAL” (per le funzioni di Animazione in Lingua) presentate in realtà funziona abbastanza piacevolmente colpita per il mio semplice giocattolo sistemi (anche se alcune funzioni, in particolare integrate, sembrava essere un po ‘ troppo pigro per usare in modo efficiente, ma facilmente risolvibile).

La mia domanda è, qual è la più matura, più up-to-date, ben tenuto, prestazioni sintonizzati alternativa più avanzate, o anche applicazioni pratiche oggi?

Questa pagina wiki elenca diverse opzioni per Haskell, ma io non sono chiari circa i seguenti aspetti:

  1. Lo status di “reattivo”, il progetto da Conal Eliott che è (da quanto ho capito) uno dei inventers di questo paradigma di programmazione, guarda un po ‘ stantio. Mi piace il suo codice, ma forse dovrei provare altri più up-to-date alternative? Qual è la differenza principale tra loro, in termini di sintassi//prestazioni di runtime di stabilità?
  2. Citare un sondaggio nel 2011, Sezione 6, “… FRP implementazioni non sono ancora abbastanza efficienti o abbastanza prevedibile in termini di prestazioni per essere utilizzata efficacemente in ambiti che richiedono la latenza garanzie …“. Alghough l’indagine suggerisce alcune interessanti ottimizzazioni possibili, dato il fatto che FRP è lì per più di 15 anni, ho l’impressione che questo problema di prestazioni potrebbe essere qualcosa di molto o anche intrinsecamente difficili da risolvere, almeno all’interno di un paio di anni. È vero questo?
  3. Lo stesso autore del sondaggio si parla di “perdite di tempo” nella sua blog. Il problema è unica FRP, o qualcosa di cui siamo in genere quando la programmazione in un puro, camere non-linguaggio rigoroso? Avete mai trovato troppo difficile da stabilizzare un FRP a base di sistema nel corso del tempo, se non è abbastanza performante?
  4. È ancora una ricerca a livello di progetto? Sono le persone come impiantisti, ingegneri robotici, finanziari, tecnici, etc. in realtà il loro utilizzo (in qualsiasi lingua che si adatta alle loro esigenze)?

Anche se io personalmente preferisco un Haskell attuazione, sono aperto ad altri suggerimenti. Per esempio, sarebbe particolarmente divertente avere un’implementazione Erlang — sarebbe molto facile avere una intelligente e adattivo, di auto-apprendimento il processo del server!

InformationsquelleAutor mnish | 2012-11-12

 

3 Replies
  1. 79

    Adesso ci sono principalmente due pratiche Haskell librerie disponibili per funzionali reattivi di programmazione. Entrambi sono gestiti da persone singole, ma di ricevere il codice di contributi da parte di altri Haskell programmatori:

    • Netwire si concentra sull’efficienza, la flessibilità e la prevedibilità. Essa ha il suo evento paradigma e può essere utilizzato in aree in cui i metodi tradizionali di FRP non lavoro, tra cui i servizi di rete e le simulazioni complesse. Stile: applicativi e/o arrowized. Iniziale, autore e responsabile: Ertugrul Söylemez (questo sono io).

    • reattivi-banana si basa sul tradizionale FRP paradigma. Mentre è pratico da utilizzare, serve anche come terra per il classico FRP di ricerca. Il suo obiettivo principale è di interfacce utente e c’è un ready-made interfaccia di wx. Stile: applicativo. Iniziale, autore e responsabile: Heinrich Apfelmus.

    Si dovrebbe provare entrambi, ma a seconda dell’applicazione si può trovare uno o l’altro per essere una migliore vestibilità.

    Per i giochi, di networking, di controllo del robot e simulazioni troverete Netwire per essere utile. Si tratta di ready-made fili per quelle applicazioni, tra cui vari utili differenziali, integrali e un sacco di funzionalità per la trasparente gestione degli eventi. Per un tutorial visita la documentazione del Control.Wire modulo sulla pagina che ho linkato.

    Per le interfacce utente grafiche attualmente la scelta migliore è reattivo-banana. Ha già un wx interfaccia (come una libreria separata reattiva-banana-wx) e Heinrich blog un sacco su FRP, in questo contesto, con esempi di codice.

    Per rispondere alla tua altra domanda: FRP non è adatto in situazioni in cui è necessario in tempo reale la prevedibilità. Questo è in gran parte a causa di Haskell, ma purtroppo FRP è difficile da realizzare nel livello inferiore lingue. Non appena Haskell stessa diventa reale-tempo-pronti, i rinforzi saranno mostrati anche lì. Concettualmente Netwire è pronto per applicazioni in tempo reale.

    Perdite di tempo non sono più un problema, perché sono in gran parte legati all’monadico quadro. Pratico FRP implementazioni semplicemente, non offrono una monadico interfaccia. Yampa ha iniziato questa e Netwire e reattiva-banana sia costruire su questo.

    Non conosco commerciale o di altro tipo su larga scala di progetti mediante l’utilizzo di FRP adesso. Le librerie sono pronti, ma penso che le persone non sono – ancora.

    • Grande risposta, grazie.. sarà un divertente esercizio di implementare una qualche rinforzo algoritmi di apprendimento in cima al tuo grimorio.
    • In particolare, un recente gioco indie scritto in Haskell (Nikki e il Robot) ha preso la decisione, non per l’utilizzo di FRP.
  2. 23

    Anche se ci sono alcune buone risposte già, ho intenzione di tentare di rispondere a domande specifiche.

    1. reattiva non è utilizzabile per progetti seri, dovuti a problemi di perdita. (vedere #3). L’attuale biblioteca con più di design simili sono reattivi, banana, che è stato sviluppato con reattivo come una fonte di ispirazione, e in discussione con Conal Elliott.

    2. Anche se Haskell stesso è inappropriato per hard applicazioni in tempo reale, è possibile utilizzare Haskell per soft applicazioni in tempo reale, in alcuni casi. Non ho familiarità con la ricerca attuale, ma io non credo che questo sia un problema insormontabile. Ho il sospetto che entrambi i sistemi come Yampa, o codice di sistemi di generazione di come Atom, sono forse il miglior approccio per risolvere questo.

    3. Una “perdita di tempo” è un problema specifico di commutabile FRP. La perdita si verifica quando un sistema è in grado di liberare vecchi oggetti perché potrebbe aver bisogno di loro, se un interruttore si verificano, ad un certo punto in futuro. Oltre a una perdita di memoria (che può essere molto grave), un’altra conseguenza è che, quando l’interruttore si verifica, il sistema deve mettere in pausa mentre la catena di oggetti vecchi attraversata per generare corrente stato.

    Non commutabile frp librerie come Yampa e le vecchie versioni di reattivi-banana non soffrono di perdite di tempo. Commutabile frp librerie in genere utilizzano uno dei due regimi, sia che abbiano una speciale creazione “monade” in cui FRP valori sono creati, o fanno uso di un “invecchiamento” del parametro tipo di limite contesti in cui gli interruttori possono verificarsi. elerea (e possibilmente netwire?) l’uso del precedente, considerando che la recente reattiva-banana e pompelmo uso di quest’ultimo.

    Da “commutabile frp”, voglio dire quello che implementa Conal funzione switcher :: Behavior a -> Event (Behavior a) -> Behavior a, identici o semantica. Questo significa che la forma della rete può cambiare dinamicamente come si esegue.

    Questo non contraddice @ertes dichiarazione circa monadico interfacce: si scopre che la fornitura di un Monad esempio per un Event rende perdite di tempo possibile, e con gli approcci di cui sopra non è più possibile definire l’equivalente Monade istanze.

    Infine, anche se c’è ancora un sacco di lavoro ancora da fare con FRP, penso che alcune delle nuove piattaforme (reattivi, banana, elerea, netwire) è stabile e abbastanza maturi che si può costruire affidabili codice da loro. Ma potrebbe essere necessario spendere un sacco di tempo per imparare gli angoli più riposti in ordine per capire come ottenere buone prestazioni.

    • Riguardo la freccia basato su librerie (Yampa, netwire), sono commutabili, troppo. Il motivo è che le frecce hanno invecchiamento built-in, si può effettivamente sbarazzarsi di esso. (Essendo flusso di trasformatori, frecce sono agnostico circa l’orario di inizio del loro flusso di input.)
    • Non dimenticare la reattiva-banana-banana-nemesis: di sodio.
    • questo è un punto interessante. Io in genere non pensare di freccia basato su librerie commutabile nello stesso modo in cui elerea/pompelmo/corrente reattiva-banana sono. Penso che la loro commutazione è molto più vicino a quello che è stato richiesto in precedenti versioni di reattivo di banana. Questa è solo una sensazione, però, io non ho dato abbastanza pensato anche a descrivere ciò che voglio dire.
    • grazie, stavo cercando inutilmente di ricordare quel nome. Sono d’accordo che il sodio deve essere considerato un moderno FRP biblioteca, anche se non così popolare come reattiva-banana.
    • Anche se la discussione è un po ‘ difficile da seguire, sembra indicare che un soft-sistema in tempo reale è infatti possibile, a condizione che il GC tempo, si può in qualche modo essere limitato. Comunque grazie per la grande risposta.
  3. 20

    Io vado a elencare un paio di elementi in Mono .Lo spazio in rete e uno da Haskell spazio che ho trovato non troppo tempo fa. Inizierò con Haskell.

    Olmo – link

    La sua descrizione come per il suo sito:

    Olmo mira a rendere il web front-end di sviluppo più piacevole. Si
    introduce un nuovo approccio alla programmazione di GUI che consente di correggere il
    problemi sistemici di HTML, CSS e JavaScript. Olmo consente di
    rapidamente e facilmente lavorare con il layout visivo, usare la tela, gestire
    complicato l’input dell’utente, e la fuga dalla richiamata inferno.

    Essa ha la sua variante di FRP. Da giocare con i suoi esempi mi sembra abbastanza maturo.

    Reattiva Estensioni – link

    Descrizione da prima pagina:

    Reattiva Estensioni (Rx) è una libreria per la composizione asincrona
    basata su eventi e programmi utilizzando osservabili sequenze e LINQ-stile
    gli operatori di query. Utilizzando Rx, gli sviluppatori di rappresentare i dati in maniera asincrona
    flussi di dati Osservabili, query asincrona flussi di dati con LINQ
    gli operatori, e parametrizzare la concorrenza in asincrono di dati
    flussi utilizzando le utilità di pianificazione. Messo semplicemente, Rx = Osservabili + LINQ +
    Utilità di pianificazione.

    Reattiva Estensioni viene da MSFT e implementa molti ottimi operatori di semplificare la gestione degli eventi. Era open source solo un paio di giorni fa. E ‘ molto maturo e utilizzati nella produzione; a mio parere sarebbe stato più bello API per Windows 8 Api di TPL-biblioteca fornisce; perché osservabili possono essere sia a caldo che a freddo e riprovato/fuse ecc, mentre le attività rappresentano sempre caldo o fatto i calcoli che sono in esecuzione, guasto o completato.

    Ho scritto il codice lato server utilizzando Rx per asynchronocity, ma devo ammettere che la scrittura funzionalmente in C# può essere un po ‘ fastidioso. F# è un paio di wrapper, ma è stato difficile tracciare l’API di sviluppo, in quanto il gruppo è relativamente chiuso e non è promosso da MSFT come di altri progetti.

    Suo l’open source è venuto con l’open source del suo IL-a-JS compilatore, quindi probabilmente potrebbe funzionare bene con JavaScript o Olmo.

    Probabilmente si potrebbe associare F#/C#/JS/Haskell insieme molto bene utilizzando un broker di messaggi, come RabbitMQ e SocksJS.

    Bling UI Toolkit – link

    Descrizione da prima pagina:

    Bling è un C#-based libreria per la facilità di programmazione, immagini, animazioni,
    le interazioni e gli effetti grafici di Microsoft WPF/.NET. Bling è
    orientato verso il design tecnologi, cioè, i progettisti, che a volte
    programma di aiuti per la prototipazione rapida di interfaccia utente ricca di idee di design.
    Gli studenti, gli artisti, i ricercatori e gli appassionati troveranno anche Bling
    utile come strumento per una rapida espressione di idee o visualizzazioni.
    Bling l’Api e i costrutti sono ottimizzati per la programmazione veloce di
    buttare via codice in contrapposizione ad un’attenta programmazione della produzione
    codice.

    Quotidiani LtU articolo.

    L’ho provato, ma non ha lavorato per un progetto client. Sembra fantastico, bel C# overload dell’operatore che forma le associazioni tra i valori. Utilizza le proprietà di dipendenza in WPF/SL/(WinRT) come evento di fonti. Le sue animazioni 3D funziona bene sul ragionevole hardware. Vorrei utilizzare questo se finisco su un progetto necessario per le visualizzazioni; probabilmente il porting per Windows 8.

    ReactiveUI – link

    Paul Betts, in precedenza al MSFT, ora su Github, ha scritto che framework. Ho lavorato con abbastanza ampiamente e come modello. È più disaccoppiato rispetto a Lampeggiare (per sua natura dall’utilizzo di Rx e le sue astrazioni) – rendendo più facile il test delle unità di codice utilizzando di esso. Github git client per Windows è scritto in questo.

    Commenti

    Reattiva modello è performante abbastanza per la maggior parte delle prestazioni di applicazioni che richiedono. Se state pensando di hard real-time, mi piacerebbe scommettere che la maggior parte dei GC-lingue hanno problemi. Rx, ReactiveUI creare una certa quantità di un oggetto di piccole dimensioni che devono essere GCed, perché è così che vengono create sottoscrizioni/smaltiti e i valori intermedi sono avanti nella reattiva “monade” di callback. In generale .Net preferisco reattiva programmazione su attività di programmazione, in quanto richiamate sono statici (noto a tempo di compilazione, senza assegnazione), mentre le attività sono allocate dinamicamente (non è noto, tutte le chiamate bisogno di un esempio, di immondizia creata) e lambda compilare in generato dal compilatore classi.

    Ovviamente C# e F# sono rigorosamente valutati, in modo tempo-perdita non è un problema qui. Stesso per JS. Può essere un problema con replayable o memorizzato nella cache osservabili anche se.

    • Grazie per l’ottima risposta. Una delle cose che mi piaceva per Haskell FRP implementazioni è che sembrano mi permettono di separare correttamente i calcoli per il controllo u(t) e le simulazioni per f(t). È il caso per F# implementazioni?
    • Credo che si può dire che queste due funzioni sono temporaneamente disaccoppiato, sì. Questi probabilmente non sono logicamente disaccoppiato però. 😉
    • Per quanto ne so, Reattiva Estensioni e l’altro più lucido UI–focalizzata pacchetti (e tutto ciò al di fuori di Haskell, in realtà) utilizzare solo evented semanics — che è quello di dire che hanno una nozione di eventi che si può accendere, ma non una nozione di tempo continuo segnali in grado di interagire equationally. Per la costruzione di interfacce grafiche questo è bene, credo. Tuttavia, per la costruzione di simulazioni e modelli, questo può essere un peccato.
    • Si implica che tutti funzionali reattivi di programmazione lib implementazioni bisogno di un modello a tempo continuo, piuttosto che in modo discreto? Ho trovato un foglio chiamato “Processo di Algebra con Cronometraggio: Tempo Reale e Tempo Discreto” – questo è un buon punto di partenza per capire di cosa si sta parlando?
    • Non sto dicendo che tutti devono — alcuni lo fanno, alcuni non. Ma quelle che sono più adatte per determinati compiti, e quelle che non lo sono più adatti per gli altri…

Lascia un commento