Mi programa Erlang favorito (2013)
(joearms.github.io)- Con el alcance de notas proporcionado, no es posible determinar cuál es el programa Erlang del título ni por qué es importante
- El texto verificable consiste principalmente en fragmentos de script de Shell y una breve frase de corrección
- El script recorre archivos
*.png.png.metadel directorio actual y extrae la parte anterior al primer punto del nombre del archivo - El comando que realmente se ejecuta es
git mv $i $j.png.meta, y el comando para cambiar$j.png.pngpor$j.pngsolo se imprime - Como se omitió el fragmento original 5-104, no es posible verificar la afirmación central relacionada con el título ni la explicación del código Erlang
Contenido verificable
- Con el alcance proporcionado, es difícil determinar la identidad de “mi programa Erlang favorito”, la razón de esa preferencia o la estructura del código
- El fragmento de código verificable es un script de Shell para renombrar archivos que comienza con
#!/bin/sh- Recorre archivos
*.png.png.meta - Usa
j="${i%%.*}"para extraer la parte anterior al primer punto del nombre del archivo git mv $i $j.png.metasí se ejecuta realmentegit mv $j.png.png $j.pngsolo se muestra conecho
- Recorre archivos
- Aparece la frase “Actually you don't need the really do this. It should have been water the plants.”, que puede leerse como una corrección indicando que la instrucción o ejemplo anterior en realidad no era necesario y que debería haber sido “water the plants”
- Al final se mencionan juntos Joe Armstrong y Jeremy Ruston
Contexto que limita la evaluación
- Varios fragmentos están compuestos por metadatos de estado/barra lateral de TiddlyWiki, datos Base64 que parecen ser JPEG/PNG y contenido vacío, lo que dificulta extraer hechos del cuerpo principal
- Las notas proporcionadas no incluyen información clave como el funcionamiento del programa Erlang, su código, motivos de diseño, ejemplos, cifras, flujo de trabajo o argumentos principales
- El fragmento del script de Shell también se proporciona solo de manera parcial y sin explicación alrededor, por lo que no se puede determinar con certeza de qué tarea forma parte
Rango omitido
- En la entrada se indica explícitamente que los fragmentos originales 5-104 fueron omitidos por límites de longitud/costo
- Este resumen refleja únicamente el rango de notas proporcionado y no cubre los detalles ni la conclusión del texto completo
1 comentarios
Opiniones de Hacker News
Si el cierre de servidor
Fpudiera recibir, además de sus propios mensajes, el mensaje{become, F}, se podría seguir convirtiendo el servidor en nuevos comportamientos.Es un tema totalmente distinto, pero me quedó el recuerdo de haber hablado con Joe en una conferencia de Erlang. Siempre estaba entusiasmado con la tecnología y estaba dispuesto a conversar con cualquiera. Le entristecía que Windows se volviera peor y menos usable año tras año, y dijo que algún día, para ver un archivo, habría que mirar anuncios durante un rato para desbloquearlo; casi le está atinando. Windows 11 ya tiene anuncios, y para quitarlos hay que buscar a propósito en la configuración, así que para Windows 13 parece que de verdad será así.
Cosas como que un audífono suene mucho más fuerte que el otro, que una app de Microsoft se cierre de forma extraña, que una página de documentación de Windows no abra en ningún navegador y haya que usar un sitio de archivo, o que de pronto no detecte un monitor externo que antes funcionaba bien, o que la pantalla parpadee. Office básicamente te empuja a guardar en la nube en vez de localmente, pero yo preferiría que los archivos fueran local-first y que la nube fuera un respaldo. WSL es bastante tosco, pero aun así es casi la única razón por la que puedo usar Windows.
Siempre escuché que Joe era una gran persona, y me hace sentido. Cuando estaba aprendiendo a programar por mi cuenta, leí su libro de Erlang, y su espíritu juguetón, humildad e imaginación me influyeron mucho. Aunque casi no terminé usando Erlang, sus escritos cambiaron mi forma de pensar sobre el código, y ojalá la cultura de las matemáticas, la ingeniería de software y las ciencias de la computación aceptara más el espíritu juguetón y la humildad.
Un video breve de 35 minutos que explica por qué BEAM es distinta de otras máquinas virtuales como JVM o Node: https://www.youtube.com/watch?v=pO4_Wlq8JeI
Extraño a Joe. Su entusiasmo contagioso por hacer que la computación fuera mejor dejó una huella profunda en mi yo joven y en la forma en que hoy abordo la tecnología.
universal_server() -> receive {become, F} -> F() end.Sinceramente, no termino de entender el poder de este universal_server. Ojalá alguien pudiera explicarlo.
En Erlang se lanzan muchos procesos para resolver problemas, y la mayoría de esos procesos esperan mensajes. La diferencia importante es que los procesos de Erlang pueden ejecutarse sin fricciones también en máquinas remotas. Este proceso recibe un mensaje en forma de tupla con el átomo
becomey una función, y cuando cualquier otro proceso le envía ese mensaje, “se transforma” en esa función.Es decir, puedes reemplazar la lógica del bucle de espera por la lógica del protocolo que quieras. Como ejemplo, se puede poner este bucle en varias máquinas y enviarles una función que implementa un protocolo gossip, pero igual podrías enviarles un mensaje para que se conviertan en un cliente BitTorrent. Joe era un genio y una persona muy amable, y Erlang es una de las creaciones técnicas más hermosas que he visto. Te hace ver la concurrencia de una forma completamente nueva.
receivese parece a una instrucciónswitchsobre mensajes entrantes, pero en realidad es pattern matching.Por ejemplo, puedes crear un servidor de factorial que reciba
{From, N}y devuelva el resultado conFrom ! factorial(N).!es el operador que envía el resultado al proceso de retorno.El código de prueba levanta
universal_server, lo convierte en un servidor de factorial conPid ! {become, fun factorial_server/0}, y luego envía{self(), 50}para recibir el factorial de 50. Una gran ventaja de Erlang es el paralelismo distribuido y las actualizaciones de código en caliente, y aquí se ve como sobrescribir el bucle de recepción deuniversal_servercon el bucle de recepción defactorial_server. Aunque creo que las actualizaciones reales de código en caliente no funcionan exactamente de esta manera.Pero en Erlang puedes crear una red distribuida de servidores Erlang y dejar los servidores como recursos de cómputo de propósito general que pueden hacer lo que el cliente quiera. El código viene del cliente; no hace falta pedirle al administrador del sistema que instale binarios en todas las máquinas, basta con pasar una función y la máquina remota la invoca.
El cliente entrega la función real que ejecutará el servidor, y el proceso de Erlang se convierte en ese servidor con base en esa función. Si además se considera la capacidad de hot reloading de Erlang, esta estructura simple se vuelve todavía más potente. Un proceso de Erlang es un recurso de cómputo que espera trabajo, y si ese trabajo consiste en ejecutar un servidor completo, resulta bastante genial.
Por eso, un proceso puede convertirse en cualquier cosa según el código que le envíes. Si debe controlar un microondas, luego hacer cómputo cuántico y al día siguiente predecir el ganador de un partido de fútbol, le envías el código necesario para cada tarea y lo ejecuta tal cual.
Paso mucho tiempo explicando por qué BEAM es especial y por qué la concurrencia de Erlang/Elixir y similares es distinta de la concurrencia de Go o Java.
Creo que de ahora en adelante bastará con enlazar al programa favorito de Erlang de Joe y a este hilo de HN.
Esta entrada de blog también se trató en una excelente charla reciente: https://youtu.be/pQ0CvjAJXz4
Solo tengo una comprensión de alto nivel del lenguaje Erlang y no he programado directamente en él, pero me da curiosidad por qué es necesario este código
universal_server() -> receive {become, F} -> F() end.Me parece que bastaría con ejecutar
F()directamente en la máquina remota. Como la máquina virtual remota ya tendría que tener el código deF, quizá este ejemplo significa que se serializa y se envía el código deF. Si se encargara de manejar boilerplate común, entendería su utilidad, pero ahora parece que solo espera el mensajebecome Fy luego ejecutaF()Aquí
Fes un closure, así que puede incluir no solo código, sino también las variables capturadas y el entorno del momento en que se creó. Al llamar aF(), se ejecuta ese código y puede acceder al entorno circundante que existía cuando se creóFEn Erlang se pueden enviar closures a través de la red a otros nodos Erlang. Sin embargo, el código de los módulos a los que hace referencia el closure debe estar en todos los nodos. En código de producción, como dices, lo más probable es que se llame directamente al módulo
Fy se pasen los argumentos de forma explícita; esto se parece más a una demostración elegante de lo que es posibleF()puede convertirse en un contexto de nivel superior tan bueno como cualquier contexto anterior, y eso es genialPuedes hacer que las solicitudes existentes se procesen naturalmente con la lógica anterior, mientras que las nuevas comienzan con la lógica nueva, y al final la lógica anterior puede ser recolectada por el garbage collector
F, pero también se puede enviar código a la máquina virtual remotaPor ejemplo, en Elixir puedes obtener el nombre del módulo y el binario de bytecode BEAM con
Code.compile_string. Luego puedes enviar ese bytecode a otra máquina virtual, cargarlo en la máquina virtual remota con:rpc.call('node@remote_host', :code, :load_binary, [the_module_name, "filename_doesnt_really_matter", binary_code])y después ejecutarlo conspawn('node@remote_host', my_module, my_function, [args])Aquí
Fes una variable que representa el nuevo programa serializado y enviado como mensaje entre procesos; en este caso, también se transmite por la redTambién hay una clase en la que Joe explica cómo escribir un servidor básico en Erlang: https://gioorgi.com/2015/erlang-lesson1/
La transcribí a mano y le agregué un poco más de explicación; muestra el poder que tienen los lenguajes asíncronos como Erlang/Elixir frente a otros lenguajes. Lamentablemente, hoy en día no se usan mucho
Últimamente estoy muy metido en Julia, y parece que tomó prestadas bastantes ideas de Erlang para su modelo distribuido
También en Julia se puede reproducir con bastante facilidad este tipo de servidor improvisado que funciona casi mágicamente entre varios nodos. No estoy totalmente seguro, pero me cuesta creer que el módulo
Distributedde Julia no se haya inspirado al menos un poco en ErlangMe encanta Erlang y ojalá tuviera más oportunidades de usarlo, pero también es bueno ver cómo sus conceptos se filtran a otras plataformas