Из оболочки Erlang вы можете скомпилировать модуль на лету, используя c("path/to/module.erl")
. Вы также можете получить доступ к этой функции через модуль compile
, в частности функции compile:file/{1,2}
.
Например, предположим, что у нас есть файл mymod.erl
: (! Или какой-либо другой модуль)
-module(mymod).
-export([myfun/0]).
myfun() -> io:format("Hello Joe~n").
Теперь из оболочки Erlang:
1> compile:file("mymod.erl").
{ok,mymod}
2> mymod:myfun().
Hello Joe
См Erldocs на compile модуль для более Информация.
Вы можете многое сделать с компилятором Erlang во время выполнения. Например, вы можете динамически генерировать код для модуля (используйте erl_syntax
!), А затем скомпилируйте его, даже не записав его в файл с помощью compile:forms/{1,2}
.
(стандарт речи Вставьте на большой мощности и большую ответственность.)
ли вы по-прежнему иметь возможность горячей замены кода?
Да.
Это обычный прецедент для обработки кода?
Нет. Обычно код Erlang скомпилирован раньше времени в байт-код BEAM. В зависимости от того, был ли запущен Erlang в режиме embedded or interactive, модули загружаются при запуске или динамически по мере их ссылки. Если вы строите release, вы в основном должны до скомпилировать раньше времени.
Какие преимущества дает вам компилятор в конце?
Ну, с одной стороны, мы можем создавать компактные версии без ненужных компонентов, таких как компилятор. Разумеется, мы также получаем все традиционные преимущества компиляции в будущем, в частности, из-за того, что не нужно тратить время на сбор данных.
Подводя итог, если вы не полностью понимаете последствия и имеете очень вескую причину не компилировать свой код раньше времени, следуйте стандартным практикам.
, если ваш вопрос о динамической компиляции, просто так работает 'yaws web server'. то посмотрите на это: http://stackoverflow.com/a/7927649/431620 –