In the previous post, we presented the most powerful Elixir Feature, Macros. Today we move on to modules and functions in runtime. This post is part of the functional language series, and it is based on the remarkable book Elixir In Action by Sasa Juric.
Elixir runtime is BEAM instance.
BEAM is the virtual machine at the core of the Erlang Open Telecom Platform (OTP). BEAM is part of the Erlang Run-Time System (ERTS), which compiles Erlang and Elixir’s source code into bytecode, which is then executed on the BEAM. [source]
Let’s examine the BEAM os process on my macOS by starting.
From this, it is clear that I used
asdf for Erlang and Elixir installation on my macOS. It is also clear that starting
iex requires several BEAM program switch (
To run Elixir Module and it’s functions, that module must be first compiled into the BEAM
bytecode. Elixir Module source file with
.ex the extension is compiled to the bytecode with the filename not related to the source file name. In our example, we will run the following module. To compile it, we are using
elixirc the program.
Remember that part of Elixir’s application deployment is moving those
bytecode files to the production machine. The source is not needed. It is important to note the file name of the compiled bytecode:
How to run this
import statement to load module
iex shell. Note that when you run:
iex faulty_programs.ex iex automatically compiles and imports a module, but the compilation is done in memory so
bytecode the file will not be generated on the filesystem.
Sometimes it is useful to know default paths where BEAM is looking for
bytecode files. You can get this info with:
:code.get_path erlang function.
- the filename of module compiled bytecode
- how to compile
- how to import
- how to deploy
- what does