はじめに
ElixirとErlangは切ってもきれない関係にあります。
Elixirのelixirコマンドの実態はErlangのerlコマンドで、elixirはErlangVMの上で動作します。
elixirコマンドの実体
elixirコマンドの実体を確認するために、環境変数ELIXIR_CLI_DRY_RUN
に値を入れて実行してみましょう。
ここにあるように、elixirコマンドを実行する際、この環境変数に値が入っていると、elixirコマンドを実行(exec)するのではなく、表示(echo)します。
$ elixir -v
Erlang/OTP 26 [erts-14.0.2] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [jit]
Elixir 1.16.0 (compiled with Erlang/OTP 24)
$ ELIXIR_CLI_DRY_RUN=1 elixir -v
erl -noshell -elixir_root /Users/ohara_tsunenori/.asdf/installs/elixir/1.16.0/bin/../lib -pa /Users/ohara_tsunenori/.asdf/installs/elixir/1.16.0/bin/../lib/elixir/ebin -s elixir start_cli -elixir ansi_enabled true -extra -v
$
elixir -v
の例を見ると、elixirコマンドの実体はerlコマンドだとわかります。
erlコマンドの実体
それではerlコマンドの実体は何でしょうか?
erlangをコンパイルすると、erlコマンドが生成されます。
このerlコマンドの実体は、このようなシェルスクリプトです。
コマンドの実体としては、以下の様なerlexecプログラムです。
exec "$BINDIR/erlexec" ${1+"$@"}
erlexecプログラムの実体
では、erlexecプログラムの実体は何でしょうか?
それはC言語で実装されたプログラムです。
Erlangをコンパイルすると最終的にこのCソースコードがコンパイルされてerlexecになります。
まとめ
elixirとerlangの実行コマンドのエントリーポイントを紹介しました。
elixirのプログラムが実行されるとき、裏で何がおこっているのかは、これらのエントリーポイントから追っていくと理解できます。