erlang 中間碼

erlang 中間碼

1. core中間碼的形成

對於文件test.erl, 可以在編譯的時候,加to_core 參數
c(test, [to_core]).

2. 其他中間碼的形成

參考: erlang虛擬機代碼執行原理

3. 應用

今天在看代碼的時候發現一個寫法

-module(test).
-export([test/0]).

test() ->
    Hello = lists:concat(["he", "llo"]),
    World = lists:concat(["wo", "rld"]),
    case Hello =/= "hello" orelse World of
        "world" ->
            true;
        _ ->
            false
    end.

執行

1> c(test).
{ok,test}
2> test:test().
true

也就是說如果”短路或”的前面一個表達式的值是false,那麼結果將會是後面一個表達式的值。還是蠻奇怪的,之前一直以爲這是一個錯誤的表達式。。
爲了看下虛擬機怎麼處理這個問題, 學了下erlang core code 的生成。
就是c(test, [to_core]).,可以將test.erl -> test.core
test.core 截取如下

module 'test' ['module_info'/0,
           'module_info'/1,
           'test'/0]
    attributes []
'test'/0 =
    %% Line 4
    fun () ->
    let <Hello> =
        call %% Line 5
         'lists':%% Line 5
             'concat'
        (%% Line 5
         [[104|[101]]|[[108|[108|[111]]]]])
    in  let <World> =
        call %% Line 6
             'lists':%% Line 6
                 'concat'
            (%% Line 6
             [[119|[111]]|[[114|[108|[100]]]]])
        in  let <_cor4> =
            case <> of
              %% Line 7
              ( <>
                when call 'erlang':'=/='
                  (Hello,
                   [104|[101|[108|[108|[111]]]]]) ->
                'true'
            -| ['compiler_generated'] )
              %% Line 7
              ( <> when 'true' ->
                World
            -| ['compiler_generated'] )
            end
        in  %% Line 7
            case _cor4 of
              %% Line 8
              <[119|[111|[114|[108|[100]]]]]> when 'true' ->
              %% Line 9
              'true'
              %% Line 10
              <_cor6> when 'true' ->
              %% Line 11
              'false'
            end
'module_info'/0 =
    fun () ->
    call 'erlang':'get_module_info'
        ('test')
'module_info'/1 =
    fun (_cor0) ->
    call 'erlang':'get_module_info'
        ('test', _cor0)
end

可以看出<_cor4> 的賦值, 如果前一個表達式不成立的時候,就直接返回World的值。

參考:

  1. 堅強2002 Know a little Core Erlang
  2. erlang虛擬機代碼執行原理
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章