4

前にコンパイルするのではなく、オンザフライでコンパイルできるErlang用のVMはありますか?

シェルからコンパイルする可能性があります、Martin に感謝します。

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


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

これを行うことに長所または短所はありますか?コードをホットスワップできますか? コードを処理するのは通常のユースケースですか? コンパイラは最終的にどのような利点をもたらしますか?

4

3 に答える 3

8

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 を参照してください。

実行時に Erlang コンパイラを使用すると、多くのことができます。たとえば、モジュールのコードを動的に生成し ( erl_syntax! を使用)、 を使用してファイルに書き込むことなくコンパイルできますcompile:forms/{1,2}

(大いなる力と大いなる責任についての標準的なスピーチを挿入してください。)


コードをホットスワップできますか?

はい。

コードを処理するのは通常のユースケースですか?

いいえ。通常、Erlang コードは事前に BEAM バイトコードにコンパイルされます。Erlang が組み込みモードまたはインタラクティブモードのどちらで起動されたかに応じて、モジュールは起動時に読み込まれるか、参照時に動的に読み込まれます。リリースをビルドする場合は、基本的に事前コンパイルする必要があります。

コンパイラは最終的にどのような利点をもたらしますか?

一つには、コンパイラのような不要なコンポーネントなしでコンパクトなリリースを構築できます。もちろん、事前コンパイルの伝統的な利点もすべて得られます。特に、常にコンパイルに時間を浪費する必要がないという利点があります。

要約すると、その影響を完全に理解し、事前にコードをコンパイルしない十分な理由がない限り、標準的な方法に従ってください。

于 2013-04-12T10:22:21.360 に答える
7

Erlang VM はコンパイルされたコードしか実行できません! Erlang コードを解釈したい場合は、インタープリターが必要です。このモジュールerl_evalは Erlang インタープリターを実装しており、標準の Erlang/OTP ディストリビューションの一部です。入力された式を解釈するために Erlang シェルによって使用されます。

コンパイル、ロード、更新のいずれであっても、Erlang VM でのすべてのコード処理はモジュール レベルで行われるため、1 つの関数だけをコンパイルまたはロードすることは不可能です。Erlang コンパイラは Erlang で書かれており、いつでも利用でき、システムにすぐにロードできるファイルまたはバイナリにコンパイルできます。@MartinTörnwallが指摘しているように、使用してシェルからモジュールをコンパイルすることc(module)は、本質的にその場でコンパイルすることです。

そのため、モジュール レベルでコードを使用するときにオンザフライでコードを自動的にコンパイルしても問題はありません。現在のシステムがそのように動作するように設計されていないだけで、デフォルトでは、モジュールをロードしようとすると、コンパイル済みのオブジェクト ファイルである.beamファイルのみを検索します。

于 2013-04-12T18:48:15.440 に答える
2

Erlang にはインタプリタescriptがあります。Erlang アーカイブ全体をスクリプトで記述できます。ほぼすべての機能が利用可能です。

デフォルトでは、スクリプトは解釈されます。-mode(compile).スクリプトにを含めることで、強制的にコンパイルすることができます。

アプリケーションの設計方法にもよりますが、escript ファイルを使用するよりも、コンパイルして実行する .erl ファイルを使用する方が一般的です。

だから今、あなたには多くの選択肢があります。

  1. c(my_module)この自動ロードを使用して、.erl ファイルを .beam にコンパイルすると、.beam ファイルがロードされます。したがって、既存の VM はオンザフライで実行できます。コード内では、ファイル、パージ、ロードなどのコンパイル モジュール関数を使用して、オンザフライでロードおよび実行できます。
  2. erlc、erl -make、rebar などを使用して .erl ファイルをコンパイルして保持し (Erlang には豊富なサポートがあります)、それを実行します。Erlang ソフトウェアの実行とリリースを管理するために、アーカイブ、ブート スクリプト、rel などを作成できます。これは通常、本番用のプラクティスです。
  3. escript を使用して、すべてを解釈モードで実行します。
  4. escript を使用して -mode(compile) オプションを指定すると、実行時 (escript の実行開始時) にコードをコンパイルし、コンパイルされたコードを (メモリ内で) 実行するよう Erlang VM に指示できます。

これを行うことに長所または短所はありますか?

コンパイルされたコードは、解釈されたコードよりも高速です。ほとんどすべてが両方でサポートされているため、Erlang には現在他に見当たりません。Erlang は組み合わせもサポートします (解釈されたコードからコンパイルされたコードを呼び出す)

コードをホットスワップできますか?

はい。コードでもこれを処理できる必要があります。

コードを処理するのは通常のユースケースですか?

生産のためのオプション 2。学習/簡単な開発のための 1 つのオプション。オプション 3 および 4 は、特定の要件に応じて必要に応じて実行されます (1 回のみ実行される場合があります)。

コンパイラは最終的にどのような利点をもたらしますか?

明確にするために、erlcプログラムは Erlang システム内のすべてのコンパイラを実行する共通の方法を提供し、コンパイルモジュールは Erlang コンパイラへのインターフェイスを提供します。コンパイラーは中間のバイナリー .beam ファイルを提供します。これは、Erlang コードを解釈されたものよりも高速に実行するのに役立ちます。また、構文エラー (コンパイル エラー) もキャッチします。

于 2013-04-13T04:32:03.160 に答える