2016-07-22 3 views
1
iex(3)> defmodule Mymod do 
...(3)> def func1, do: nil 
...(3)> end 
{:module, Mymod, 
<<70, 79, 82, 49, 0, 0, 4, 152, 66, 69, 65, 77, 69, 120, 68, 99, 0, 0, 0, 128, 
    131, 104, 2, 100, 0, 14, 101, 108, 105, 120, 105, 114, 95, 100, 111, 99, 115, 
    95, 118, 49, 108, 0, 0, 0, 4, 104, 2, ...>>, {:func1, 0}} 

バイナリ文字列として解凍しようとしましたが、動作していないようです:同じ値を返します。defmoduleで返される(おそらく)このバイト列は何ですか?

iex(5)> raw = <<70, 79, 82, 49, 0, 0, 3, 244, 66, 69, 65, 77, 69, 120, 68, 99, 0, 0, 0, 94, 
...(5)> 131, 104, 2, 100, 0, 14, 101, 108, 105, 120, 105, 114, 95, 100, 111, 99, 115, 
...(5)> 95, 118, 49, 108, 0, 0, 0, 4, 104, 2>> 

<<70, 79, 82, 49, 0, 0, 3, 244, 66, 69, 65, 77, 69, 120, 68, 99, 0, 0, 0, 94, 
    131, 104, 2, 100, 0, 14, 101, 108, 105, 120, 105, 114, 95, 100, 111, 99, 115, 
    95, 118, 49, 108, 0, 0, 0, 4, 104, 2>> 

iex(7)> Kernel.is_bitstring raw 
true 
iex(8)> Kernel.is_binary raw 
true 

答えて

3

バイナリは、モジュールの"object code"です。新しいVMインスタンスの:code.load_binary/3にこれを渡すことで、モジュールで定義したすべての機能を新しいVMインスタンスにロードできます。 (Here's結局defmoduleによって返された4つのタプルを返します正確な場所。)

デモ:

まずセッション:

iex(1)> {_, _, object_code, _} = defmodule Add do 
...(1)> def add(a, b), do: a + b 
...(1)> end 
{:module, Add, 
<<70, 79, 82, 49, 0, 0, 4, 248, 66, 69, 65, 77, 69, 120, 68, 99, 0, 0, 0, 157, 
    131, 104, 2, 100, 0, 14, 101, 108, 105, 120, 105, 114, 95, 100, 111, 99, 115, 
    95, 118, 49, 108, 0, 0, 0, 4, 104, 2, ...>>, {:add, 2}} 
iex(3)> inspect(object_code, limit: :infinity) 
"<<70, 79, 82, 49, 0, 0, 4, 248, 66, 69, 65, 77, 69, 120, 68, 99, 0, 0, 0, 157, 131, 104, 2, 100, 0, 14, 101, 108, 105, 120, 105, 114, 95, 100, 111, 99, 115, 95, 118, 49, 108, 0, 0, 0, 4, 104, 2, 100, 0, 4, 100, 111, 99, 115, 108, 0, 0, 0, 1, 104, 5, 104, 2, 100, 0, 3, 97, 100, 100, 97, 2, 97, 2, 100, 0, 3, 100, 101, 102, 108, 0, 0, 0, 2, 104, 3, 100, 0, 1, 97, 106, 100, 0, 3, 110, 105, 108, 104, 3, 100, 0, 1, 98, 106, 100, 0, 3, 110, 105, 108, 106, 100, 0, 3, 110, 105, 108, 106, 104, 2, 100, 0, 9, 109, 111, 100, 117, 108, 101, 100, 111, 99, 104, 2, 97, 1, 100, 0, 3, 110, 105, 108, 104, 2, 100, 0, 13, 99, 97, 108, 108, 98, 97, 99, 107, 95, 100, 111, 99, 115, 106, 104, 2, 100, 0, 9, 116, 121, 112, 101, 95, 100, 111, 99, 115, 106, 106, 0, 0, 0, 65, 116, 111, 109, 0, 0, 0, 82, 0, 0, 0, 9, 10, 69, 108, 105, 120, 105, 114, 46, 65, 100, 100, 8, 95, 95, 105, 110, 102, 111, 95, 95, 9, 102, 117, 110, 99, 116, 105, 111, 110, 115, 6, 109, 97, 99, 114, 111, 115, 6, 101, 114, 108, 97, 110, 103, 15, 103, 101, 116, 95, 109, 111, 100, 117, 108, 101, 95, 105, 110, 102, 111, 3, 97, 100, 100, 1, 43, 11, 109, 111, 100, 117, 108, 101, 95, 105, 110, 102, 111, 0, 0, 67, 111, 100, 101, 0, 0, 0, 128, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 153, 0, 0, 0, 12, 0, 0, 0, 4, 1, 16, 153, 0, 2, 18, 34, 16, 1, 32, 48, 85, 3, 59, 3, 85, 23, 64, 50, 53, 66, 69, 1, 48, 64, 71, 0, 3, 19, 1, 64, 64, 2, 3, 19, 1, 80, 64, 3, 19, 64, 18, 3, 153, 0, 78, 32, 0, 1, 96, 153, 16, 2, 18, 114, 32, 1, 112, 153, 16, 125, 5, 32, 16, 3, 19, 3, 19, 1, 128, 153, 0, 2, 18, 146, 0, 1, 144, 64, 18, 3, 153, 0, 78, 16, 32, 1, 160, 153, 0, 2, 18, 146, 16, 1, 176, 64, 3, 19, 64, 18, 3, 153, 0, 78, 32, 0, 3, 83, 116, 114, 84, 0, 0, 0, 0, 73, 109, 112, 84, 0, 0, 0, 40, 0, 0, 0, 3, 0, 0, 0, 5, 0, 0, 0, 6, 0, 0, 0, 2, 0, 0, 0, 5, 0, 0, 0, 8, 0, 0, 0, 2, 0, 0, 0, 5, 0, 0, 0, 6, 0, 0, 0, 1, 69, 120, 112, 84, 0, 0, 0, 52, 0, 0, 0, 4, 0, 0, 0, 9, 0, 0, 0, 1, 0, 0, 0, 11, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 7, 0, 0, 0, 2, 0, 0, 0, 7, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 2, 76, 105, 116, 84, 0, 0, 0, 35, 0, 0, 0, 25, 120, 156, 99, 96, 96, 96, 100, 96, 96, 16, 108, 206, 1, 146, 140, 25, 76, 41, 12, 204, 137, 41, 41, 137, 76, 89, 0, 32, 96, 3, 202, 0, 76, 111, 99, 84, 0, 0, 0, 4, 0, 0, 0, 0, 65, 116, 116, 114, 0, 0, 0, 40, 131, 108, 0, 0, 0, 1, 104, 2, 100, 0, 3, 118, 115, 110, 108, 0, 0, 0, 1, 110, 16, 0, 143, 92, 11, 56, 162, 21, 116, 51, 224, 46, 109, 82, 47, 149, 76, 138, 106, 106, 67, 73, 110, 102, 0, 0, 0, 174, 131, 108, 0, 0, 0, 4, 104, 2, 100, 0, 7, 111, 112, 116, 105, 111, 110, 115, 108, 0, 0, 0, 1, 100, 0, 10, 100, 101, 98, 117, 103, 95, 105, 110, 102, 111, 106, 104, 2, 100, 0, 7, 118, 101, 114, 115, 105, 111, 110, 107, 0, 5, 54, 46, 48, 46, 51, 104, 2, 100, 0, 4, 116, 105, 109, 101, 104, 6, 98, 0, 0, 7, 224, 97, 7, 97, 22, 97, 8, 97, 15, 97, 33, 104, 2, 100, 0, 6, 115, 111, 117, 114, 99, 101, 107, 0, 76, 47, 85, 115, 101, 114, 115, 47, 117, 116, 107, 97, 114, 115, 104, 47, 100, 101, 118, 47, 109, 101, 47, 116, 111, 112, 99, 111, 100, 101, 114, 47, 51, 48, 48, 53, 52, 56, 48, 50, 45, 99, 108, 111, 117, 100, 45, 104, 117, 98, 45, 97, 112, 105, 45, 117, 112, 100, 97, 116, 101, 115, 47, 119, 97, 116, 101, 114, 119, 111, 114, 107, 115, 47, 105, 101, 120, 106, 0, 0, 65, 98, 115, 116, 0, 0, 1, 168, 131, 80, 0, 0, 4, 215, 120, 156, 141, 83, 193, 82, 131, 48, 16, 77, 9, 45, 109, 15, 214, 255, 112, 198, 153, 30, 188, 215, 131, 223, 145, 89, 72, 90, 130, 33, 97, 66, 168, 237, 223, 155, 5, 65, 2, 42, 114, 34, 111, 222, 123, 251, 118, 179, 201, 35, 78, 14, 22, 62, 24, 164, 181, 179, 144, 57, 118, 61, 42, 66, 72, 146, 199, 156, 236, 192, 57, 43, 211, 198, 9, 32, 156, 36, 153, 41, 43, 169, 4, 39, 15, 218, 48, 104, 156, 97, 178, 172, 140, 117, 19, 234, 138, 147, 248, 236, 121, 121, 244, 78, 168, 20, 55, 88, 205, 9, 155, 210, 240, 6, 173, 246, 111, 74, 222, 164, 125, 126, 229, 252, 7, 150, 184, 161, 63, 230, 137, 114, 31, 116, 203, 152, 212, 103, 195, 152, 183, 244, 71, 10, 156, 67, 84, 252, 80, 190, 174, 68, 150, 79, 37, 104, 211, 70, 137, 221, 189, 106, 121, 244, 220, 232, 206, 124, 140, 38, 149, 245, 225, 50, 55, 231, 175, 27, 45, 77, 171, 216, 230, 212, 227, 224, 76, 137, 248, 126, 168, 94, 7, 120, 63, 177, 16, 236, 154, 10, 153, 59, 159, 36, 115, 222, 60, 132, 55, 37, 100, 214, 132, 24, 45, 249, 203, 132, 212, 206, 50, 192, 30, 53, 56, 121, 21, 204, 79, 200, 138, 186, 22, 117, 81, 252, 210, 73, 216, 123, 107, 16, 82, 99, 37, 235, 63, 103, 17, 58, 172, 93, 83, 41, 241, 47, 103, 10, 250, 62, 205, 53, 168, 233, 98, 174, 244, 238, 68, 8, 37, 82, 59, 113, 17, 182, 232, 190, 124, 237, 239, 191, 31, 44, 110, 240, 100, 25, 40, 18, 54, 153, 130, 166, 246, 11, 222, 181, 56, 12, 145, 140, 47, 165, 40, 190, 7, 144, 249, 51, 16, 36, 118, 97, 59, 101, 20, 40, 113, 51, 17, 232, 3, 1, 193, 61, 197, 149, 213, 82, 1, 41, 22, 10, 127, 93, 123, 95, 117, 73, 71, 175, 96, 81, 22, 99, 115, 65, 84, 80, 94, 133, 191, 27, 43, 74, 131, 207, 56, 172, 35, 172, 2, 125, 9, 176, 195, 69, 56, 214, 109, 84, 59, 172, 121, 115, 227, 39, 59, 175, 62, 153, 250, 240, 76, 187, 84, 163, 252, 209, 224, 220, 58, 180, 196, 211, 49, 56, 167, 167, 99, 223, 142, 23, 70, 166, 66, 116, 245, 180, 172, 41, 62, 1, 99, 185, 84, 215, 76, 105, 110, 101, 0, 0, 0, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 1, 0, 0, 0, 1, 18, 33, 0, 3, 105, 101, 120, 0>>" 

第2セッション:

iex(1)> Add.add 1, 2 
** (UndefinedFunctionError) function Add.add/2 is undefined (module Add is not available) 
    Add.add(1, 2) 
iex(1)> object_code = <<70, 79, 82, 49, 0, 0, 4, 248, 66, 69, 65, 77, 69, 120, 68, 99, 0, 0, 0, 157, 131, 104, 2, 100, 0, 14, 101, 108, 105, 120, 105, 114, 95, 100, 111, 99, 115, 95, 118, 49, 108, 0, 0, 0, 4, 104, 2, 100, 0, 4, 100, 111, 99, 115, 108, 0, 0, 0, 1, 104, 5, 104, 2, 100, 0, 3, 97, 100, 100, 97, 2, 97, 2, 100, 0, 3, 100, 101, 102, 108, 0, 0, 0, 2, 104, 3, 100, 0, 1, 97, 106, 100, 0, 3, 110, 105, 108, 104, 3, 100, 0, 1, 98, 106, 100, 0, 3, 110, 105, 108, 106, 100, 0, 3, 110, 105, 108, 106, 104, 2, 100, 0, 9, 109, 111, 100, 117, 108, 101, 100, 111, 99, 104, 2, 97, 1, 100, 0, 3, 110, 105, 108, 104, 2, 100, 0, 13, 99, 97, 108, 108, 98, 97, 99, 107, 95, 100, 111, 99, 115, 106, 104, 2, 100, 0, 9, 116, 121, 112, 101, 95, 100, 111, 99, 115, 106, 106, 0, 0, 0, 65, 116, 111, 109, 0, 0, 0, 82, 0, 0, 0, 9, 10, 69, 108, 105, 120, 105, 114, 46, 65, 100, 100, 8, 95, 95, 105, 110, 102, 111, 95, 95, 9, 102, 117, 110, 99, 116, 105, 111, 110, 115, 6, 109, 97, 99, 114, 111, 115, 6, 101, 114, 108, 97, 110, 103, 15, 103, 101, 116, 95, 109, 111, 100, 117, 108, 101, 95, 105, 110, 102, 111, 3, 97, 100, 100, 1, 43, 11, 109, 111, 100, 117, 108, 101, 95, 105, 110, 102, 111, 0, 0, 67, 111, 100, 101, 0, 0, 0, 128, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 153, 0, 0, 0, 12, 0, 0, 0, 4, 1, 16, 153, 0, 2, 18, 34, 16, 1, 32, 48, 85, 3, 59, 3, 85, 23, 64, 50, 53, 66, 69, 1, 48, 64, 71, 0, 3, 19, 1, 64, 64, 2, 3, 19, 1, 80, 64, 3, 19, 64, 18, 3, 153, 0, 78, 32, 0, 1, 96, 153, 16, 2, 18, 114, 32, 1, 112, 153, 16, 125, 5, 32, 16, 3, 19, 3, 19, 1, 128, 153, 0, 2, 18, 146, 0, 1, 144, 64, 18, 3, 153, 0, 78, 16, 32, 1, 160, 153, 0, 2, 18, 146, 16, 1, 176, 64, 3, 19, 64, 18, 3, 153, 0, 78, 32, 0, 3, 83, 116, 114, 84, 0, 0, 0, 0, 73, 109, 112, 84, 0, 0, 0, 40, 0, 0, 0, 3, 0, 0, 0, 5, 0, 0, 0, 6, 0, 0, 0, 2, 0, 0, 0, 5, 0, 0, 0, 8, 0, 0, 0, 2, 0, 0, 0, 5, 0, 0, 0, 6, 0, 0, 0, 1, 69, 120, 112, 84, 0, 0, 0, 52, 0, 0, 0, 4, 0, 0, 0, 9, 0, 0, 0, 1, 0, 0, 0, 11, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 7, 0, 0, 0, 2, 0, 0, 0, 7, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 2, 76, 105, 116, 84, 0, 0, 0, 35, 0, 0, 0, 25, 120, 156, 99, 96, 96, 96, 100, 96, 96, 16, 108, 206, 1, 146, 140, 25, 76, 41, 12, 204, 137, 41, 41, 137, 76, 89, 0, 32, 96, 3, 202, 0, 76, 111, 99, 84, 0, 0, 0, 4, 0, 0, 0, 0, 65, 116, 116, 114, 0, 0, 0, 40, 131, 108, 0, 0, 0, 1, 104, 2, 100, 0, 3, 118, 115, 110, 108, 0, 0, 0, 1, 110, 16, 0, 143, 92, 11, 56, 162, 21, 116, 51, 224, 46, 109, 82, 47, 149, 76, 138, 106, 106, 67, 73, 110, 102, 0, 0, 0, 174, 131, 108, 0, 0, 0, 4, 104, 2, 100, 0, 7, 111, 112, 116, 105, 111, 110, 115, 108, 0, 0, 0, 1, 100, 0, 10, 100, 101, 98, 117, 103, 95, 105, 110, 102, 111, 106, 104, 2, 100, 0, 7, 118, 101, 114, 115, 105, 111, 110, 107, 0, 5, 54, 46, 48, 46, 51, 104, 2, 100, 0, 4, 116, 105, 109, 101, 104, 6, 98, 0, 0, 7, 224, 97, 7, 97, 22, 97, 8, 97, 15, 97, 33, 104, 2, 100, 0, 6, 115, 111, 117, 114, 99, 101, 107, 0, 76, 47, 85, 115, 101, 114, 115, 47, 117, 116, 107, 97, 114, 115, 104, 47, 100, 101, 118, 47, 109, 101, 47, 116, 111, 112, 99, 111, 100, 101, 114, 47, 51, 48, 48, 53, 52, 56, 48, 50, 45, 99, 108, 111, 117, 100, 45, 104, 117, 98, 45, 97, 112, 105, 45, 117, 112, 100, 97, 116, 101, 115, 47, 119, 97, 116, 101, 114, 119, 111, 114, 107, 115, 47, 105, 101, 120, 106, 0, 0, 65, 98, 115, 116, 0, 0, 1, 168, 131, 80, 0, 0, 4, 215, 120, 156, 141, 83, 193, 82, 131, 48, 16, 77, 9, 45, 109, 15, 214, 255, 112, 198, 153, 30, 188, 215, 131, 223, 145, 89, 72, 90, 130, 33, 97, 66, 168, 237, 223, 155, 5, 65, 2, 42, 114, 34, 111, 222, 123, 251, 118, 179, 201, 35, 78, 14, 22, 62, 24, 164, 181, 179, 144, 57, 118, 61, 42, 66, 72, 146, 199, 156, 236, 192, 57, 43, 211, 198, 9, 32, 156, 36, 153, 41, 43, 169, 4, 39, 15, 218, 48, 104, 156, 97, 178, 172, 140, 117, 19, 234, 138, 147, 248, 236, 121, 121, 244, 78, 168, 20, 55, 88, 205, 9, 155, 210, 240, 6, 173, 246, 111, 74, 222, 164, 125, 126, 229, 252, 7, 150, 184, 161, 63, 230, 137, 114, 31, 116, 203, 152, 212, 103, 195, 152, 183, 244, 71, 10, 156, 67, 84, 252, 80, 190, 174, 68, 150, 79, 37, 104, 211, 70, 137, 221, 189, 106, 121, 244, 220, 232, 206, 124, 140, 38, 149, 245, 225, 50, 55, 231, 175, 27, 45, 77, 171, 216, 230, 212, 227, 224, 76, 137, 248, 126, 168, 94, 7, 120, 63, 177, 16, 236, 154, 10, 153, 59, 159, 36, 115, 222, 60, 132, 55, 37, 100, 214, 132, 24, 45, 249, 203, 132, 212, 206, 50, 192, 30, 53, 56, 121, 21, 204, 79, 200, 138, 186, 22, 117, 81, 252, 210, 73, 216, 123, 107, 16, 82, 99, 37, 235, 63, 103, 17, 58, 172, 93, 83, 41, 241, 47, 103, 10, 250, 62, 205, 53, 168, 233, 98, 174, 244, 238, 68, 8, 37, 82, 59, 113, 17, 182, 232, 190, 124, 237, 239, 191, 31, 44, 110, 240, 100, 25, 40, 18, 54, 153, 130, 166, 246, 11, 222, 181, 56, 12, 145, 140, 47, 165, 40, 190, 7, 144, 249, 51, 16, 36, 118, 97, 59, 101, 20, 40, 113, 51, 17, 232, 3, 1, 193, 61, 197, 149, 213, 82, 1, 41, 22, 10, 127, 93, 123, 95, 117, 73, 71, 175, 96, 81, 22, 99, 115, 65, 84, 80, 94, 133, 191, 27, 43, 74, 131, 207, 56, 172, 35, 172, 2, 125, 9, 176, 195, 69, 56, 214, 109, 84, 59, 172, 121, 115, 227, 39, 59, 175, 62, 153, 250, 240, 76, 187, 84, 163, 252, 209, 224, 220, 58, 180, 196, 211, 49, 56, 167, 167, 99, 223, 142, 23, 70, 166, 66, 116, 245, 180, 172, 41, 62, 1, 99, 185, 84, 215, 76, 105, 110, 101, 0, 0, 0, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 1, 0, 0, 0, 1, 18, 33, 0, 3, 105, 101, 120, 0>> 
iex(2)> :code.load_binary Add, 'anything', object_code 
{:module, Add} 
iex(3)> Add.add 1, 2 
3 

。なお、完全なオブジェクトコードを取得するには、とlimit: :infinityを使用しなければなりませんでした。デフォルトの動作では、最初の50バイトのみを出力します。

+0

このインナー表現から得ることができますか? –

関連する問題