Есть ли разница в эффективности между использованием Dialyzer на пучке Эрланга и исходным кодом?

Я собираю все файлы лучей проекта по пути вроде ~/erl_beam

dialyzer ~/erl_beam/*.beam --get_warnings -o static_analysis.log

Это работает хорошо.

Если я сделаю это на исходном коде Erlang:

dialyzer --get_warnings -I <Path1> --src <Path2> -o static_analysis.log

Это тоже работает.

Итак, почему у нас есть два способа провести статический анализ кода Erlang? Есть ли сила или слабость друг к другу?

2 ответа

Очень маленький.

Анализ диализатора выполняется на Core Erlang. Это представление может быть извлечено либо непосредственно из +debug_info скомпилированный .beam файл или путем компиляции .erl файл. Компиляция требует времени, но это, конечно, не самая трудоемкая часть анализа.

Если вы уже скомпилировали .erl с +debug_info также удобнее анализировать .beam файл, так как вам не нужно будет передавать какие-либо параметры командной строки, связанные с компиляцией в Dialyzer.

Dialyzer начинает свой анализ либо с откомпилированного отладочного байт-кода BEAM, либо из исходного кода Erlang. Однако некоторые параметры работают только для файлов BEAM (например, --build_plt).

Использование файлов BEAM может быть необходимо, если, например, у вас нет доступа к исходным файлам. Если у вас есть доступ как к BEAM, так и к исходным файлам, вы, вероятно, захотите использовать файлы BEAM, так как это немного ускорит анализ: Dialyzer займет намного меньше времени для анализа входных данных. С другой стороны, синтаксический анализ занимает значительно меньше времени, чем остальная часть анализа, поэтому не ожидайте увидеть большую разницу (я был бы удивлен, если бы это было более 10%).

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

Другие вопросы по тегам