De 1970 à environ 2002, les processeurs ont doublé de vitesse tous les 18 mois environ. En tant que programmeur, tout ce que vous aviez à faire était d'attendre et votre programme irait plus vite. Le problème est que vers 2002 les règles ont changé. Maintenant, ils ne font pas de plus gros processeurs rapides, ils font de plus petits processeurs plus lents, mais les mettent en groupes. L'ordinateur sur lequel je travaille a maintenant 4 cœurs et des puces avec jusqu'à 8 cœurs (et 4 threads par cœur) existent. Bientôt, nous aurons des puces avec beaucoup plus de cœurs.
Donc, si vous écrivez un programme qui n'est pas du tout simultané, vous constaterez que vous utilisez 1 cœur ou thread, mais le reste du CPU est assis là à ne rien faire. Donc, si vous avez 16 cœurs, 1 exécutera votre programme et les 15 autres seront assis là!
Le problème avec la concurrence est qu'elle n'est pas déterministe. Cela signifie que vous ne savez pas exactement dans quel ordre les différents threads feront les choses. Traditionnellement, les programmeurs ont essayé de résoudre ce problème en utilisant des verrous et autres. Cela a conduit à BEAUCOUP de douleur. Avoir une forme d'état mutable auquel plus d'un thread peut accéder librement est souvent une formule pour la douleur et les insectes!
Ces derniers temps, la tendance a été de passer à des langages fonctionnels qui contrôlent étroitement l'état mutable. Il existe deux méthodes de base permettant aux langages fonctionnels de gérer la concurrence. La première consiste à utiliser la transmission de messages. Ceci est mieux illustré par Erlang. Dans Erlang, il n'y a en général pas d'état partagé entre les processus. Ils communiquent non pas en partageant la mémoire, mais en passant mes messages. Cela devrait vous sembler logique, car nous le faisons actuellement. Je vous envoie ces informations en vous envoyant un message, pas en vous en souvenant de mon cerveau! En passant au message passant la plupart des bugs de verrouillage disparaissent tout simplement. De plus, les messages peuvent être transmis sur le réseau ainsi que dans un nœud.
L'autre méthode est STM, qui signifie Software Transcriptional Memory, Ceci est présent dans clojure et Haskell (et autres). Dans la mémoire STM est partagée mais les modifications ne peuvent être effectuées que via une transaction. Comme les gens de la base de données ont compris tout cela dans les années 1970, il est assez facile de s'assurer que tout est bien fait.
En fait, j'ai un peu simplifié un peu, Clojure et Haskell peuvent tous deux faire passer des messages, et Erlang peut faire STM.
Clause de non-responsabilité Je suis l'auteur de la programmation des services Web avec Erlang , qui sera disponible en version anticipée dans les prochaines semaines.