BEAM VM 的优点、缺点和缺点
VMBEAM
是最终的目标,新的技术的出现使我们能够利用编译目标或记录功能的算法。与 VM 和 Beeeem Antiga 一样,爱立信于1986 年向 Erlang语言发送了一份法律声明,该技术论坛作为环境电信环境中应用的主要主角,而 com 则要求第二个形式的机密和性能。
近十年来,我在何塞·瓦利姆 (José Valim) 的第一个网页上考虑了这一点,并在 2011 年的 Meados 中使用了一种语言ElixirBEAM
,以实现现代语言的目标和发展经验。这个语言是对虚拟游戏的普及和支持的回应,但它不是最重要的,不是有什么意义吗? 👀
最后...Por que essa maquina virtual foi criada? quais suas vantagens, poderes eo mais importante: quais seus segredos? Nesse artigo vamos nos aventurar brevemente nos detalhes dessa VM,vem que vem!
目录
- 为什么是 BEAM
- 堆栈机 vs 寄存器机
- O que significa ser simultâneo por padrão
- Um caso interessante para fazer 节点 interagirem pela rede
- 结论
为什么是 BEAM
BEAM
OTP 系统的组成部分与 Java 的 JVM 功能有关,其目标原则是性能、一致性、错误容忍度以及执行器计算线程级别的一致性或最大可能性。
Interagir 的 VM 模式有 2 种原则:
- 1. Compilar uma linguagem X para Erlang e utilizar o próprio compilador do Erlang para gerar o bytecode
*.beam
(Como é o caso da linguagem gleam que possui Erlang como um de seus Targets) - 2. 编译 uma linguagem X para o bytecode
*.beam
de forma direta (Como é o caso do elixir)
最后一个执行层的说明,以及应用程序BEAM
Erlang/Elixir/Gleam 执行过程中的组件的说明,没有关于虚拟机执行的图表:
node*
作为一个可能的观察者,BEAM 运行时 Erlang (ERTS) 的核心以及独立于 VM的应用程序代码的结果。
节点* Pode Ser entendido de maneira breve como uma thread do sistema opacional。 Cada 节点中的进程数以千计的速度和进程的线程级别为 imitam 或 comportamento de uma nativa do sistema operacional possuindo possuindo as seguintes capacidades: 通信入口 si por meio de 信号、执行计算和启动进程。
堆栈机 vs 寄存器机
Bom,eu poderia simplesmente te dizer que a BEAM uma maquina de registros com capacidades de uma maquina de stack,mas isso não seria muito útil né? Então vamos voltar do começo e entender o que é cada coisa:
什么叫堆栈机
堆栈机是一种解释器的形式,它是一种简单的理解模型的方法,是最终的人类理解的超级简单模型,在 2 种原理上考虑 FIFO 模型:
- 1.
push
: Insere um valor na fila - 2.
pop
:Tira um valor da fila
Mas...só isso?SIM!! Com esse conceito podemos traduzir aexpressão 2 + 2
como se fosseterpretada por uma stack machine 👇:
push 2
push 2
add
É eu sei, tem uma palavra add
ali né? Mas ela está completamente alinhada com o conceito de stack não se preocupe, nese caso add
orepresenta uma chamada de uma função e tudo o que ela faz éremoval os argumentos da pilha (utilizando pop
) and depois adicionar o resultado da operação de volta a fila (utilizando push
), abaixo Podemos ver em mais detalhes esse processo:
push 2 #=> Adiciona 2 a stack
push 2 #=> Adiciona 2 a stack
add #=> detalhe da execução abaixo
pop #=> Remove argumento da stack
pop #=> Remove argumento da stack
push 4 #=> Adiciona o resultado 4 a stack
什么是收银机
不同的堆栈机、注册机使用不同的注册机来注册不同的结果,并在不同的注册机中使用不同的注册机(BEAM utiliza um registro X0
paraguardar resultados de)计算)。
注册商的能力、注册机的操作能力、注册者的资格move
以及swap
特定形式的注册者的价值:
{function, add, 2, 2}.
{label,1}.
{line,[{location,"add.erl",4}]}.
{func_info,{atom,add},{atom,add},2}.
{label,2}.
{allocate,1,2}. #=> Prepara um lugar na memoria para eventualmente armazenar os valores
{move,{x,1},{y,0}}. #=> Copia o argumento da função (salvo automaticamente no registrador x) para um registrador temporario y
{call,1,{f,4}}.
{swap,{y,0},{x,0}}. #=> Inverte os valores de cada registrador
{call,1,{f,4}}.
{gc_bif,'+',{f,0},1,[{y,0},{x,0}],{x,0}}. #=> Soma os numeros nos registradores x e y, sobrescrevendo então o registrador x com o resultado
{deallocate,1}.
return.
PS:Esse artigo não se propõe em te ensinar exatamente como funcionam registradores e muito menos assembly (até porque nem eu sei tanto sobre 😅),mas sim prover uma visão geral de como esse modelo se comporta。
BEAM 决赛怎么样?
Agora acredito que podemos entender a fase incial certo? BEAM éuma 注册机可以堆叠特定的注册者(不包括任何其他Y
),可以简单地传输示例参数的值。
O que significa ser simultâneo por padrão
Se você leu o 足够的灵丹妙药或alguma outra linguagem do ecossistema já deve ter ouvido falar que a BEAM é simultânea por padrão, mas afinal or que isso quer dizer?它们是 BEAM 的语言,用于本地形式和激光雷达智能计算。
前面的操作中,所有 VM 节点的应用程序和进程中的节点(como também foi falado sobre termos processos levels)同时执行计算。在所有应用程序中同时保证处理过程的主要形式,是新处理过程的基本功能和在特定上下文中使用处理过程的spawn
基本GenServer
功能Task
。
不知道新进程是否可以同时应用?作为 BEAM 语言的语言,BEAM 构建了本地激光雷达,以实现邮箱中的信息处理。 Essas 邮箱具有以下功能switch case
:
Em 灵药
iex(1)> defmodule Listener do
...(1)> def call do
...(1)> receive do
...(1)> {:hello, msg} -> IO.puts("Received inside the mail: #{msg}")
...(1)> end
...(1)> end
...(1)> end
{:module, Listener,
<<70, 79, 82, 49, 0, 0, 6, 116, 66, 69, 65, 77, 65, 116, 85, 56, 0, 0, 0, 240,
0, 0, 0, 25, 15, 69, 108, 105, 120, 105, 114, 46, 76, 105, 115, 116, 101,
110, 101, 114, 8, 95, 95, 105, 110, 102, 111, ...>>, {:call, 0}}
iex(2)> pid = spawn(&Listener.call/0)
#PID<0.115.0>
iex(3)> send(pid, {:hello, "Hello World"})
Received inside the mail: Hello World
{:hello, "Hello World"}
iex(4)>
埃默朗
1> c("mailbox.erl").
{ok,mailbox}
2> mailbox:module_info().
[{module,mailbox},
{exports,[{call,0},{module_info,0},{module_info,1}]},
{attributes,[{vsn,[330096396114390727100476047769825248960]}]},
{compile,[{version,"8.4.3"},
{options,[]},
{source,"/private/tmp/NKI90h/mailbox.erl"}]},
{md5,<<248,86,64,221,149,120,150,9,30,225,159,226,217,
253,6,192>>}]
3> Pid = spawn(fun mailbox:call/0).
<0.93.0>
4> Pid ! {hello, "Hello World"}.
Received inside the mail: "Hello World"
{hello,"Hello World"}
5>
到目前为止,所有这些都是必需的,因为 BEAM fornecem simultaneidade 或 padrão apenas 或 definir suasabstrações de forma concorrente desde o ponto inicial,合法吗?!
Dica 奖励:Tenho uma série de artigos falando sobre essas Abstrações na linguagem Elixir:https://dev.to/cherryramatis/handling-state- Between-multiple-instances-with-elixir-4jm1
Um caso interessante para fazer 节点 interagirem pela rede
Vamos relembrar algumas coisas coisas por aqui, primeiro sabemos que ao iniciarmos uma nova applicação Erlang/Elixir a mesma executa em um node da BEAM, e em segundo sabemos que temos construtores nativos da linguagem para manipular processos que executam dentro desse Node e podem se comunicar Port troca de mensagem certo?
Agora 和 eu te dissesse que os Nodes também podem se comunicar?伊索梅斯莫! A BEAM 是一款与软件分发相关的技术,它是José Valim 的 Honeypot 视频,解释了交互方式,您可以通过视频访问该视频:https://www.youtube.com/watch?v=lxYFOM3UJzo一小部分4:41
何塞·瓦利姆 (José Valim) 曾在没有视频的情况下实现了这种长效灵丹妙药,但也可以通过这种方式实现。
Para iniciar sistema elixir em um node da BEAM vamos iniciar or REPL interativo com um nome de host e vamos definir um modulo que printa "Hello world" na tela:
🍒 iex --name cherry
Erlang/OTP 26 [erts-14.2.5] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [jit] [dtrace]
Interactive Elixir (1.17.0-dev) - press Ctrl+C to exit (type h() ENTER for help)
iex(cherry@Cherrys-Laptop.local)1> defmodule Hello do
...(cherry@Cherrys-Laptop.local)1> def world do
...(cherry@Cherrys-Laptop.local)1> IO.puts("Hello World")
...(cherry@Cherrys-Laptop.local)1> end
...(cherry@Cherrys-Laptop.local)1> end
{:module, Hello,
<<70, 79, 82, 49, 0, 0, 5, 72, 66, 69, 65, 77, 65, 116, 85, 56, 0, 0, 0, 184,
0, 0, 0, 19, 12, 69, 108, 105, 120, 105, 114, 46, 72, 101, 108, 108, 111, 8,
95, 95, 105, 110, 102, 111, 95, 95, 10, ...>>, {:world, 0}}
iex(cherry@Cherrys-Laptop.local)2> Hello.world
Hello World
:ok
iex(cherry@Cherrys-Laptop.local)3>
Em Outro Terminal,vamos iniciar um novo REPL com outro nome and vamos tentar executar or modulo que foi definido na instancia acima:
🍒 iex --name kalane
Erlang/OTP 26 [erts-14.2.5] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [jit] [dtrace]
Interactive Elixir (1.17.0-dev) - press Ctrl+C to exit (type h() ENTER for help)
iex(kalane@Cherrys-Laptop.local)1> Hello.world
** (UndefinedFunctionError) function Hello.world/0 is undefined (module Hello is not available)
Hello.world()
iex:1: (file)
iex(kalane@Cherrys-Laptop.local)1>
Bom...nada é tão simples né? Na verdade precisamos utilizar or modulo de Node
para Tornar essa comunicação possível, vamos executar agora a seguinte linha no mesmo REPL que estávamos:
iex(kalane@Cherrys-Laptop.local)1> Node.spawn(:"cherry@Cherrys-Laptop.local", fn -> Hello.world() end)
Hello World
#PID<13525.123.0>
iex(kalane@Cherrys-Laptop.local)2>
Sua cabeça explodiu? Eu espero que sim porque isso estamos comunicando duas instancias separadas do Elixir dentro de uma mesma rede de forma completamente nativa da linguagem (pra que Kubernetes /j).
技术团队构建了公共系统内部系统,并根据 SaaS 奉献者的具体要求,将其用作虚拟机中的功能。
结论
我最大的愿望就是重新传递我的想法,并以光束和主要的方式重新传递我的热情和时刻,以确保我们的“头脑清醒”,这是一种令人惊叹的医疗方法。
我的主要研究内容是.beam
关于语言小说的一部分,因此定义了恢复价值的功能,或者项目的版本是生锈的初始版本,WIP 是长生不老的版本,但没有链接:https://github.com/cherryramatisdev/beam_studies
参考文献
愿原力与你同在🍒
文章来源:https://dev.to/cherryramatis/beam-vm-the-good-the-bad-and-the-ugly-9d6