《深入理解Android虚拟机内存管理》示例程序编译阶段生成的各种语法树完整版
1.tokens
"int" "int"
<SPACES> " "
<IDENTIFIER> "global_a"
<SPACES> " "
"=" "="
<SPACES> " "
<INTEGER> "5"
";" ";"
<SPACES> "\r\n"
"long" "long"
<SPACES> " "
<IDENTIFIER> "global_b"
";" ";"
<SPACES> "\r\n"
"char" "char"
<SPACES> " "
"*" "*"
<SPACES> " "
<IDENTIFIER> "global_c"
<SPACES> " "
"=" "="
<SPACES> " "
"\"" "\"HelloWorld!\""
";" ";"
<SPACES> "\r\n"
"int" "int"
"[" "["
<INTEGER> "5"
"]" "]"
<SPACES> " "
<IDENTIFIER> "global_array"
";" ";"
<SPACES> "\r\n"
"struct" "struct"
<SPACES> " "
<IDENTIFIER> "point"
<SPACES> " "
<IDENTIFIER> "global_struct"
";" ";"
<SPACES> "\r\n"
"struct" "struct"
<SPACES> " "
<IDENTIFIER> "point"
"{" "{"
<SPACES> "\r\n "
"int" "int"
<SPACES> " "
<IDENTIFIER> "x"
";" ";"
<SPACES> "\r\n "
"int" "int"
<SPACES> " "
<IDENTIFIER> "y"
";" ";"
<SPACES> "\r\n"
"}" "}"
";" ";"
<SPACES> "\r\n"
"int" "int"
<SPACES> " "
<IDENTIFIER> "func"
"(" "("
"int" "int"
<SPACES> " "
<IDENTIFIER> "m"
"," ","
<SPACES> " "
"int" "int"
<SPACES> " "
<IDENTIFIER> "n"
")" ")"
"{" "{"
<SPACES> "\r\n "
"int" "int"
<SPACES> " "
<IDENTIFIER> "local_a"
<SPACES> " "
"=" "="
<SPACES> " "
<INTEGER> "4"
";" ";"
<SPACES> "\r\n "
<IDENTIFIER> "local_a"
<SPACES> " "
"=" "="
<SPACES> " "
<IDENTIFIER> "m"
";" ";"
<SPACES> "\r\n "
<IDENTIFIER> "local_a"
<SPACES> " "
"=" "="
<SPACES> " "
<IDENTIFIER> "n"
";" ";"
<SPACES> "\r\n "
"return" "return"
<SPACES> " "
<IDENTIFIER> "local_a"
";" ";"
<SPACES> "\r\n"
"}" "}"
<SPACES> "\r\n"
"int" "int"
<SPACES> " "
<IDENTIFIER> "main"
"(" "("
"int" "int"
<SPACES> " "
<IDENTIFIER> "argc"
"," ","
<SPACES> " "
"char" "char"
"*" "*"
"*" "*"
<SPACES> " "
<IDENTIFIER> "argv"
")" ")"
"{" "{"
<SPACES> "\r\n "
<IDENTIFIER> "func"
"(" "("
<INTEGER> "2"
"," ","
<INTEGER> "3"
")" ")"
";" ";"
<SPACES> "\r\n "
"return" "return"
<SPACES> " "
<INTEGER> "0"
";" ";"
<SPACES> "\r\n"
"}" "}"
<SPACES> "\r\n"
<EOF> ""
2.抽象语法树
<<AST>> (helloworld.cb:1)
variables:
<<DefinedVariable>> (helloworld.cb:1)
name: "global_a"
isPrivate: false
typeNode: int
initializer:
<<IntegerLiteralNode>> (helloworld.cb:1)
typeNode: int
value: 5
<<DefinedVariable>> (helloworld.cb:2)
name: "global_b"
isPrivate: false
typeNode: long
initializer: null
<<DefinedVariable>> (helloworld.cb:3)
name: "global_c"
isPrivate: false
typeNode: char*
initializer:
<<StringLiteralNode>> (helloworld.cb:3)
value: "HelloWorld!"
<<DefinedVariable>> (helloworld.cb:4)
name: "global_array"
isPrivate: false
typeNode: int[5]
initializer: null
<<DefinedVariable>> (helloworld.cb:5)
name: "global_struct"
isPrivate: false
typeNode: struct point
initializer: null
functions:
<<DefinedFunction>> (helloworld.cb:10)
name: "func"
isPrivate: false
params:
parameters:
<<Parameter>> (helloworld.cb:10)
name: "m"
typeNode: int
<<Parameter>> (helloworld.cb:10)
name: "n"
typeNode: int
body:
<<BlockNode>> (helloworld.cb:10)
variables:
<<DefinedVariable>> (helloworld.cb:11)
name: "local_a"
isPrivate: false
typeNode: int
initializer:
<<IntegerLiteralNode>> (helloworld.cb:11)
typeNode: int
value: 4
stmts:
<<ExprStmtNode>> (helloworld.cb:12)
expr:
<<AssignNode>> (helloworld.cb:12)
lhs:
<<VariableNode>> (helloworld.cb:12)
name: "local_a"
rhs:
<<VariableNode>> (helloworld.cb:12)
name: "m"
<<ExprStmtNode>> (helloworld.cb:13)
expr:
<<AssignNode>> (helloworld.cb:13)
lhs:
<<VariableNode>> (helloworld.cb:13)
name: "local_a"
rhs:
<<VariableNode>> (helloworld.cb:13)
name: "n"
<<ReturnNode>> (helloworld.cb:14)
expr:
<<VariableNode>> (helloworld.cb:14)
name: "local_a"
<<DefinedFunction>> (helloworld.cb:16)
name: "main"
isPrivate: false
params:
parameters:
<<Parameter>> (helloworld.cb:16)
name: "argc"
typeNode: int
<<Parameter>> (helloworld.cb:16)
name: "argv"
typeNode: char**
body:
<<BlockNode>> (helloworld.cb:16)
variables:
stmts:
<<ExprStmtNode>> (helloworld.cb:17)
expr:
<<FuncallNode>> (helloworld.cb:17)
expr:
<<VariableNode>> (helloworld.cb:17)
name: "func"
args:
<<IntegerLiteralNode>> (helloworld.cb:17)
typeNode: int
value: 2
<<IntegerLiteralNode>> (helloworld.cb:17)
typeNode: int
value: 3
<<ReturnNode>> (helloworld.cb:18)
expr:
<<IntegerLiteralNode>> (helloworld.cb:18)
typeNode: int
value: 0
3.中间代码
<<IR>> (helloworld.cb:1)
variables:
<<DefinedVariable>> (helloworld.cb:1)
name: global_a
isPrivate: false
type: int
initializer:
<<Int>>
type: INT32
value: 5
<<DefinedVariable>> (helloworld.cb:2)
name: global_b
isPrivate: false
type: long
initializer: null
<<DefinedVariable>> (helloworld.cb:3)
name: global_c
isPrivate: false
type: char*
initializer:
<<Str>>
type: INT32
entry: net.loveruby.cflat.entity.ConstantEntry@13fd745
<<DefinedVariable>> (helloworld.cb:4)
name: global_array
isPrivate: false
type: int[5]
initializer: null
<<DefinedVariable>> (helloworld.cb:5)
name: global_struct
isPrivate: false
type: struct point
initializer: null
functions:
<<DefinedFunction>> (helloworld.cb:10)
name: func
isPrivate: false
type: int(int, int)
body:
<<Assign>> (helloworld.cb:11)
lhs:
<<Addr>>
type: INT32
entity: local_a
rhs:
<<Int>>
type: INT32
value: 4
<<Assign>> (helloworld.cb:12)
lhs:
<<Addr>>
type: INT32
entity: local_a
rhs:
<<Var>>
type: INT32
entity: m
<<Assign>> (helloworld.cb:13)
lhs:
<<Addr>>
type: INT32
entity: local_a
rhs:
<<Var>>
type: INT32
entity: n
<<Return>> (helloworld.cb:14)
expr:
<<Var>>
type: INT32
entity: local_a
<<DefinedFunction>> (helloworld.cb:16)
name: main
isPrivate: false
type: int(int, char**)
body:
<<ExprStmt>> (helloworld.cb:17)
expr:
<<Call>>
type: INT32
expr:
<<Addr>>
type: INT32
entity: func
args:
<<Int>>
type: INT32
value: 2
<<Int>>
type: INT32
value: 3
<<Return>> (helloworld.cb:18)
expr:
<<Int>>
type: INT32
value: 0
4.汇编代码
.file "helloworld.cb"
.data
.globl global_a
.align 4
.type global_a,@object
.size global_a,4
global_a:
.long 5
.globl global_c
.align 4
.type global_c,@object
.size global_c,4
global_c:
.long .LC0
.section .rodata
.LC0:
.string "HelloWorld!"
.text
.globl func
.type func,@function
func:
pushl %ebp
movl %esp, %ebp
subl $4, %esp
movl $4, %eax
movl %eax, -4(%ebp)
movl 8(%ebp), %eax
movl %eax, -4(%ebp)
movl 12(%ebp), %eax
movl %eax, -4(%ebp)
movl -4(%ebp), %eax
jmp .L0
.L0:
movl %ebp, %esp
popl %ebp
ret
.size func,.-func
.globl main
.type main,@function
main:
pushl %ebp
movl %esp, %ebp
movl $3, %eax
pushl %eax
movl $2, %eax
pushl %eax
call func
addl $8, %esp
movl $0, %eax
jmp .L1
.L1:
movl %ebp, %esp
popl %ebp
ret
.size main,.-main
.comm global_b,4,4
.comm global_array,20,4
.comm global_struct,8,8
《深入理解Android虚拟机内存管理》示例程序编译阶段生成的各种语法树完整版的更多相关文章
- 自己写的书《深入理解Android虚拟机内存管理》,不出版只是写着玩
百度网盘地址:https://pan.baidu.com/s/1jI4xZgE 我给起的书名叫做<深入理解Android虚拟机内存管理>.本书分为两个部分,前半部分主要是我对Linux0. ...
- 深入理解Java虚拟机—内存管理机制
前面说过了类的加载机制,里面讲到了类的初始化中时用到了一部分内存管理的知识,这里让我们来看下Java虚拟机是如何管理内存的. 先让我们来看张图 有些文章中对线程隔离区还称之为线程独占区,其实是一个意思 ...
- 理解Android虚拟机体系结构
1 什么是Dalvik虚拟机 Dalvik是Google公司自己设计用于Android平台的Java虚拟机,它是Android平台的重要组成部分,支持dex格式(Dalvik Executable)的 ...
- 理解Android虚拟机体系结构(转)
1 什么是Dalvik虚拟机 Dalvik是Google公司自己设计用于Android平台的Java虚拟机,它是Android平台的重要组成部分,支持dex格式(Dalvik Executable)的 ...
- Android 之 内存管理-查看内存泄露(三)
概述 在android的开发中,要时刻主要内存的分配和垃圾回收,因为系统为每一个dalvik虚拟机分配的内存是有限的,在google的G1中,分配的最大堆大小只有16M,后来的机器一般都为24M,实在 ...
- 深入理解C语言内存管理
之前在学Java的时候对于Java虚拟机中的内存分布有一定的了解,但是最近在看一些C,发现居然自己对于C语言的内存分配了解的太少. 问题不能拖,我这就来学习一下吧,争取一次搞定. 在任何程序设计环境及 ...
- Android Dalvikvm 内存管理理解
网上非常多文件介绍了 jvm 内存管理的理论,但在 Dalvikvm 中,到底是怎样实现的. 这几天猛看了 Dalvikvm 的源码,说一下我的理解: 在大层面上讲跟理论一样,jvm 把内存分成了一些 ...
- 深入理解java虚拟机---java虚拟机内存管理(五)
1.深入理解java虚拟机 总图: 1.线程共享区: 2.线程独占区: 1.程序计数器 理解为当前线程锁执行的字节码的行号指示器,程序计数器没有内存异常错误.
- davlik虚拟机内存管理之一——内存分配
转载自http://www.miui.com/thread-74715-1-1.html dalvik虚拟机是Google在Android平台上的Java虚拟机的实现,内存管理是dalvik虚拟机中的 ...
随机推荐
- 6)STM32使用HAL库实现modbus的简单通讯
1.判断地址.校验 2.读取本机数据并校验打包 3.发送数据包 4.本机数据长度比要读取的长度短怎么办 4.校验错误怎么办
- mysql的一些高级查询
1,查出学生详情表性别为男,并同时年龄大于18的 2,根据上述的结果,查出学生表对应的姓名,年龄,性别,address 3,查出学生的(姓名,年龄,性别,所属学院) 还可以添加注释
- SecureCRT 的使用技巧
SecureCRT 支持 SSH1,SSH2,Telnet,RLogin,Serial,和 TAPI 协议, 一般用来登录Linux服务器进行跨系统操作,也可代替 超级终端,进行串口 调试. 1.串口 ...
- Linux下diff与patch命令的配合使用
在Linux下,diff与patch命令配合使用可以进行简单的代码维护工作. [A] diff diff命令用于比较文件的差异,可以用于制作patch文件.但此命令参数众多.格式多样,所以在此仅介绍较 ...
- MSXML2
The following C/C++ example creates and appends a new text node to the root document element. #impor ...
- hibernate使用c3p0数据源
在配置好hibernate连接数据库环境的前提下,我们进行例如以下操作就能够搭建好hibernate中使用c3p0数据源的环境了. 1). 导入 jar 包: hibernate-release-4. ...
- BPMN使用工具
EA 非常多设计人员都在使用EA.他不仅支持UML,相同也全然支持BPMN2.0.<BPMN规范中的三种视图 >展示的BPMN中三种视图就是使用此工具所绘制. activitidesig ...
- C# textbox中输入时加限制条件 // C#Winform下限制TextBox只能输入数字 // 才疏学浅(TextBox 小数点不能在首位+只能输入数字)
textbox中输入时加限制条件 分类: C# winform2008-08-26 08:30 306人阅读 评论(0) 收藏 举报 textbox正则表达式object 1.用正则表达式! 2.使用 ...
- poj 3662 Telephone Lines(最短路+二分)
Telephone Lines Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6973 Accepted: 2554 D ...
- easyui+struts2:datagrid无法不能得到数据
转自:https://bbs.csdn.net/topics/390980437 easyui+struts2:datagrid无法访问到指定action: userlist.jsp部分代码: XML ...