据我所知,虚拟机分为两类:"系统虚拟机"或"进程虚拟机".BEAM所在的地方对我来说有点模糊.还有其他一种我不知道的虚拟机吗?
好吧,我希望我不会在这里打破一些垃圾邮件规则.我刚问了一个关于erlang编译器如何实现模式匹配的问题,我得到了一些很好的响应,其中一个是编译后的字节码(通过传递给c()指令的参数获得):
{function, match, 1, 2}.
{label,1}.
{func_info,{atom,match},{atom,match},1}.
{label,2}.
{test,is_tuple,{f,3},[{x,0}]}.
{test,test_arity,{f,3},[{x,0},2]}.
{get_tuple_element,{x,0},0,{x,1}}.
{test,is_eq_exact,{f,3},[{x,1},{atom,a}]}.
return.
{label,3}.
{badmatch,{x,0}}
Run Code Online (Sandbox Code Playgroud)
它只是简单的二郎元组.我期待一些神秘的二元东西,猜不是.所以我在这里冲动地问这个问题(我可以看一下编译器的来源但是问题总是会因为额外的洞察力而变得更好),这个输出如何在二进制级别翻译?
说{test,is_tuple,{f,3},[{x,0}]}的例子.我假设这是一条指令,称为'test'...无论如何,所以这个输出本质上是字节码级语言的AST,二进制编码只是1-1的翻译?这一切都是如此令人兴奋,我不知道我能否轻松地看到erlang编译器破坏了什么.
非常感谢
BEAM和JVM之间的一些基本功能/架构差异是什么?
我已经开始研究Erlang并发现BEAM运行时环境很吸引人.通常声明在Erlang中,进程属于语言而不是OS(意味着运行时,在这种情况下意味着BEAM).这些是Erlang以其着名的轻量级"绿色流程".它进一步指出(第5页的本文的是波束使用每个CPU核一(1)OS线程调度和另一个OS线程用于I/O).所以我想知道:从实际执行Erlang代码所需的CPU周期来自哪个线程?
此外,如果我在双核机器上运行,我希望 - 基于我到目前为止所读到的 - 看到在BEAM进程下运行的三(3)个线程:两个调度程序(每个核心一个)和一个I/O线程.但我看到10.有时11.有时它从13开始,和高质量的放大器一样,到11.
我糊涂了.任何见解将不胜感激.
我有一个临时情况,在一个节点上编译的梁文件在另一个节点上执行.光束文件是否可移植?
Erlang发行版的版本有多接近?
BEA和M.的字母代表什么?我记得看到对首字母缩略词"BEAM"的解释,但我还没有找到它.
它出现在错误代码中:
? gentoo iex
Erlang/OTP 17 [erts-6.4.1] [source] [64-bit] [smp:8:8] [async-threads:10] [kernel-poll:false]
Interactive Elixir (1.0.4) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> import Math
08:05:02.839 [error] Loading of /var/opt/proj/elx/ubuntu/Elixir.Math.beam failed: :badfile
** (CompileError) iex:1: module Math is not loaded and could not be found
08:05:02.846 [error] beam/beam_load.c(1104): Error loading module 'Elixir.Math':
non-ascii garbage '78705400' instead of chunk type id
(elixir) src/elixir_exp.erl:123: :elixir_exp.expand/2
iex(1)>
Run Code Online (Sandbox Code Playgroud)
因此,看起来.beam文件存在某种问题,可能是由于我使用了vi.(注意Elixir程序员:不要编辑.beam文件,这很痛苦.)
这个问题解释了BEAM虚拟机是什么,而不是字母代表什么.似乎很难在Erlang中心快速找到关于词源的更多信息.据说 BEAM是Erlang和Elixir的秘诀.
看来我的rabbitmq听取了所有接口,尽管:
在/etc/rabbitmq/rabbitmq.config中:
[{rabbit, [{tcp_listeners, [{"10.0.0.1", 5672}]}]},
{rabbitmq_mochiweb, [{listeners, [{mgmt, [{ip, "10.0.0.1"},
{port, 55672}]}]}]}].
Run Code Online (Sandbox Code Playgroud)
在/etc/rabbitmq/rabbitmq-env.conf中:
export RABBITMQ_NODENAME=rabbit
export RABBITMQ_NODE_IP_ADDRESS=10.0.0.1
export ERL_EPMD_ADDRESS=10.0.0.1
Run Code Online (Sandbox Code Playgroud)
当我运行netstat -uptan | grep beam我得到:
tcp 0 0 10.0.0.1:5672 0.0.0.0:* LISTEN 1378/beam
tcp 0 0 0.0.0.0:33551 0.0.0.0:* LISTEN 1378/beam
tcp 0 0 127.0.0.1:38737 127.0.0.1:4369 ESTABLISHED 1378/beam
Run Code Online (Sandbox Code Playgroud)
如何使光束不在0.0.0.0:33551上听?
我尝试使用 Erlang 插件在 Intellij 中编译 erl 文件。编译一切都很好,但在输出/生产中,文件夹不会创建任何文件.beam,当我运行控制台时,我收到消息:
exception error: undefined function.
Run Code Online (Sandbox Code Playgroud)
当我使用c("file").一切正常。为什么 Intellij 不创建.beam文件?
假设我有一个带有子命令和参数(如application foo --bar baz)的 CLI 应用程序。如何在不需要用户安装 Erlang 的情况下打包分发?
我知道有mix escriptMix 任务,但它构建了一个需要安装 Erlang 的二进制文件,而且 Mix 参考指出 escripts 应该仅用于开发目的。
mix release,但是,会产生我不想在 dist 中看到的冗余 shell 脚本。
那么,有没有办法让 Elixir CLI 应用程序独立分发?
PS 这实际上是我第一次使用 Elixir(以及整个 Erlang 生态系统)