BEAM VM 的优点、缺点和缺点

2025-06-04

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

BEAMOTP 系统的组成部分与 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 *.beamde forma direta (Como é o caso do elixir)

最后一个执行层的说明,以及应用程序BEAMErlang/Elixir/Gleam 执行过程中的组件的说明,没有关于虚拟机执行的图表:

Erlang 的 ERTS 堆栈

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 + 2como se fosseterpretada por uma stack machine 👇:



push 2
push 2
add


Enter fullscreen mode Exit fullscreen mode

É eu sei, tem uma palavra addali né? Mas ela está completamente alinhada com o conceito de stack não se preocupe, nese caso addorepresenta 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


Enter fullscreen mode Exit fullscreen mode

什么是收银机

不同的堆栈机、注册机使用不同的注册机来注册不同的结果,并在不同的注册机中使用不同的注册机(BEAM utiliza um registro X0paraguardar 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.


Enter fullscreen mode Exit fullscreen mode

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)>


Enter fullscreen mode Exit fullscreen mode

埃默朗



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>


Enter fullscreen mode Exit fullscreen mode

到目前为止,所有这些都是必需的,因为 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>


Enter fullscreen mode Exit fullscreen mode

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>


Enter fullscreen mode Exit fullscreen mode

Bom...nada é tão simples né? Na verdade precisamos utilizar or modulo de Nodepara 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>


Enter fullscreen mode Exit fullscreen mode

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
PREV
🌐 如何在子域名上托管我的项目
NEXT
准备将您的 Vue 应用迁移到 Vue 3 避免使用 Vue 事件总线 将您的过滤器函数重构为方法 将您的组件模型重构为 .sync 谨慎使用第三方插件 使用 @vue/composition-api 编写您的组件 更多摘要