2013-04-12 2 views
2

Есть ли какая-нибудь виртуальная машина для Erlang, которая позволяет вам делать компиляцию «на лету» вместо компиляции раньше?Можно ли запустить erlang без компиляции?

Существует возможность скомпилироваться из корпуса, спасибо Мартину.

Now, from the Erlang shell (or some other module!): 


1> compile:file("mymod.erl"). 
{ok,mymod} 
2> mymod:myfun(). 
Hello Joe 

Есть ли какие-либо плюсы или минусы с этим? Сможете ли вы поменять код «горячей» замены? Является ли это обычным прецедентом для обработки кода? Какие преимущества дает вам компилятор в конце?

+0

, если ваш вопрос о динамической компиляции, просто так работает 'yaws web server'. то посмотрите на это: http://stackoverflow.com/a/7927649/431620 –

ответ

6

Из оболочки 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, вы в основном должны до скомпилировать раньше времени.

Какие преимущества дает вам компилятор в конце?

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

Подводя итог, если вы не полностью понимаете последствия и имеете очень вескую причину не компилировать свой код раньше времени, следуйте стандартным практикам.

+0

Извините, но это приносит больше вопросов. Добавлено их в оригинальную тему – ptomasroos

5

Erlang VM может запускать только скомпилированный код! Если вы хотите интерпретировать код Erlang, вам нужен интерпретатор. Модуль erl_eval реализует интерпретатор Erlang и является частью стандартного дистрибутива Erlang/OTP. Он используется оболочкой Erlang для интерпретации введенных выражений.

Все обработки кода в виртуальной машине Erlang, будь то сбор, загрузка или обновление, выполняются на уровне модуля, поэтому невозможно скомпилировать или загрузить только одну функцию. Компилятор Erlang написан в Erlang и всегда доступен и может компилироваться либо в файл, либо в двоичный файл, который можно сразу загрузить в систему. Поскольку @ MartinTörnwall указал, что компиляция модуля из оболочки с использованием c(module) по существу компилируется «на лету».

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

1

В Erlang есть переводчик escript. Весь архив Erlang может быть написан в скрипте. Доступны почти все функции.

По умолчанию скрипт будет интерпретироваться. Вы можете заставить его скомпилировать, включив в скрипт -mode(compile)..

Хотя это зависит от того, как вы разрабатываете приложение, регулярная практика состоит в том, чтобы иметь .erl-файлы, которые скомпилированы и запущены, чем с файлами escript.

Итак, теперь у вас есть много вариантов.

  1. Скомпилировать файл .erl в .beam, используя c(my_module), этот авто загружает файл .beam. Таким образом, существующая виртуальная машина может запускать ее на лету. В коде вы можете использовать функции модуля компиляции, такие как файл, очистка и загрузка для загрузки и запускать его на лету.
  2. Скомпилируйте и сохраните файлы .erl, используя erlc, erl -make, rebar и т. Д. (У Erlang есть богатая поддержка), а затем запустите его. Вы можете создавать архивы, сценарии загрузки, rel и т. Д. Для управления запуском и выпуском программного обеспечения Erlang. Обычно это практика производства.
  3. Используйте escript и запустите все в интерпретируемом режиме.
  4. Используйте опцию escript и дать -mode (компилировать) сказать Erlang VM, что во время выполнения (при запуске для запуска escript) компиляции кода и запуска скомпилированного кода (в памяти)

Есть ли какие-нибудь плюсы или против этого?

Скомпилированный код быстрее интерпретируемого кода. В настоящее время я не вижу других в Эрланге, так как в обоих случаях поддерживается все. Erlang даже поддерживает комбинацию (Вызов скомпилированного кода из интерпретируемого кода)

Вы по-прежнему сможете использовать код горячей замены?

Да во всех случаях. Ваш код также должен иметь возможность справиться с этим.

Является ли это обычным прецедентом для обработки кода?

Вариант 2 для производства. Вариант 1 для обучения/простого развития. Варианты 3 и 4 нуждаются в конкретных требованиях (возможно, один раз подряд).

Какие преимущества дает вам компилятор в конце концов?

Чтобы сделать это ясно, программа erlc обеспечивает общий способ запуска всех компиляторов в системе Erlang, а модуль compile предоставляет интерфейс для компиляторов Erlang. Компилятор предоставляет промежуточный двоичный файл .beam, который помогает быстрее запускать код Erlang, чем интерпретируемый экземпляр. Они также улавливают синтаксические ошибки (ошибки компиляции).

Смежные вопросы