Есть ли разница в эффективности между использованием 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, между этими двумя случаями.