erlang 中间码

本文探讨Erlang的中间码,包括core中间码的形成,通过`c(test, [to_core]).`编译文件生成。还介绍了Erlang虚拟机的代码执行原理,并通过一个实际例子展示了中间码在短路或运算中的应用,揭示了表达式如何在虚拟机中被处理。" 50647443,4892163,Lua脚本驱动的嵌入式系统自动化测试框架,"['嵌入式开发', '测试', '脚本语言', 'Lua', '自动化']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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虚拟机代码执行原理
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值