Esistono buone librerie Java / JVM per la mia architettura di Expression Tree? [chiuso]

2

Il mio team e io stiamo sviluppando un'applicazione di livello enterprise e ho progettato un'architettura che è stata descritta come un "albero delle espressioni". L'idea di base è che i nodi foglia dell'albero sono espressioni molto semplici (forse semplici valori o stringhe). I nodi più vicini al tronco diventeranno sempre più complessi, prendendo i nodi più semplici come input e restituendo risultati più complessi per i loro genitori.

Guardando dall'altra parte, l'applicazione esegue alcune attività e per questo crea un'espressione root. L'espressione radice divide il suo input in unità più piccole e crea espressioni figlio che, una volta valutata, possono essere utilizzate per creare il proprio risultato. Il processo di suddivisione continua fino ai nodi foglia più semplici.

Ci sono due aspetti molto importanti di questa architettura:

  • Deve essere possibile manipolare i nodi dell'albero dopo che è stato creato. I nodi possono ricevere nuovi valori di input con cui lavorare e qualsiasi modifica nel risultato per quel nodo deve essere propagata di nuovo sull'albero al nodo radice.

  • L'applicazione deve sfruttare al meglio i processori disponibili e, in ultima analisi, essere scalabile per altri computer in una griglia o nel cloud. I nodi dell'albero si aggiornano spesso e notificano altri nodi interessati nell'albero quando ottengono un nuovo valore.

Sfortunatamente, non sono libero di discutere la mia effettiva applicazione, ma per facilitare un po 'la comprensione, potresti immaginare una specie di applicazione per fogli elettronici implementata con un'architettura simile, in cui le modifiche alle celle nella tabella vengono propagate tutte sopra il posto ad altre cellule che hanno bisogno del risultato. Il foglio di calcolo potrebbe diventare così massiccio che l'applicazione di un sistema multi-core multi-computer distribuito per risolverlo sarebbe di beneficio.

Il mio prototipo "Expression Engine" funziona bene su un singolo PC multi-core ma ho iniziato a riscontrare alcuni problemi di concorrenza (come previsto perché finora non mi sono occupato troppo) quindi è giunto il momento di iniziare a pensare di migrare il motore a una libreria più solida e questo porta a una serie di domande correlate:

  1. Esiste un precedente per la mia architettura "Expression Tree" che potrei ricercare?

  2. Quali concetti di programmazione dovrei prendere in considerazione. Mi rendo conto che questo approccio ha molte somiglianze con uno stile di programmazione funzionale, e sono già consapevole dei concetti di utilizzo di futures e attori. Ce ne sono altri?

  3. Ci sono lingue o librerie che dovrei studiare? Questa domanda è ispirata dalla mia scoperta accidentale di Scala e della libreria di Akka (che ha un buon supporto per gli attori, i futures, i carichi di lavoro distribuiti, ecc.) E mi chiedo se c'è qualcos'altro che dovrei guardare anche io?

posta Dave Hartnoll 26.10.2011 - 01:42
fonte

2 risposte

3

Mi sembra che tu abbia reinventato Lisp . Ha alberi di operatori e dati che vengono combinati in espressioni sempre più grandi. Ti suggerisco di dare un'occhiata a Clojure . Clojure è un Lisp per lo scopo JVM costruito per affrontare la programmazione funzionale con una pesante concorrenza fin dall'inizio.

    
risposta data 26.10.2011 - 02:16
fonte
2

Questo sembra un ottimo caso d'uso per Clojure. Punti rapidi:

  • Linguaggio funzionale (pigro, impuro): l'idioma dominante per la creazione di programmi consiste nel comporre le funzioni in modo molto simile ai tuoi alberi di espressione.
  • Lisp - come linguaggio omoiconico è perfetto per la generazione di codice e le DSL
  • Lingua JVM con accesso molto semplice a tutte le librerie e gli strumenti Java
  • Incredibili funzioni di concorrenza - guarda questo video
  • Sviluppo interattivo (capacità di interagire con il programma in esecuzione tramite REPL, ridefinendo gli oggetti al volo ecc.)
  • Digitato dinamicamente

Inoltre, sembra che tu stia descrivendo un'architettura Dataflow Architecture . Ci sono stati molti studi su questi approcci e sono davvero adatti a molti campi. Se si desidera implementare un'architettura di flusso di dati distribuita utilizzando tali "Expression Trees", è possibile creare quanto segue:

  • Clojure per la definizione del linguaggio dell'albero delle espressioni core
  • Storm libreria per l'elaborazione distribuita
  • Incanter per statistiche, elaborazione dati e visualizzazione
risposta data 25.11.2011 - 09:37
fonte

Leggi altre domande sui tag