有没有可能运行erlang而不进行编译?



是否有任何Erlang VM允许您在飞行中进行编译而不是之前编译?

有可能从shell编译,谢谢Martin。

Now, from the Erlang shell (or some other module!):

1> compile:file("mymod.erl").
{ok,mymod}
2> mymod:myfun().
Hello Joe

这样做有什么利弊吗?您还能热插拔代码吗?这是处理代码的常规用例吗?那么编译器最终给你带来了什么好处呢?

在Erlang shell中,您可以使用c("path/to/module.erl")动态编译模块。您还可以通过compile模块访问此功能,特别是compile:file/{1,2}函数。

例如,假设有一个文件mymod.erl:

-module(mymod).
-export([myfun/0]).
myfun() -> io:format("Hello Joe~n").

现在,从Erlang shell(或其他模块!):

1> compile:file("mymod.erl").
{ok,mymod}
2> mymod:myfun().
Hello Joe

参见编译模块中的Erldocs获取更多信息。

你可以在运行时用Erlang编译器做很多事情。例如,您可以动态地为模块生成代码(使用erl_syntax !),然后编译它,甚至不需要使用compile:forms/{1,2}将其写入文件。

(插入大国担当的标准讲话)


你还能热插拔代码吗?

是的。

是处理代码的常规用例吗?

。通常,Erlang代码会提前编译成BEAM字节码。根据Erlang是以嵌入式模式还是交互模式启动的,这些模块要么在启动时加载,要么在引用时动态加载。如果你正在构建一个版本,基本上你必须提前编译。

编译器最终给你带来了什么好处?

首先,我们可以构建紧凑的版本,而不需要编译器等不必要的组件。当然,我们也获得了提前编译的所有传统好处,特别是不必一直浪费时间编译。

总而言之,除非您完全理解其中的含义,并且有非常好的不提前编译代码的理由,否则请遵循标准实践。

Erlang虚拟机只能运行编译过的代码!如果你想解释Erlang代码,那么你需要一个解释器。模块erl_eval实现了一个Erlang解释器,是标准Erlang/OTP发行版的一部分。它被Erlang shell用来解释输入的表达式。

Erlang VM中的所有代码处理,无论是编译,加载还是更新,都是在模块级别完成的,因此不可能编译或加载仅一个函数。Erlang编译器是用Erlang编写的,并且总是可用的,可以编译成文件或二进制文件,可以立即加载到系统中。正如@MartinTörnwall所指出的那样,使用c(module)从shell编译模块本质上是动态编译。

因此,在模块级使用时,自动编译代码不会有任何问题。这只是目前的系统不是这样设计的,默认情况下,当它试图加载一个模块时,它只寻找预编译的目标文件,.beam文件。

Erlang有一个解释器脚本。整个Erlang存档可以用脚本编写。几乎所有功能都可用。

默认情况下,脚本将被解释。您可以通过在脚本中包含-mode(compile).来强制编译它。

虽然这取决于你设计应用程序的方式,但通常的做法是编译和运行.erl文件,而不是使用escript文件。

所以现在你有很多选择。

    使用c(my_module)编译。erl文件到。beam,这会自动加载。beam文件。因此,现有的VM可以动态地运行它。在代码中,您可以使用编译模块函数,如file, purge和load来加载并运行它。使用erlc, erl -make, rebar等(Erlang有丰富的支持)编译并保存。erl文件,然后运行。你可以构建档案,引导脚本,rel等来管理Erlang软件的运行和发布。这通常是生产实践。
  1. 使用脚本并以解释模式运行所有内容。
  2. 使用escript并给出-mode(compile)选项告诉Erlang VM在运行时(当开始运行escript时)编译代码并运行编译后的代码(在内存中)

这样做有什么利弊吗?

编译代码比解释代码快。目前在Erlang中我还没有看到其他的,因为这两种语言都支持几乎所有的东西。Erlang甚至支持组合(从解释代码调用编译代码)

你还能热插拔代码吗?

在所有情况下都是。你的代码也应该能够处理这个

是处理代码的常规用例吗?

用于生产的选项2。选择1用于学习/简单开发。选项3和选项4需要根据具体要求(可能是一次运行)。

编译器最终给你带来了什么好处?

为了说明这一点,erlc程序提供了一种通用的方式来运行Erlang系统中的所有编译器,编译模块提供了Erlang编译器的接口。编译器提供中间二进制.beam文件,这有助于比解释后的对应文件更快地运行Erlang代码。它们还捕获语法错误(编译错误)。

最新更新