当编译的代码与shell评估的不同时?

时间:2010-12-28 17:42:28

标签: erlang

Erlang and OTP in Action(第46页)中,作者在注释中说明了以下内容:

  

在某些奇怪的角落情况下,在编译为模块的一部分时,shell中评估的代码与相同代码的行为略有不同。在这种情况下,编译版本是黄金标准。 shell在解释表达式时会尽力做同样的事情。

您能想到其中一个或多个奇数角落吗?在这些情况下,哪些轻微差异

2 个答案:

答案 0 :(得分:8)

最重要的区别是shell被解释,而编译后的代码是......好...编译。这在函数的执行速度和内存使用方面存在可观察到的差异。换句话说,您可能会发现解释的变体较慢或耗尽了所有内存,而编译后的版本却没有。

这个问题困扰了很多年轻的Erlang程序员。他或她认为与其他语言相比,Erlang相当慢,而实际上它是针对编译的解释代码的测试。

该段是一项保护措施。基本上,解释器和编译器应该就函数的所有输入/输出达成一致。但不幸的是,并非总是如此。实际上,解释器和编译器是不同的执行引擎,因此可能不同。如果您通过HiPE进行本机编译,则更改可能会更大。通常,IEEE 754浮点数出现问题。

答案 1 :(得分:7)

erlang解释器erl_eval非常难以像编译代码一样运行。如果不是,则很可能是一个错误。

在一个案例中除了并且正在接收消息。编译代码可以访问内部指令以访问和操作消息队列。口译员不能这样做。它必须:实际上从队列中删除消息(或多或少地使用receive X -> X end);测试它们以确定它们是否与接收模式匹配;保留那些不匹配的;并将所有当前不需要的消息放回队列中(通过接收所有消息,然后将它们发送回自身)。这意味着如果消息到达的时间很短,它可能不会在消息队列中与编译代码相同的位置。