是否可以在不编译的情况下运行erlang?
是否有任何VM for Erlang允许您动态编译而不是以前编译 有可能从shell编译,谢谢Martin是否可以在不编译的情况下运行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
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)动态加载和运行它为了说明这一点,该程序提供了一种运行Erlang系统中所有编译器的通用方法,该模块为Erlang编译器提供了一个接口。编译器提供了中间二进制.beam文件,这有助于比解释的对应文件更快地运行Erlang代码。它们还捕获语法错误(编译错误)。很抱歉,这会带来更多问题。在原始主题中添加了它们如果您的问题是关于动态编译的,就像yaws-web服务器那样。然后看看这个:
1> compile:file("mymod.erl").
{ok,mymod}
2> mymod:myfun().
Hello Joe