Meu programa Erlang favorito (2013)
(joearms.github.io)- Apenas com o trecho de notas fornecido, não é possível identificar qual é o programa Erlang do título nem por que ele é importante
- O texto verificável consiste principalmente em trechos de script Shell e uma curta frase de correção
- O script percorre os arquivos
*.png.png.metano diretório atual e extrai a parte do nome antes do primeiro ponto - O comando realmente executado é
git mv $i $j.png.meta, e o comando para trocar$j.png.pngpor$j.pngé apenas exibido na saída - Como o trecho original 5-104 foi omitido, não é possível confirmar a tese central relacionada ao título nem a explicação de qualquer código Erlang
Conteúdo verificável
- Com o material fornecido, é difícil determinar a identidade do “programa Erlang favorito”, os motivos da preferência ou a estrutura do código
- O trecho de código verificável é um script Shell para renomear arquivos que começa com
#!/bin/sh- Ele itera sobre arquivos
*.png.png.meta - Usa
j="${i%%.*}"para extrair a parte do nome antes do primeiro ponto git mv $i $j.png.metaé realmente executadogit mv $j.png.png $j.pngé apenas mostrado comecho
- Ele itera sobre arquivos
- Há a frase “Actually you don't need the really do this. It should have been water the plants.”, que parece corrigir uma instrução ou exemplo anterior, indicando que na verdade isso não era necessário e que deveria ter sido “water the plants”
- No final, Joe Armstrong e Jeremy Ruston são mencionados juntos
Contexto que limita a análise
- Vários trechos são compostos por metadados de estado/barra lateral do TiddlyWiki, dados Base64 que parecem ser JPEG/PNG e conteúdo vazio, o que dificulta extrair fatos do corpo principal
- As notas fornecidas não incluem informações centrais como o funcionamento do programa Erlang, código, motivos de design, exemplos, números, fluxo de trabalho ou argumentos
- O trecho de script Shell também foi fornecido apenas parcialmente e sem explicação ao redor, então não dá para afirmar de que tarefa ele faz parte
Faixa omitida
- A entrada informa explicitamente que os trechos originais 5-104 foram omitidos por limite de tamanho/custo
- Este resumo reflete apenas o intervalo de notas fornecido e não cobre os detalhes nem as conclusões do texto completo
1 comentários
Comentários do Hacker News
Se o closure de servidor
Fpuder receber, além de suas próprias mensagens, uma mensagem{become, F}, dá para ir transformando continuamente o servidor em um novo comportamentoÉ um assunto totalmente diferente, mas ficou na memória uma conversa que tive com Joe em uma conferência de Erlang. Ele estava sempre empolgado com tecnologia e conversava de bom grado com qualquer pessoa. Lamentava que o Windows ficasse pior e menos utilizável a cada ano, e dizia que um dia, para ver um arquivo, seria preciso assistir a anúncios por um tempo até ele ser desbloqueado; ele quase acertou. O Windows 11 já tem anúncios, e para removê-los é preciso procurar deliberadamente nas configurações, então lá pelo Windows 13 acho que isso realmente vai acontecer
Coisas como um lado do fone ficar muito mais alto, apps da Microsoft fecharem de forma esquisita, páginas da documentação do Windows não abrirem em nenhum navegador e eu ter de usar sites de arquivo, um monitor externo que funcionava bem de repente não ser detectado, ou a tela piscar. O Office, por padrão, incentiva a salvar na nuvem em vez de localmente, mas eu prefiro que os arquivos sejam local-first e que a nuvem sirva como backup. O WSL é bem tosco, mas ainda assim é praticamente o único motivo que torna o Windows utilizável
Sempre ouvi dizer que Joe era uma pessoa excelente, e isso faz sentido. Quando eu estava aprendendo programação sozinho, li o livro dele sobre Erlang, e o espírito brincalhão, a humildade e a imaginação dele tiveram um grande impacto. Acabei quase não usando Erlang, mas os textos dele mudaram minha forma de pensar sobre código, e eu gostaria que a cultura da matemática, da engenharia de software e da ciência da computação aceitasse mais brincadeira e humildade
Um vídeo curto, de 35 minutos, explicando por que a BEAM é diferente de outras máquinas virtuais como a JVM ou o Node: https://www.youtube.com/watch?v=pO4_Wlq8JeI
Sinto falta do Joe. A paixão contagiante dele por tornar a computação melhor marcou profundamente quem eu era quando jovem e a forma como abordo tecnologia hoje
universal_server() -> receive {become, F} -> F() end.Sinceramente, não entendo totalmente o poder desse universal_server. Seria ótimo se alguém explicasse
Em Erlang, você resolve problemas iniciando muitos processos, e a maioria deles fica esperando mensagens. A diferença importante é que processos Erlang podem executar de forma transparente também em máquinas remotas. Esse processo recebe uma mensagem em forma de tupla contendo o átomo
becomee uma função; quando outro processo envia essa mensagem a qualquer momento, ele “se transforma” nessa funçãoOu seja, é possível trocar a lógica do loop de espera pela lógica de protocolo que você quiser. No exemplo, eles iniciaram esse loop em várias máquinas e enviaram uma função que implementava um protocolo de gossip, mas do mesmo jeito seria possível enviar uma mensagem para que ele se tornasse um cliente BitTorrent. Joe era um gênio e também uma pessoa muito gentil, e Erlang é uma das criações técnicas mais bonitas que já vi. Ele faz você enxergar concorrência de um jeito completamente novo
receiveé como umswitchpara mensagens recebidas, mas na verdade é pattern matchingPor exemplo, dá para criar um servidor de fatorial que recebe
{From, N}e devolve o resultado comFrom ! factorial(N). O!é o operador que envia o resultado ao processo de retornoO código de teste inicia o
universal_server, faz com que ele vire um servidor de fatorial comPid ! {become, fun factorial_server/0}e então envia{self(), 50}para receber o fatorial de 50. Uma grande vantagem do Erlang é o paralelismo distribuído e as atualizações de código a quente, e aqui isso aparece como a substituição do loop de recebimento douniversal_serverpelo loop de recebimento dofactorial_server. Dito isso, acho que atualizações reais de código a quente não funcionam exatamente dessa formaMas em Erlang você pode criar uma rede distribuída de servidores Erlang e deixar os servidores como recursos computacionais de uso geral, capazes de fazer o que o cliente quiser. O código vem do cliente; em vez de pedir ao administrador do sistema para instalar binários em todas as máquinas, você passa uma função e a máquina remota a chama
A função real que executará o servidor é passada pelo cliente, e o processo Erlang se torna aquele servidor com base nessa função. Considerando ainda a capacidade de hot reloading do Erlang, essa estrutura simples fica ainda mais poderosa. Um processo Erlang é um recurso computacional esperando trabalho; se esse trabalho for executar um servidor completo, isso é bem interessante
Por isso, um processo pode se tornar qualquer coisa dependendo do código que você envia. Se ele precisa controlar um micro-ondas, depois fazer computação quântica e no dia seguinte prever o vencedor de uma partida de futebol, basta enviar o código necessário para cada tarefa e ele executa
Passei muito tempo explicando por que a BEAM é especial e por que a concorrência em Erlang/Elixir etc. é diferente da concorrência em Go ou Java
De agora em diante, acho que basta linkar o programa Erlang favorito do Joe e esta thread do HN
Este post do blog também foi abordado em uma ótima apresentação recente: https://youtu.be/pQ0CvjAJXz4
Tenho apenas uma compreensão de alto nível da linguagem Erlang e nunca programei diretamente nela, mas fiquei curioso sobre por que este código é necessário
universal_server() -> receive {become, F} -> F() end.Fico pensando se não bastaria iniciar
F()diretamente na máquina remota. Como o código deFjá precisaria existir na máquina virtual remota, talvez este exemplo queira dizer que o código deFé serializado e enviado. Se ele trata boilerplate comum, entendo sua utilidade, mas, do jeito que está, parece esperar a mensagembecome Fe então executarF()Aqui,
Fé um closure, então pode incluir não só o código, mas também as variáveis capturadas e o ambiente do momento em que foi criado. Ao chamarF(), esse código é executado e pode acessar o ambiente ao redor de quandoFfoi criadoEm Erlang, é possível enviar closures para outro nó Erlang pela rede. Porém, o código dos módulos referenciados pelo closure precisa existir em todos os nós. Em código de produção, como você disse, é mais provável chamar diretamente o módulo de
Fe passar os argumentos de forma explícita; isto está mais para uma demonstração interessante das possibilidadesF()pode ser um contexto de nível superior tão bom quanto qualquer contexto anterior, o que é ótimoDá para fazer com que requisições existentes sejam tratadas naturalmente pela lógica antiga, enquanto novas requisições começam com a nova lógica e, no fim, a lógica antiga possa ser coletada pelo garbage collector
Fjá precisa existir na máquina virtual remota, mas também é possível enviar código para a máquina virtual remotaPor exemplo, em Elixir, com
Code.compile_string, é possível obter o nome do módulo e o binário do bytecode BEAM. Você pode enviar esse bytecode para outra máquina virtual e carregá-lo na VM remota com:rpc.call('node@remote_host', :code, :load_binary, [the_module_name, "filename_doesnt_really_matter", binary_code]); depois, iniciá-lo comspawn('node@remote_host', my_module, my_function, [args])Aqui,
Fé uma variável que representa o novo programa serializado e enviado como mensagem entre processos; neste caso, ele também é transmitido pela redeTambém há uma palestra em que Joe explica como escrever um servidor básico em Erlang: https://gioorgi.com/2015/erlang-lesson1/
Eu a transcrevi e acrescentei um pouco mais de explicação, e ela mostra a força que linguagens assíncronas como Erlang/Elixir têm em comparação com outras linguagens. Infelizmente, hoje em dia elas não são tão usadas
Ultimamente estou mergulhado em Julia, e parece que ela tomou emprestadas várias ideias de Erlang em seu modelo distribuído
Esses servidores improvisados que funcionam quase por mágica em vários nós também podem ser reproduzidos com bastante facilidade em Julia. Não tenho certeza, mas parece improvável que o módulo
Distributedde Julia não tenha se inspirado nem um pouco em ErlangGosto muito de Erlang e gostaria de ter mais oportunidades de usá-la, mas também é bom ver esses conceitos se infiltrando em outras plataformas