随着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/`

Core Erlang:Erlang的Core中间表示的更多相关文章

  1. NET Core RC2 and .NET Core SDK Preview

    NET Core RC2 and .NET Core SDK Preview 先看一下 .NET Core(包含 ASP.NET Core)的路线图: Beta6: 2015年7月27日 Beta7: ...

  2. 基于Asp.Net Core Mvc和EntityFramework Core 的实战入门教程系列-1

    来个目录吧: 第一章 第二章 第三章 暂时就这么多.后面路线更新吧 本系列文章为翻译加上我个人的使用心得理解,希望帮助热爱学习的程序员. 珍重声明:本系列文章会跟原文有点出入,去掉了罗里吧嗦的文字. ...

  3. EF Core 快速上手——EF Core的三种主要关系类型

    系列文章 EF Core 快速上手--EF Core 入门 本节导航 三种数据库关系类型建模 Migration方式创建和习修改数据库 定义和创建应用DbContext 将复杂查询拆分为子查询   本 ...

  4. EF Core 快速上手——EF Core 入门

    EF Core 快速上手--EF Core 介绍 本章导航 从本书你能学到什么 对EF6.x 程序员的一些话 EF Core 概述 1.3.1 ORM框架的缺点 第一个EF Core应用   本文是对 ...

  5. [转帖]什么是Asp.net Core?和 .net core有什么区别?

    什么是Asp.net Core?和 .net core有什么区别? https://www.cnblogs.com/itzhangxp/p/8322364.html 知道微软开始用 kestrel了 ...

  6. 什么是Asp.net Core?和 .net core有什么区别?

    为什么要写这篇文章 写这篇文章有两个原因,第一个是因为新站点创建出来后一直空置着,所以写一篇文章放在这里.第二就是因为近来在做一些基于Asp.net core平台的项目开发,也遇到了一些问题,正好趁此 ...

  7. 什么是Asp.net Core?和 .net core有什么区别?(转)

    什么是Asp.Net core 我相信很多C# Developer已经对于.net core不算陌生了,就算没有正式使用相信也应该有所了解.微软在推出来.net core的同时为了方便一些原有的项目可 ...

  8. .net core +codefirst(.net core 基础入门,适合这方面的小白阅读) 【我们一起写框架】领域驱动设计的CodeFirst框架(一)—序篇

    .net core +codefirst(.net core 基础入门,适合这方面的小白阅读)   前言 .net core mvc和 .net mvc开发很相似,比如 视图-模型-控制器结构.所以. ...

  9. ASP.NET Core:创建一个Core项目

    ylbtech-ASP.NET Core:创建一个Core项目 1.返回顶部 1. 2. 3. 4.         5. 2.返回顶部 1.新建Razor页面 2. 3. 4.Abc 4.1.Abc ...

  10. ASP.NET Core 用户注册 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core 用户注册 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 用户注册 上一章节我们终于迁移完了 Identity 的数据,也创建 ...

随机推荐

  1. phpcms v9 前台getshell脚本

    phpcms v9 前台getshell脚本 用法:python phpcmsv9getshell.py http://baidu.com # -*- coding:utf-8 -*- ''' --- ...

  2. 书籍推荐系列之一 -- 《凤凰项目:一个IT运维的传奇故事》

    博客已经完全更新了名字,新的名字,新的开始,想让自走向新的道路是很难的,走出舒适圈说了好久,也是时候开始行动了,今天就从写博客开始. 今天给大家推荐一本书,<凤凰项目:一个IT运维的传奇故事&g ...

  3. java基础回顾(一)

    java的特点:开源.安全.跨平台.简单易懂.一次编译可多处运行. JDK:java开发工具包 JDK = JRE+JAVA开发工具 保证能够实现java开发的最小单元 JRE:java运行环境 JR ...

  4. Error parsing column 8 (IsRecommended=0 - SByte) Dapper查询mysql数据库可空的tinyint(1)一个错误

    出错条件: 1.实体属性为bool?类型 2.对应字段为可空的tinyint(1)类型 3.该字段查询结果内即含有null,又含有正常值 google答案,两种建议: 1.修改sql语句,直接cast ...

  5. 企业级分布式监控系统-Zabbix基础

    1.基础分部 1.1Zabbix简介 Zabbix 是一个企业级的分布式开源监控方案. 1.2监控系统架构 C/S架构 客户端/服务器端,这种架构适合规模较小,处于同一地域的环境 C/P/S 客户端/ ...

  6. Python面向对象解析

    面向对象概述 什么是面向对象:从简单来说,如果程序中的所有功能都是用 类 和 对象 来实现,那么就是面向对象编程了. 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无 ...

  7. javascript 45种缓动效果BY司徒正美

    javascript 45种缓动效果 参数 类型 说明 el element 必需,为页面元素 begin number 必需,开始的位置 change number 必需,要移动的距离 durati ...

  8. kubernetes nginx ingress 使用记录

    前言 ingress是一种可以暴露k8s集群内部service的方式,用户编辑配置文件定义一个ingress资源即可实现外部网络访问内网service. ingress controller是来管理所 ...

  9. google开源服务器apprtc的搭建

    本文参考网帖: http://www.jianshu.com/p/c55ecf5a3fcf http://io.diveinedu.com/2015/02/05/%E7%AC%AC%E5%85%AD% ...

  10. 【liferay】1、使用alloy-UI发送ajax请求

    1.首先liferay要发送ajax请求,那么就需要在jsp中定义resourceURL <portlet:resourceURL var="workDeal" id=&qu ...