Core Erlang:Erlang的Core中间表示

随着erlang的不断发展,它的语法越来越复杂,不便于诸如分析器,调试器此类程序在源码层次直接进行解析,而CORE Erlang旨在为Erlang提供一个人类可读可改的中间表示(Intermediate representation),这样就能方便面向程序源码的工具的开发。 千言万语不如代码一句。这里我们通过一个例子来直观的了解究竟什么是CORE Erlang。在helloworld.erl中输入如下代码:

-module (helloworld).
-export([simple/0, complicated/2]).

simple() ->
 atom_to_list(hello_world).

complicated(Type,List) ->
 List = [{Type,Elem} || Elem<-List,is_atom(Elem)],
 case Type of
  bool when bool =:= true -> R1 = bool_true;
  bool -> R1 = bool_false;
  integer -> R1 = 1+2*3/4
 end.

Erlang/OTP R10以及之后发行的版本在编译helloworld.erl时传入to_core标志: c(helloworld,to_core). 将会生成CORE Erlang文件helloworld.core:

module 'helloworld' ['complicated'/2,
           'module_info'/0,
           'module_info'/1,
           'simple'/0]
    attributes [%% Line 1
      'file' =
          %% Line 1
          [{[104|[101|[108|[108|[111|[119|[111|[114|[108|[100|[46|[101|[114|[108]]]]]]]]]]]]]],1}]]
'simple'/0 =
    %% Line 4
    fun () ->
   %% Line 5
   [104|[101|[108|[108|[111|[95|[119|[111|[114|[108|[100]]]]]]]]]]]

可以看到,模块头部信息和helloworld:simple()函数在CORE Erlang中还是很清楚的,但是对于helloworld:complicated(Type,List)它就完全背离了自己的初衷:

'complicated'/2 =
    %% Line 7
    fun (_@c1,_@c0) ->
   let <_@c6> =
       letrec
      'lc$^0'/1 =
          %% Line 8
          fun (_@c4) ->
         case _@c4 of
           <[Elem|_@c3]>
               when call 'erlang':'is_atom'
                (Elem) ->
               let <_@c5> =
              apply 'lc$^0'/1
                  (_@c3)
               in  ( [{_@c1,Elem}|_@c5]
                -| ['compiler_generated'] )
           ( <[Elem|_@c3]> when 'true' ->
            apply 'lc$^0'/1
                (_@c3)
             -| ['compiler_generated'] )
           <[]> when 'true' ->
               []
           ( <_@c4> when 'true' ->
            ( primop 'match_fail'
                  ({'function_clause',_@c4})
              -| [{'function_name',{'lc$^0',1}}] )
             -| ['compiler_generated'] )
         end
       in  %% Line 8
      apply 'lc$^0'/1
          (_@c0)
   in  %% Line 8
       case _@c6 of
         <_@c16>
        when call 'erlang':'=:='
         (_@c6,
          _@c0) ->
        %% Line 9
        case _@c1 of
          %% Line 11
          <'bool'> when 'true' ->
         'bool_false'
          %% Line 12
          <'integer'> when 'true' ->
         2.50000000000000000000e+00
          ( <_@c13> when 'true' ->
           primop 'match_fail'
               ({'case_clause',_@c13})
            -| ['compiler_generated'] )
        end
         ( <_@c7> when 'true' ->
          primop 'match_fail'
         ({'badmatch',_@c7})
      -| ['compiler_generated'] )
       end
'module_info'/0 =
    fun () ->
   call 'erlang':'get_module_info'
       ('helloworld')
'module_info'/1 =
    fun (_@c0) ->
   call 'erlang':'get_module_info'
       ('helloworld', _@c0)
end

不过话又说回来,CORE Erlang的受众终究是代码分析器,调试器之类的工具,人类可读可改更像是一个崇高追求,如果我们观察会发现CORE Erlang的中间表示的确降低了语法的解析难度,它将源码的各种语法用let in,call ,case of,fun等几个简单的结构来表示,从这点来看CORE Erlang算是到达了它的初衷。

[+] core erlang project index : http://www.it.uu.se/research/group/hipe/cerl/`

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏GuZhenYin

一步步学习EF Core(3.EF Core2.0路线图)

前言 这几天一直在研究EF Core的官方文档,暂时没有发现什么比较新的和EF6.x差距比较大的东西. 不过我倒是发现了EF Core的路线图更新了,下面我们就...

25290
来自专栏GuZhenYin

C#使用Xamarin开发可移植移动应用终章(11.获取设备信息与常用组件,开源一个可开发模版.)

前言 源码地址:https://github.com/l2999019/DemoApp 可以Star一下,随意 - - 说点什么.. 本系列,终于要终章了..感...

26370
来自专栏SmartSql

SmartSql 常见问题

SmartSql 希望 开发人员更多的接触 Sql ,获得绝对的控制权与安全感。所以目前没有计划支持 Code First 编程模式。

20630
来自专栏*坤的Blog

KMS激活工具

46130
来自专栏BestSDK

微软宣布开源Azure Service Fabric SDK,可在github上获取

微软最近宣布Azure Service Fabric SDK的源代码已经开源。Azure Service Fabric是一个分布式平台,用于微服务的打包、部署和...

39420
来自专栏张善友的专栏

易学易用的Windows PowerShell

Windows PowerShell 是微软为 Windows 环境所开发的 shell 及脚本语言技术,这项全新的技术提供了丰富的控制与自动化的系统管理能力;...

23760
来自专栏Jerry的SAP技术分享

SAP OData编程指南

OData(Open Data Protocol)协议是一个开放的工业标准,用于定义RESTFul API的设计和使用。我的文章标题前加上SAP的前缀,只是为了...

36520
来自专栏落影的专栏

iOS开发笔记(四)

前言 最近遇到一个苦恼的问题,寻找了漫长的时间才解决。 起因是项目需要fork一个新的分支到新的git,于是把代码复制到新的git,创建git库,然后推送,一...

39770
来自专栏遊俠扎彪

无线路由器(SOHO路由器/IP分享器)的常用工作模式

也叫接入点模式,也是最常见的模式,拓扑如下图。

42650
来自专栏Windows Community

About Windows 10 SDK Preview Build 17110

在 Windows Developer Day 活动同时,微软正式 Release 了 Windows 10 SDK Preview Build 17110。 ...

36540

扫码关注云+社区

领取腾讯云代金券