Erlang 当编译的代码与shell计算的代码不同时?

Erlang 当编译的代码与shell计算的代码不同时?,erlang,Erlang,在(第46页)中,作者在注释中陈述了以下内容: 在某些奇怪的情况下,当作为模块的一部分编译时,在shell中计算的代码的行为可能与相同的代码略有不同。在这种情况下,编译版本是金标准。shell在解释表达式时会尽最大努力做完全相同的事情 你能想出一个或多个这种奇怪的角落案例吗?在这些情况下有哪些细微的区别?最重要的区别是shell是解释的,而编译的代码是。。。好。。编译。这在函数的执行速度和内存使用方面有明显的差异。换言之,您可能会发现解释的变体速度较慢,或者耗尽了所有内存,而编译的版本则没有 这

在(第46页)中,作者在注释中陈述了以下内容:

在某些奇怪的情况下,当作为模块的一部分编译时,在shell中计算的代码的行为可能与相同的代码略有不同。在这种情况下,编译版本是金标准。shell在解释表达式时会尽最大努力做完全相同的事情


你能想出一个或多个这种奇怪的角落案例吗?在这些情况下有哪些细微的区别?

最重要的区别是shell是解释的,而编译的代码是。。。好。。编译。这在函数的执行速度和内存使用方面有明显的差异。换言之,您可能会发现解释的变体速度较慢,或者耗尽了所有内存,而编译的版本则没有

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


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

erlang解释器,
erl_eval
,努力做到与编译代码完全相同。如果没有,很可能是一个bug


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

速度差可能导致的一种情况是在shell中创建的fun。它们不会被编译,即使在传递到编译代码时也会被解释。