Re: [elixir-core:8236] PROPOSAL: Code.beam_instructions/2

2018-08-06 Thread José Valim
What do you think about Michal's decompile package:
https://github.com/michalmuskala/decompile

You can install as an archive and use it any project from the command line
and it supports multiple formats.





*José Valim*
www.plataformatec.com.br
Skype: jv.ptec
Founder and Director of R

On Mon, Aug 6, 2018 at 9:48 AM, Devon Estes  wrote:

> 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.
>

-- 
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/CAGnRm4%2B3K%2BstfxX-4xLFESHweM%2BNOQ_LzjNCekbWEqBM07GbWg%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.


[elixir-core:8236] PROPOSAL: Code.beam_instructions/2

2018-08-06 Thread Devon Estes
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.