Mon programme Erlang préféré (2013)
(joearms.github.io)- Avec la seule plage de notes fournie, il est impossible de déterminer ce qu’est le programme Erlang du titre ni pourquoi il est important
- Le texte vérifiable se limite surtout à des fragments de script Shell et à une courte phrase de correction
- Le script parcourt les fichiers
*.png.png.metadu répertoire courant et extrait de leur nom la partie située avant le premier point - La commande réellement exécutée est
git mv $i $j.png.meta, tandis que la commande qui remplacerait$j.png.pngpar$j.pngest seulement affichée - Comme les chunks originaux 5-104 sont omis, il est impossible de vérifier l’argument central lié au titre ou toute explication du code Erlang
Contenu vérifiable
- Avec la seule plage fournie, il est difficile d’identifier ce qu’est le « programme Erlang préféré », pourquoi il est apprécié ou quelle est sa structure
- Le fragment de code vérifiable est un script Shell de renommage de fichiers commençant par
#!/bin/sh- Il boucle sur les fichiers
*.png.png.meta j="${i%%.*}"extrait du nom de fichier la partie avant le premier pointgit mv $i $j.png.metaest réellement exécutégit mv $j.png.png $j.pngn’est qu’affiché viaecho
- Il boucle sur les fichiers
- La phrase « Actually you don't need the really do this. It should have been water the plants. » apparaît et peut être lue comme une correction indiquant que l’instruction ou l’exemple précédent n’était en réalité pas nécessaire et qu’il aurait fallu écrire « water the plants »
- À la fin, Joe Armstrong et Jeremy Ruston sont mentionnés ensemble
Contexte qui limite l’analyse
- Plusieurs chunks se composent de métadonnées d’état/barre latérale TiddlyWiki, de données Base64 ressemblant à du JPEG/PNG, ou de contenu vide, ce qui rend l’extraction des faits du corps du texte difficile
- Les notes fournies ne contiennent pas les informations essentielles sur le fonctionnement du programme Erlang, son code, ses raisons de conception, ses exemples, ses chiffres, son workflow ou ses thèses
- Même le fragment de script Shell n’est fourni qu’en partie et sans explication contextuelle, ce qui empêche de déterminer avec certitude à quelle tâche il appartient
Plage omise
- L’entrée indique explicitement que les chunks originaux 5-104 ont été omis en raison de limites de longueur/coût
- Ce résumé reflète uniquement la plage de notes fournie et ne couvre ni les détails ni la conclusion du texte complet
1 commentaires
Commentaires Hacker News
Si la closure serveur
Fpeut recevoir, en plus de ses propres messages, un message{become, F}, alors on peut continuer à transformer le serveur en de nouveaux comportementsRien à voir, mais je garde le souvenir d’une conversation avec Joe lors d’une conférence Erlang. Il était toujours enthousiaste à propos de la technologie et prêt à parler avec n’importe qui. Il regrettait que Windows devienne chaque année pire et moins utilisable, et disait qu’un jour, pour consulter un fichier, il faudrait regarder des publicités pendant un moment avant qu’il ne soit déverrouillé ; il n’était pas loin. Windows 11 contient déjà des pubs, et il faut aller délibérément fouiller dans les paramètres pour les supprimer, donc vers Windows 13 cela pourrait vraiment se produire
Le son beaucoup plus fort dans un seul écouteur, des applis Microsoft qui plantent bizarrement, des pages de documentation Windows qui ne s’ouvrent dans aucun navigateur et obligent à utiliser un site d’archive, un écran externe auparavant bien détecté qui ne l’est soudainement plus, ou un écran qui clignote. Office pousse par défaut à enregistrer dans le cloud plutôt qu’en local, alors que je préférerais que les fichiers soient local first et que le cloud serve de sauvegarde. WSL est assez bancal, mais c’est à peu près la seule raison qui rend encore Windows utilisable
J’ai toujours entendu dire que Joe était quelqu’un de formidable, et je le comprends. Quand j’ai appris à coder en autodidacte, j’ai lu son livre sur Erlang, et son côté joueur, son humilité et son imagination m’ont beaucoup marqué. Je n’ai presque jamais fini par utiliser Erlang, mais ses écrits ont changé ma façon de penser le code, et j’aimerais que les cultures des maths, du génie logiciel et de l’informatique accueillent davantage l’esprit joueur et l’humilité
Une courte vidéo de présentation de 35 minutes expliquant en quoi BEAM diffère d’autres machines virtuelles comme la JVM ou Node : https://www.youtube.com/watch?v=pO4_Wlq8JeI
Joe me manque. Sa passion contagieuse pour rendre l’informatique meilleure a profondément marqué le jeune que j’étais et ma manière actuelle d’aborder la technologie
universal_server() -> receive {become, F} -> F() end.Honnêtement, je ne comprends pas complètement la puissance de ce universal_server. J’aimerais que quelqu’un me l’explique
En Erlang, on lance beaucoup de processus pour résoudre un problème, et la plupart attendent des messages. La différence importante est qu’un processus Erlang peut aussi s’exécuter de façon transparente sur une machine distante. Ce processus reçoit un message sous forme de tuple contenant l’atome
becomeet une fonction, et lorsqu’un autre processus lui envoie ce message, il « devient » cette fonctionAutrement dit, on peut remplacer la logique de la boucle d’attente par la logique de protocole que l’on veut. Dans l’exemple, on lance cette boucle sur plusieurs machines et on lui envoie une fonction implémentant un protocole de gossip, mais on pourrait tout aussi bien envoyer un message qui en fait un client BitTorrent. Joe était un génie et quelqu’un de très bienveillant, et Erlang est l’une des créations techniques les plus belles que j’aie vues. Cela fait voir la concurrence d’une manière complètement nouvelle
receiveressemble à unswitchsur les messages entrants, mais c’est en réalité du pattern matchingPar exemple, on peut créer un serveur de factorielle qui reçoit
{From, N}et renvoie le résultat avecFrom ! factorial(N).!est l’opérateur qui envoie le résultat au processus de retourLe code de test lance
universal_server, le transforme en serveur de factorielle avecPid ! {become, fun factorial_server/0}, puis envoie{self(), 50}pour récupérer la factorielle de 50. Les grands atouts d’Erlang sont le parallélisme distribué et les mises à jour de code à chaud, et ici cela se manifeste comme le remplacement de la boucle de réception deuniversal_serverpar celle defactorial_server. Cela dit, je ne pense pas que les vraies mises à jour de code à chaud fonctionnent exactement de cette façonMais avec Erlang, on peut créer un réseau distribué de serveurs Erlang et laisser les serveurs comme des ressources de calcul génériques capables d’exécuter ce que le client souhaite. Le code vient du client : au lieu de demander à un administrateur système d’installer un binaire sur toutes les machines, on transmet une fonction et la machine distante l’appelle
La fonction réelle qui exécutera le serveur est transmise par le client, et le processus Erlang devient ce serveur à partir de cette fonction. Si l’on tient compte des capacités de hot reloading d’Erlang, cette structure simple devient encore plus puissante. Un processus Erlang est une ressource de calcul qui attend du travail, et si ce travail consiste à exécuter un serveur complet, c’est plutôt élégant
Un processus peut donc devenir n’importe quoi selon le code qu’on lui envoie. Si vous devez contrôler un four à micro-ondes, puis effectuer du calcul quantique, puis prédire le vainqueur d’un match de football le lendemain, il suffit d’envoyer le code nécessaire à chaque tâche et il l’exécute
Je passe beaucoup de temps à expliquer pourquoi BEAM est spécial, et pourquoi la concurrence d’Erlang/Elixir, entre autres, diffère de celle de Go ou Java
À partir de maintenant, je pense qu’il suffira de mettre un lien vers le programme Erlang préféré de Joe et vers ce fil HN
Ce billet de blog a aussi été abordé dans une excellente présentation récente : https://youtu.be/pQ0CvjAJXz4
Je n’ai qu’une compréhension de haut niveau d’Erlang et je n’ai jamais vraiment programmé avec, donc je me demande pourquoi ce code est nécessaire
universal_server() -> receive {become, F} -> F() end.J’aurais tendance à penser qu’il suffirait de lancer directement
F()sur la machine distante. Comme le code deFdoit déjà être présent sur la machine virtuelle distante, cet exemple veut peut-être dire que le code deFest sérialisé et transmis. Si cela sert à gérer du boilerplate commun, j’en comprends l’utilité, mais pour l’instant cela ressemble à un processus qui attend un messagebecome Fpuis exécuteF()Ici,
Fest une fermeture : elle peut donc contenir non seulement du code, mais aussi les variables capturées et l’environnement au moment de sa création. Quand on appelleF(), ce code s’exécute et peut accéder au contexte environnant qui existait lorsqueFa été crééeEn Erlang, on peut envoyer des fermetures à un autre nœud Erlang via le réseau. En revanche, le code des modules référencés par la fermeture doit être présent sur tous les nœuds. Dans du code de production, comme vous le dites, on appellerait plus probablement directement le module de
Fen passant explicitement les arguments ; ici, c’est plutôt une belle démonstration de ce qui est possibleF()peut devenir un contexte de premier niveau tout aussi valable que n’importe quel contexte précédentOn peut ainsi laisser les requêtes existantes être traitées naturellement par l’ancienne logique, tandis que les nouvelles démarrent avec la nouvelle logique, et l’ancienne logique finira par être collectée par le garbage collector
Fdoit déjà être présent sur la machine virtuelle distante, mais on peut aussi envoyer du code à cette machine virtuellePar exemple, en Elixir,
Code.compile_stringpermet d’obtenir un nom de module et un binaire de bytecode BEAM. On peut envoyer ce bytecode à une autre machine virtuelle, le charger sur la machine virtuelle distante avec:rpc.call('node@remote_host', :code, :load_binary, [the_module_name, "filename_doesnt_really_matter", binary_code]), puis le lancer avecspawn('node@remote_host', my_module, my_function, [args])Ici,
Fest une variable représentant le nouveau programme sérialisé et envoyé sous forme de message entre processus ; dans ce cas, il est aussi transmis via le réseauIl existe aussi un cours où Joe explique comment écrire un serveur de base en Erlang : https://gioorgi.com/2015/erlang-lesson1/
Je l’ai transcrit et un peu davantage expliqué ; cela montre la puissance des langages asynchrones comme Erlang/Elixir par rapport aux autres langages. Malheureusement, ils ne sont plus beaucoup utilisés aujourd’hui
Ces derniers temps, je me suis pris de passion pour Julia, et son modèle distribué semble pas mal emprunter aux idées d’Erlang
On peut assez facilement reproduire dans Julia ce genre de serveur improvisé qui fonctionne comme par magie sur plusieurs nœuds. Je n’en suis pas certain, mais il me semble difficile d’imaginer que le module
Distributedde Julia n’ait pas été inspiré, au moins un peu, par ErlangJ’aime vraiment Erlang et j’aimerais avoir davantage d’occasions de l’utiliser, mais c’est aussi agréable de voir ses concepts infuser dans d’autres plateformes