Почему erlang: foo () компилируется? - PullRequest
11 голосов
/ 15 мая 2009

Почему компилятор 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

Почему компилятор не выдает ошибку или предупреждение об этом во время компиляции? Он должен знать об экспортируемых функциях, не так ли?

Ответы [ 3 ]

17 голосов
/ 16 мая 2009

Erlang - динамический язык. Однако рекомендуется выполнять проверку типов и статический анализ после компиляции .

Инструмент Диализатор используется для проверки ошибок такого рода.

Причина, по которой компилятор не знает об этом во время компиляции, заключается в том, что функции можно искать и динамически загружать по пути кода во время выполнения (а также с удаленного узла). Dialyzer будет проверять код по пути кода во время его запуска.

Возможность загружать код с удаленного узла означает, что базовые «системы» могут быть установлены на устройстве, а затем устройство может загружать себя из сети.

Вы также должны помнить другую характеристику Erlang, что вы можете генерировать вызовы функций на лету , используя такие конструкции, как:

erlang:apply(ModuleName, FunctionName, ArgList)

так что в этом случае просто невозможно узнать, существует ли функция во время компиляции или нет.

И хотя модуль и функция могут существовать сейчас во время компиляции, вы можете выполнять горячую замену модулей и выгружать код, поэтому его может не быть во время выполнения.

0 голосов
/ 20 ноября 2014

Вы можете использовать приложение xref для проверки использования устаревших, неопределенных и неиспользуемых функций (и не только!).

Скомпилируйте модуль с помощью debug_info:

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

Проверьте модуль с помощью xref:m/1:

2> xref:m(test).
[{deprecated,[]},
 {undefined,[{{test,start,0},{erlang,foo,0}}]},
 {unused,[]}]

Вы можете проверить больше о xref здесь:

Erlang - Xref - инструмент перекрестных ссылок (Руководство пользователя по инструментам)

Erlang - xref (Справочное руководство по инструментам)

0 голосов
/ 16 мая 2009

Я думаю, что это вопрос реализации, так как разработчики Erlang решили связать во время выполнения, а не во время сборки. Частично это может быть связано с управлением версиями и / или динамической загрузкой кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...