Oltre al fatto che Erlang è stato specificamente sviluppato per essere eseguito in situazioni concomitanti / parallelizzate / distribuite, le due tecniche principali che impiega per renderlo possibile sono:
Nessun effetto collaterale:
Questo significa che quando date a una funzione una parte di dati da eseguire contro, non eccetto in casi molto severi che influenzano qualcos'altro nel sistema / processo in esecuzione. Ciò significa che se si esegue contemporaneamente una funzione 300 volte contemporaneamente, nessuna di queste 300 esecuzioni della funzione avrà effetto su nessuna delle altre.
La tecnica di implementazione per garantire assenza di effetti collaterali è chiamata "immutabilità" che significa grossolanamente, non può essere mutata (modificata). Ciò significa che non appena si crea una variabile, il valore di tale variabile non può essere modificato. Erlang implementa questo comportamento con "assegnazione singola", quindi dopo aver assegnato un valore a una variabile, potresti non assegnargliene più un valore.
X = 1.
X = 2. // This is not a valid operation
Ciò garantisce che nessun codice possa accidentalmente modificare il valore di X causando una condizione di competizione, quindi è intrinsecamente thread-safe e l'uso concorrente diventa banale. Questo è un comportamento molto raro tra i linguaggi del software e il modo più grande in cui Erlang riesce ad essere così adatto per l'esecuzione simultanea.
Il modello degli attori:
Questo è un modo particolare di modellazione che ha dimostrato di rendere l'implementazione e la gestione dell'elaborazione simultanea molto semplice per gli sviluppatori. Direttamente da wikipedia (http://en.wikipedia.org/wiki/Actor_model):
The Actor model adopts the philosophy that everything is an actor.
This is similar to the everything is an object philosophy used by some
object-oriented programming languages, but differs in that
object-oriented software is typically executed sequentially, while the
Actor model is inherently concurrent. An actor is a computational
entity that, in response to a message it receives, can concurrently:
send a finite number of messages to other actors; create a finite
number of new actors; designate the behavior to be used for the next
message it receives. There is no assumed sequence to the above actions
and they could be carried out in parallel. Decoupling the sender from
communications sent was a fundamental advance of the Actor model
enabling asynchronous communication and control structures as patterns
of passing messages.[6]