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/`
Core Erlang:Erlang的Core中间表示的更多相关文章
- 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: ...
- 基于Asp.Net Core Mvc和EntityFramework Core 的实战入门教程系列-1
来个目录吧: 第一章 第二章 第三章 暂时就这么多.后面路线更新吧 本系列文章为翻译加上我个人的使用心得理解,希望帮助热爱学习的程序员. 珍重声明:本系列文章会跟原文有点出入,去掉了罗里吧嗦的文字. ...
- EF Core 快速上手——EF Core的三种主要关系类型
系列文章 EF Core 快速上手--EF Core 入门 本节导航 三种数据库关系类型建模 Migration方式创建和习修改数据库 定义和创建应用DbContext 将复杂查询拆分为子查询 本 ...
- EF Core 快速上手——EF Core 入门
EF Core 快速上手--EF Core 介绍 本章导航 从本书你能学到什么 对EF6.x 程序员的一些话 EF Core 概述 1.3.1 ORM框架的缺点 第一个EF Core应用 本文是对 ...
- [转帖]什么是Asp.net Core?和 .net core有什么区别?
什么是Asp.net Core?和 .net core有什么区别? https://www.cnblogs.com/itzhangxp/p/8322364.html 知道微软开始用 kestrel了 ...
- 什么是Asp.net Core?和 .net core有什么区别?
为什么要写这篇文章 写这篇文章有两个原因,第一个是因为新站点创建出来后一直空置着,所以写一篇文章放在这里.第二就是因为近来在做一些基于Asp.net core平台的项目开发,也遇到了一些问题,正好趁此 ...
- 什么是Asp.net Core?和 .net core有什么区别?(转)
什么是Asp.Net core 我相信很多C# Developer已经对于.net core不算陌生了,就算没有正式使用相信也应该有所了解.微软在推出来.net core的同时为了方便一些原有的项目可 ...
- .net core +codefirst(.net core 基础入门,适合这方面的小白阅读) 【我们一起写框架】领域驱动设计的CodeFirst框架(一)—序篇
.net core +codefirst(.net core 基础入门,适合这方面的小白阅读) 前言 .net core mvc和 .net mvc开发很相似,比如 视图-模型-控制器结构.所以. ...
- 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 ...
- ASP.NET Core 用户注册 - ASP.NET Core 基础教程 - 简单教程,简单编程
原文:ASP.NET Core 用户注册 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 用户注册 上一章节我们终于迁移完了 Identity 的数据,也创建 ...
随机推荐
- leetcode算法题1: 两个二进制数有多少位不相同?异或、位移、与运算的主场
/* The Hamming distance between two integers is the number of positions at which the corresponding b ...
- Python函数篇(3)-内置函数、文件处理
1.内置函数 上一篇文章中,我重点写了reduce.map.filter3个内置函数,在本篇章节中,会补充其他的一些常规内置函数,并重点写max,min函数,其他没有说明的函数,会在后面写到类和面向对 ...
- Jackson将json string转为Object,org.json读取json数组
从json文件读取json string或者自定义json string,将其转为object.下面采用的object为map,根据map读取json的某个数据,可以读取第一级的数据name,后来发现 ...
- HDU1075-What Are You Talking About
What Are You Talking About Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 102400/204800 K ...
- mysql的explain
explain 一般用于分析sql. 如下 [SQL] 纯文本查看 复制代码 ? 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 2 ...
- 360提供的php防注入代码
<?php //Code By Safe3 function customError($errno, $errstr, $errfile, $errline) { echo "< ...
- JavaScript学习笔记(一)数组排序
数组(Array)在JavaScript中是非常常用的类型,关于数组的排序,与C#等语法中的排序,乍看相似,其实差别比较大. Array的排序方法有两个,分别是reverse()和sort(). re ...
- Redis入门篇
一.Redis简介: Redis(http://redis.io)是一款开源的.高性能的键-值存储(key-value store),它是用ANSI C来编写.Redis的项目名是Remote Dic ...
- 你不知道的javaScript上卷(第一章 作用域是什么)
在写这篇博客时这本书我已经是看过一遍了,为了加深印象和深入学习于是打算做这系列的前端经典书籍导读博文,大家如果觉得这本书讲的好可以自己买来看看,我是比较喜欢看纸质版书的,因为这样才有读书的那种感觉. ...
- 关于Mysql下使用Dapper QueryFirstOrDefault的问题
1.环境 MySql:5.7.20 Dapper:1.50.2 .Net:4.5 2.遇到的问题 在开发中我发现,使用Dapper查询数据时,第一次查询正确,第二次查询就差不出来,或者直接修改数据库后 ...