IExについてElixir Meetup #1 in Drecom で発表してきた。そして謝罪があります。

タイトルどおりですが、IExの内部のコードについてElixir Meetup #1 in Drecom にて発表してきました。
今回の発表は、@ohrdev さんがproduction での運用における知見
@ma2geさんがPowerAssertExについてでしたのでライブラリの書き方や内部実装についてだろうと予測し、私のElixir自体に入り込むのが良いかと考えて発表資料を作りました。

発表資料はこちらとなります。

さて、謝罪があるとタイトルに記載しておりますが、発表資料にてIExの起動後の動作がどこにもどってくるのかが、読み取れていないと話をしました。
ここで何の気なしに iexコマンド自体の中身を覗いてみましょう。
https://github.com/elixir-lang/elixir/blob/master/bin/iex

$cat iex

#!/bin/sh
if [ $# -gt 0 ] && ([ "$1" = "--help" ] || [ "$1" = "-h" ]); then
  echo "Usage: `basename $0` [options] [.exs file] [data]
  -v                Prints version
  -e \"command\"      Evaluates the given command (*)
  -r \"file\"         Requires the given files/patterns (*)
  -S \"script\"       Finds and executes the given script
  -pr \"file\"        Requires the given files/patterns in parallel (*)
  -pa \"path\"        Prepends the given path to Erlang code path (*)
  -pz \"path\"        Appends the given path to Erlang code path (*)
  --app \"app\"       Start the given app and its dependencies (*)
  --erl \"switches\"  Switches to be passed down to Erlang (*)
  --name \"name\"     Makes and assigns a name to the distributed node
  --sname \"name\"    Makes and assigns a short name to the distributed node
  --cookie \"cookie\" Sets a cookie for this distributed node
  --hidden          Makes a hidden node
  --werl            Uses Erlang's Windows shell GUI (Windows only)
  --detached        Starts the Erlang VM detached from console
  --remsh \"name\"    Connects to a node using a remote shell
  --dot-iex \"path\"  Overrides default .iex.exs file and uses path instead;
                    path can be empty, then no file will be loaded
** Options marked with (*) can be given more than once
** Options given after the .exs file or -- are passed down to the executed code
** Options can be passed to the VM using ELIXIR_ERL_OPTIONS or --erl" >&2
  exit 1
fi

readlink_f () {
  cd "$(dirname "$1")" > /dev/null
  filename="$(basename "$1")"
  if [ -h "$filename" ]; then
    readlink_f "$(readlink "$filename")"
  else
    echo "`pwd -P`/$filename"
  fi
}

SELF=$(readlink_f "$0")
SCRIPT_PATH=$(dirname "$SELF")
exec "$SCRIPT_PATH"/elixir --no-halt --erl "-user Elixir.IEx.CLI" +iex "$@"

これ、シェルスクリプトだああああああああああああ!!!!????

exec "$SCRIPT_PATH"/elixir --no-halt --erl "-user Elixir.IEx.CLI" +iex "$@"

っと書かれているように elixirコマンドにて、 Elixir.IEx.CLI を実行しているのが読み取れます。
ですので、起動としては Elixir.IEx.CLI を実行しているのでしょう…

iexコマンドはElixirでコンパイルしたバイナリ形式なんだろう!っと思い込んでおり、まさかシェルスクリプトだとは思っていなかったので完璧に見落としておりました。深く反省しております。

また、呼び出されるelixirコマンド自体もシェルスクリプトとなっているようです。
https://github.com/elixir-lang/elixir/blob/master/bin/elixir

さて、elixirコマンドの一番下には下記のように記載されており、$ERL_PATH にて、erlコマンドを呼び出せるようにPATHを取得してくる様子

exec "$ERL_PATH" -pa "$SCRIPT_PATH"/../lib/*/ebin $ELIXIR_ERL_OPTIONS $ERL -extra "$@"

また、"$SCRIPT_PATH"/../lib/*/ebin には、Elixirのコードがbeam形式にて、保存されているようで、beamファイルをErlangに受け渡すことにより、Elixirを起動させるっという手順となっているようです。
何も指定せずにコードからElixirをmake installしたならば、/usr/local/lib/elixir/lib/ ディレクトリの下にbeamファイルが保存されているかと思います。
※まだ全ての動作を完全に読み取ったわけではありません。

$ ll /usr/local/lib/elixir/lib/
total 24
drwxr-xr-x 3 root root 4096 Nov  2 17:28 eex
drwxr-xr-x 3 root root 4096 Nov  2 17:28 elixir
drwxr-xr-x 3 root root 4096 Nov  2 17:28 ex_unit
drwxr-xr-x 3 root root 4096 Nov  2 17:28 iex
drwxr-xr-x 3 root root 4096 Nov  2 17:28 logger
drwxr-xr-x 3 root root 4096 Nov  2 17:28 mix

$ ll /usr/local/lib/elixir/lib/iex/ebin/
total 164
-rw-r--r-- 1 root root  2000 Nov  2 17:28 Elixir.IEx.App.beam
-rw-r--r-- 1 root root 15968 Nov  2 17:28 Elixir.IEx.Autocomplete.beam
-rw-r--r-- 1 root root  6328 Nov  2 17:28 Elixir.IEx.CLI.beam
-rw-r--r-- 1 root root  9536 Nov  2 17:28 Elixir.IEx.Config.beam
-rw-r--r-- 1 root root 12148 Nov  2 17:28 Elixir.IEx.Evaluator.beam
-rw-r--r-- 1 root root 25312 Nov  2 17:28 Elixir.IEx.Helpers.beam
-rw-r--r-- 1 root root  4312 Nov  2 17:28 Elixir.IEx.History.State.beam
-rw-r--r-- 1 root root  3492 Nov  2 17:28 Elixir.IEx.History.beam
-rw-r--r-- 1 root root 24032 Nov  2 17:28 Elixir.IEx.Introspection.beam
-rw-r--r-- 1 root root  1612 Nov  2 17:28 Elixir.IEx.Remsh.beam
-rw-r--r-- 1 root root 15468 Nov  2 17:28 Elixir.IEx.Server.beam
-rw-r--r-- 1 root root  1504 Nov  2 17:28 Elixir.IEx.State.beam
-rw-r--r-- 1 root root 19404 Nov  2 17:28 Elixir.IEx.beam
-rw-r--r-- 1 root root  1000 Nov  2 17:28 iex.app

ここまでくると完璧にErlangの世界になってしまいます。
ElixirとErlangの世界はやはり隣り合った世界だったようです。
しかしまさかここまで近くにいたとは思っておりませんでした。

Elixri Meetupの第二回目もDrecom さん にて3月頃にあるそうで、楽しみにしつつElixirとErlangに励んでいきたいと思います。