As part of debugging an issue in Benchee recently, we needed to look at 
BEAM instructions for some code to see what exactly was being generated on 
OTP 20 and OTP 21. I also know of several other people in the community 
that need to look at the BEAM instructions from time to time, either for 
debugging purposes or for performance analysis purposes. Each of these 
people have their own little script or function stored somewhere that 
generates this code for them. I think, in the spirit of adding things to 
Elixir Core that help in the development of the language itself, it would 
be nice to have a function to take care of generating BEAM instructions in 
Elixir Core.

That's why I am proposing a new function called `Code.beam_instructions/1`. 
It would accept a string of Elixir code and would return a human readable 
binary representation of the BEAM instructions for the given code. 

For reference, here's the implementation that I'm currently using to 
inspect BEAM instructions (which I got from Tobias Peiffer):

```
defmodule ASM do
  def for(code) do
    code = """
    defmodule Test do
      def test do
        #{code}
      end
    end
    """

    [{_, beam}] = Code.compile_string(code)
    {:ok,{_,[{:abstract_code,{_,abstract_code}}]}} = 
:beam_lib.chunks(beam,[:abstract_code])
    {:ok, _module, asm} = :compile.forms(abstract_code, [:to_asm])
    asm
  end
end
```

and here's a link to Saša Jurić's gist on which that's based: 
https://gist.github.com/sasa1977/73274c2be733b5321ace

The reason it's helpful to have in Elixir core instead of in a separate 
file somewhere is that you can drop this function in as a debugging 
statement in the code you're working on instead of having to pull out the 
code you're working on and paste it into an IEX session somewhere else. 
It's a convenience for sure, but it would help make the development 
experience nicer.

-- 
You received this message because you are subscribed to the Google Groups 
"elixir-lang-core" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to elixir-lang-core+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/elixir-lang-core/b3e26fb3-9034-42d7-bb25-fd04d5686b6b%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to