是否可以在不编译的情况下运行erlang?

是否可以在不编译的情况下运行erlang?,erlang,runtime,Erlang,Runtime,是否有任何VM for Erlang允许您动态编译而不是以前编译 有可能从shell编译,谢谢Martin Now, from the Erlang shell (or some other module!): 1> compile:file("mymod.erl"). {ok,mymod} 2> mymod:myfun(). Hello Joe 这样做有什么好处或坏处吗? 您仍然能够热交换代码吗? 它是处理代码的常规用例吗? 那么,编译器最终会给您带来什么好处呢?在Erlan

是否有任何VM for Erlang允许您动态编译而不是以前编译

有可能从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(或其他模块!):

有关更多信息,请参阅模块上的文档

您可以在运行时大量使用Erlang编译器。例如,您可以动态生成模块的代码(使用
erl_语法
!),然后使用
compile:forms/{1,2}
编译它,甚至不将其写入文件

(插入关于伟大权力和伟大责任的标准演讲。)


您仍然能够热交换代码吗

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

不会。通常情况下,Erlang代码会提前编译成BEAM字节码。根据Erlang是否在模式下启动,模块要么在启动时加载,要么在引用时动态加载。如果您正在构建一个应用程序,那么基本上必须提前编译

那么编译器最终给您带来了什么好处呢

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


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

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

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

因此,在模块级使用代码时,在运行中自动编译代码不会有任何问题。只是当前系统的设计不是这样的,默认情况下,当它尝试加载模块时,它只查找预编译的对象文件,
.beam
文件。

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

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

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

所以现在你有很多选择

  • 使用
    c(my_模块)
    将.erl文件编译为.beam,这将自动加载.beam文件。因此,现有VM可以动态运行它。在in代码中,您可以使用编译模块函数(如file、purge和load)动态加载和运行它
  • 使用erlc、erl-make、rebar等(Erlang有丰富的支持)编译并保存.erl文件,然后运行它。您可以构建归档、引导脚本、rel等来管理Erlang软件的运行和发布。这通常是生产实践
  • 使用escript并以解释模式运行所有内容
  • 使用escript和give-mode(compile)选项告诉ErlangVM在运行时(开始运行escript时)编译代码并运行编译后的代码(在内存中)
  • 这样做有什么好处或坏处吗

    编译代码比解释代码快。我现在在Erlang中没有看到任何其他版本,因为这两个版本几乎都支持所有内容。Erlang甚至支持组合(从解释代码调用编译代码)

    您仍然能够热交换代码吗

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

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

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

    那么编译器最终给您带来了什么好处呢


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

    很抱歉,这会带来更多问题。在原始主题中添加了它们如果您的问题是关于动态编译的,就像yaws-web服务器那样。然后看看这个:
    1> compile:file("mymod.erl").
    {ok,mymod}
    2> mymod:myfun().
    Hello Joe