I notice in that article that both Erlang and Elixir become "Erlang Abstract Form" before becoming "Core Erlang". What is the purpose of the abstract form vs. core erlang? Why this intermediate step?
Compilers use many intermediate steps to transform the input on the way to their final destination, in this case bytecode. Each of these 'passes' performs one or more transformations with a specific goal for each transformation (for instance: an optimization). The Erlang Abstract Format is a parse tree representation for Erlang code.