Domanda

Questa può essere una domanda che altri hanno visto, ma sto cercando di trovare un linguaggio progettato per (o con il supporto per la lingua per) la programmazione concorrente che può essere eseguito sulla piattaforma .NET.

ho fatto lo sviluppo lato in Erlang per ottenere un tatto per la lingua e mi è piaciuto come è facile ottenere una concomitante stabile o addirittura sistema distribuito in su. E mi ha portato a scala che aveva anche un sistema di bel utilizzando attori, tuttavia scala.net non sembra avere questa funzionalità attualmente (Concesso questo è un sistema concorrente contro un sistema distribuito). I due linguaggi .NET stavo guardando sono Axum e F #.

Sono queste le uniche scelte che ho? Ci sono gli altri? E, se sono le uniche scelte, quali sono i vantaggi / svantaggi di ciascuno?

È stato utile?

Soluzione

Axum è un progetto di ricerca. A reale progetto di ricerca, in cui solo le idee da esso finiranno in prodotti. (A differenza di F #, che è stato productized nel suo complesso.) Io non sono nemmeno sicuro la licenza permette di utilizzarlo per sviluppare applicazioni di produzione.

F # è una buona scelta.

Clojure funziona anche su CLI, ed è una buona scelta, anche.

Il porto CLI di Scala è attualmente in fase di risorgere (con officiall finanziamenti da Microsoft, in realtà), e le librerie Attore di Scala (sia il built-in uno, così come Akka) sono piuttosto buone.

Per quanto riguarda commento di @ wmeyer sopra: Scala in sé non ha alcuna disposizione per la programmazione distribuita. (Né fa Clojure.) Entrambi genere si basano sulla miriade di framework Java che esistono per questo scopo, come terracotta. Tuttavia, Akka non avere Attori a distanza per la programmazione distribuita, ed è in gran parte Akka API-compatibile con la libreria incorporata Attore Scala, che permette una transizione senza problemi.

Erlang sarebbe genere di freddo. Kresten Krab Thorup sta attualmente lavorando su Erjang, un'implementazione Erlang sulla JVM, e lui ha alcuni risultati piuttosto impressionante: in esecuzione su HotSpot, Erjang scale relativamente alla trave, a volte anche meglio. Ad esempio, nella (in) famoso benchmark processo-ring con 10000 processi, Erjang si avvia solo in minima parte più lento di BEAM, ma quando si ripete diverse volte correre e calci JIT in, è sorpassa BEAM dopo circa 3 corse (e curiosamente , BEAM inizia a rallentare dopo 4 corse).

Sono abbastanza sicuro che si potrebbe costruire un "#rlang" sulla DLR e il TPL che esegue ugualmente bene.

Altri suggerimenti

Sono in realtà usando F # per fare entrambe le concorrenti e distribuiti la programmazione in questo momento. Penso che sta lavorando molto bene. tipi unione rendono facile da definire i messaggi staticamente tipizzati. NET serializzazione è troppo lento per noi, ma la sua sostituzione con parser personalizzato e combinatori unparser è stato facile e la prestazione è ora abbastanza buono. flussi di lavoro asincroni e processori della cassetta postale rendono facile passare i messaggi facilmente intorno. L'inferenza di tipo significa tutta la mia base di codice è piccolo e di facile manutenzione.

Credo che Jörg già risposto alla tua domanda riguardo Axum (e non so molto su di esso), quindi mi limiterò a aggiungere un paio di cose su F # - una cosa da notare è che F # in realtà non è un lingua concorrente. Ha solo buoni librerie per fare lo sviluppo parallelo. Le maggior parte delle opzioni degne di nota sono:

  • Task Parallel biblioteca e PLINQ che sono disponibili in C # troppo, ma può sembrare un posto più bello po 'in F #, soprattutto se si utilizza i tipi di dati immutabili. Ci sono alcune belle F # esempi di utilizzo di questi due in programmazione parallela con .NET e ho scritto un Post sulla # versione F.

  • Asynchronous flussi di lavoro non sono essenzialmente compatibile con la programmazione concorrente - che consentono di scrivere non-blocking codice in generale (che è piuttosto utile nella programmazione concorrente) e permettono di scrivere i calcoli che possono essere avviati e gestiti. È possibile utilizzarli per:

      parallelismo
    • Task-based (un po 'come il Task Parallel Library) usando il metodo StartChild
    • calcoli dei dati in parallelo tramite Async.Parallel
      _
  • programmazione basata su agenti utilizzando il tipo di MailboxProcessor da F # consente di utilizzare la concorrenza message-passing che è molto simile a Erlang. Esso si basa su flussi di lavoro asincroni, che vi dà alcuni vantaggi (ad esempio in attesa di un messaggio è non bloccante).

In sintesi, penso che sia più importante scegliere il giusto parallelo modello di programmazione per il compito che il lingua utilizzato per codificare - fino a quando la lingua dà abbastanza potere di codificare il modello di programmazione. In questo caso, il modello di programmazione modella la mente più che il linguaggio. Axum si basa sul modello di attore (message-passing), quindi penso che con qualche sforzo, si potrebbe avvolgere F # agenti di guardare molto simile alle API Axum.

Dato .NET 4.5 è possibile utilizzare C # asincrona / attendono. Ho cercato di spiegare un threadsafe, attore design basato utilizzando asincrona / attendono. AsyncWcfLib lo scopo di aiutare nella creazione di sistemi concorrenti o distribuiti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top