gpt4 book ai didi

erlang - 为什么erlang :foo() compile?

转载 作者:行者123 更新时间:2023-12-04 01:53:25 24 4
gpt4 key购买 nike

为什么 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

为什么编译器在编译期间不发出错误或警告?它应该知道导出的函数,不是吗?

最佳答案

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

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

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

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

您还应该记住 Erlang 的另一个特性,即您可以生成函数调用 on the fly使用如下结构:

erlang:apply(ModuleName, FunctionName, ArgList)

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

尽管模块和函数现在可能在编译时存在,但您可以热交换模块并卸载代码,因此它可能在运行时不存在。

关于erlang - 为什么erlang :foo() compile?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/870312/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com