当前位置:  开发笔记 > 编程语言 > 正文

为什么erlang:foo()编译?

如何解决《为什么erlang:foo()编译?》经验,为你挑选了1个好方法。

为什么Erlang编译器在编译时没有检测到未定义的函数.

如果我写test.erl:

-module(test). 
-export([start/0]).

start() ->
       erlang:foo().

它汇编很好.

Eshell V5.6.5  (abort with ^G)
1> c(test).
{ok,test}
2> 

但崩溃运行时.

2> test:start().
** exception error: undefined function erlang:foo/0

为什么编译器在编译期间没有发出错误或警告?它应该知道导出的功能,不应该吗?



1> Gordon Guthr..:

Erlang是一种动态语言.然而,在编译后进行类型检查和静态分析是一种很好的做法.

Dialyzer工具用于检查此类错误情况.

编译器在编译时不知道它的原因是因为可以在运行时(以及从远程节点)从代码路径中搜索和动态加载函数.Dialyzer将在运行时根据代码路径检查代码.

从远程节点加载代码的能力意味着可以在设备上安装基本的"系统",然后设备可以从网络引导自身.

你应该还记得二郎,你可以生成函数调用的另一个特点在飞行中使用结构,如:

erlang:apply(ModuleName, FunctionName, ArgList)

所以在这种情况下,根本不可能知道函数是否在编译时存在.

虽然模块和函数现在可能在编译时存在,但您可以热插拔模块并卸载代码,因此在运行时可能不存在.

推荐阅读
mobiledu2402851377
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有