精华内容
下载资源
问答
  • 之前由于权限问题,分割成两部分上传,老有人只下载了一部分,反映下载了不能打开,现在重新完整传一下。 这就是有"龙书"之称的编译原理方面的书。但不是最新版。
  • 编译原理技术与工具(第二版)

    热门讨论 2009-04-04 19:06:55
    编译原理技术与工具(第二版),作为龙书。每一个学习编译的人必看的书,你也一样~
  • 本书全面、深入地探讨了编译器设计方面的重要主题,包括词法...本书是编译原理课程方面的经典教材,内容丰富,适合作为高等院校计算机及相关专业本科生及研究生的编译原理课程的教材,也是广大技术人员的极佳参考读物。
  • 龙书”。龙书是Alfred V. Aho等人于1986年出版的,由于出版年代较早,其中包含部分过时的技术并且没有反映一些新的编译技术...新编的《编译原理》抛弃诸如算符优先分析等过时技术,增加面向对象编译、类型检查等新技术
  • 编译原理原则技术工具 比较不错的编译方面的资料,其实更建议买实体书
  • 龙书 作者:Alfred V.Aho 中文版很难找
  • 共有5个包,前四个包已经给出,第五个包名称为:“编译原理经典“龙书”第二版 Compilers,Principles,Techniques,&Tools ( 中文名:编译原理技术与工具 ) 中英文双版本”,不是我不想给第5个包改名,是因为CSDN的...
  • 编译原理技术工具_龙书,含有所有的随书资料,最完整的
  • 编译原理中文文档,比较适合刚开始学编译原理的爱好者,或学生
  • 编译原理 实践 技术与工具(第一版)中文Part5 《编译原理 实践 技术与工具》(第一版)中文 作者:Aho 编译技术领域的龙书..
  • 编译原理》课程是计算机科学与技术专业的必修课程。本课程主要介绍程序设计语言编译程序构造的基本原理和设计方法,包括:编译程序概述、高级语言及其语法描述、词法分析、语法分析、属性文法和语法制导翻译、语义...
  • 编译原理pdf

    千次阅读 2018-02-28 09:48:00
    下载地址:网盘下载内容简介······本书全面、深入地探讨了编译器设计方面的重要主题,包括词法分析、语法分析、语法制导定义和语法制导翻译、运行时刻环境、目标代码生成、代码优化技术、并行性检测以及过程间...

    下载地址:网盘下载

     

     

    内容简介  · · · · · ·

    作者简介  · · · · · ·

    Alfred V. Aho是哥伦比亚大学的Lawrence Gussman计算机科学教授。Aho教授多次获奖,其中包括哥伦比亚校友会颁发的2003年度Great Teacher奖和电子与电器工程师协会的Jonh von Neumann奖章。他是美国国家工程院院士,以及ACM和IEEE的会员。

    Monica S. Lam是斯坦福大学的计算机科学教授。她曾经是Tensilica的首席科学家,并且是moka5的创建者和首席执行官。她领导了SUIF项目。该项目开发了最流行的研究性编译器之一,并首创了很多在工业界得到应用的编译技术。

    Ravi Sethi发起了Avaya公司的研究组织,并且是Avaya实验室的主管。之前他曾经是Bell实验室的高级副总裁,并且是Lucent科技的通信软件的首席技术官。他曾经在Pennsylvania州立大学和Arizona大学拥有教职,并在Priceton大学和Rutgers大学任教。他是ACM的会员。

    Jeffery D. Ullman是Gradiance公司的首席执行官和Standford大学的Stanford W. Ascherman计算机科学(名誉退休)教授。他的研究兴趣包括数据库理论、数据库集成、数据挖掘和利用信息基础软件的教育技术。他是美国国家工程院的院士,ACM的会员,并且是Karlstrom奖和Knuth奖的获得者。

    目录  · · · · · ·

    出版者的话
    译者序
    前言
    第1章 引论
    1.1 语言处理器
    1.2 一个编译器的结构
    1.2.1 词法分析
    1.2.2 语法分析
    1.2.3 语义分析
    1.2.4 中间代码生成
    1.2.5 代码优化
    1.2.6 代码生成
    1.2.7 符号表管理
    1.2.8 将多个步骤组合成趟
    1.2.9 编译器构造工具
    1.3 程序设计语言的发展历程
    1.3.1 走向高级程序设计语言
    1.3.2 对编译器的影响
    1.3.3 1.3 节的练习
    1.4 构建一个编译器的相关科学
    1.4.1 编译器设计和实现中的建模
    1.4.2 代码优化的科学
    1.5 编译技术的应用
    1.5.1 高级程序设计语言的实现
    1.5.2 针对计算机体系结构的优化
    1.5.3 新计算机体系结构的设计
    1.5.4 程序翻译
    1.5.5 软件生产率工具
    1.6 程序设计语言基础
    1.6.1 静态和动态的区别
    1.6.2 环境与状态
    1.6.3 静态作用域和块结构
    1.6.4 显式访问控制
    1.6.5 动态作用域
    1.6.6 参数传递机制
    1.6.7 别名
    1.6.8 1.6 节的练习
    1.7 第1章的总结
    1.8 第1章的参考书目
    第2章 一个简单的语法制导翻译器
    2.1 引言
    2.2 语法定义
    2.2.1 文法定义
    2.2.2 推导
    2.2.3 语法分析树
    2.2.4 二义性
    2.2.5 运算符的结合性
    2.2.6 运算符的优先级
    2.2.7 2.2 节的练习
    2.3 语法制导翻译
    2.3.1 后缀表示
    2.3.2 综合属性
    2.3.3 简单语法制导定义
    2.3.4 树的遍历
    2.3.5 翻译方案
    2.3.6 2.3 节的练习
    2.4 语法分析
    2.4.1 自顶向下分析方法
    2.4.2 预测分析法
    2.4.3 何时使用产生式
    2.4.4 设计一个预测语法分析器
    2.4.5 左递归
    2.4.6 2.4 节的练习
    2.5 简单表达式的翻译器
    2.5.1 抽象语法和具体语法
    2.5.2 调整翻译方案
    2.5.3 非终结符号的过程
    2.5.4 翻译器的简化
    2.5.5 完整的程序
    2.6 词法分析
    2.6.1 剔除空白和注释
    2.6.2 预读
    2.6.3 常量
    2.6.4 识别关键字和标识符
    2.6.5 词法分析器
    2.6.6 2.6 节的练习
    2.7 符号表
    2.7.1 为每个作用域设置一个符号表
    2.7.2 符号表的使用
    2.8 中间代码生成
    2.8.1 两种中间表示形式
    2.8.2 语法树的构造
    2.8.4 三地址码
    2.8.5 2.8 节的练习
    2.9 第2章的总结
    第3章 词法分析
    3.1 词法分析器的作用
    3.1.1 词法分析及解析
    3.1.2 词法单元、模式、词素
    3.1.3 词法单元的属性
    3.1.4 词法错误
    3.1.5 3.1 节的练习
    3.2 输入缓冲
    3.2.1 缓冲区对
    3.2.2 哨兵标记
    3.3 词法单元的规约
    3.3.1 串和语言
    3.3.2 语言上的运算
    3.3.3 正则表达式
    3.3.4 正则定义
    3.3.5 正则表达式的扩展
    3.3.6 3.3 节的练习
    3.4 词法单元的识别
    3.4.1 状态转换图
    3.4.2 保留字和标识符的识别
    3.4.3 完成我们的连续性例子
    3.4.4 基于状态转换图的词法分析器的体系结构
    3.4.5 3.4 节的练习
    3.5 词法分析器生成工具Lex
    3.5.1 Lex的使用
    3.5.2 Lex程序的结构
    3.5.3 Lex中的冲突解决
    3.5.4 向前看运算符
    3.5.5 3.5 节练习
    3.6 有穷自动机
    3.6.1 不确定的有穷自动机
    3.6.2 转换表
    3.6.3 NFA接受输入字符串
    3.6.4 确定的有穷自动机
    3.6.5 3.6 节的练习
    3.7 从正则表达式到自动机
    3.7.1 从NFA到DFA的转换
    3.7.2 NFA的模拟
    3.7.3 NFA模拟效率
    3.7.4 从正则表达式构造NFA
    3.7.5 字符串处理算法的效率
    3.7.6 3.7 节的练习
    3.8 词法分析器生成工具的设计
    3.8.1 被生成的词法分析器的结构
    3.8.2 基于NFA的模式匹配
    3.8.3 词法分析器使用的DFA
    3.8.4 实现向前看运算符
    3.8.5 3.8 的练习
    3.9 基于DFA的模式匹配器的优化
    3.9.1 NFA的重要状态
    3.9.2 根据抽象语法树计算得到的函数
    3.9.3 计算nullable、firstpos及lastpos
    3.9.4 计算followpos
    3.9.5 根据正则表达式构建DFA
    3.9.6 最小化一个DFA的状态数
    3.9.7 词法分析器的状态最小化
    3.9.8 在DFA模拟中用时间换取空间
    3.9.9 3.9 节的练习
    3.9.10 第3章的总结
    3.11 第3章参考文献
    第4章 语法分析
    4.1 引论
    4.1.1 语法分析器的角色
    4.1.2 代表性的文法
    4.1.3 语法错误的处理
    4.1.4 错误恢复策略
    4.2 上下文无关文法
    4.2.1 上下文无关文法的正式定义
    4.2.2 符号表示的惯例
    4.2.3 推导
    4.2.4 语法分析树和推导
    4.2.5 二义性
    4.2.6 验证文法生成的语言
    4.2.7 上下文无关文法和正则表达式
    4.2.8 4.2 节的练习
    4.3 设计文法
    4.3.1 词法分析和语法分析
    4.3.2 消除二义性
    4.3.3 左递归的消除
    4.3.4 提取左公因子
    4.3.5 非上下文无关的语言构造
    4.3.6 4.3 节的练习
    4.4 自顶向下的语法分析
    4.4.1 递归下降的语法分析
    4.4.2 FIRST和FOLLOW
    4.4.3 LL(1)文法
    4.4.4 非递归的预测分析
    4.4.5 预测分析中的错误恢复
    4.4.6 4.4 节的练习
    4.5 自底向上的语法分析
    4.5.1 归约
    4.5.2 句柄剪枝
    4.5.3 移入-归约语法分析技术
    4.5.4 移入-归约语法分析中的冲突
    4.5.5 4.5 节的练习
    4.6 LR语法分析技术介绍:简单LR技术
    4.6.1 为什么使用LR语法分析器?
    4.6.2 项和LR(0)自动机
    4.6.3 LR-语法分析算法
    4.6.4 构造SLR-分析表
    4.6.5 可行前缀
    4.6.6 4.6 节的练习
    4.7 更强大的LR语法分析器
    4.7.1 规范LR(1)项
    4.7.2 构造LR(1)项集
    4.7.3 规范LR(1)分析表
    4.7.4 构造LALR语法分析表
    4.7.5 LALR语法分析表的高效构造方法
    4.7.6 LR语法分析表的压缩
    4.7.7 4.7 节的练习
    4.8 使用二义性文法
    4.8.1 用优先级和结合性解决冲突
    4.8.2 “悬空-else”二义性
    4.8.3 LR语法分析中的错误恢复
    4.8.4 4.8 节的练习
    4.9 语法分析器的生成工具
    4.9.1 语法分析器的生成工具Yacc
    4.9.2 使用Yacc处理二义性文法
    4.9.3 用Lex创建Yacc的词法分析器
    4.9.4 Yacc中的错误恢复
    4.9.5 4.9节的练习
    4.10:第4章的小结
    4.11 第4章的参考文献
    第5章 语法制导的翻译
    5.1 语法制导定义
    5.1.1 继承属性和综合属性
    5.1.2 在一棵语法分析树的结点上对一个SDD求值
    5.1.3 5.1 节的练习
    5.2 SDD的求值顺序
    5.2.1 依赖图
    5.2.2 属性求值的顺序
    5.2.3 S-属性定义
    5.2.4 L-属性定义
    5.2.5 具有受控副作用的语义规则
    5.2.6 5.2 节的练习
    5.3 语法制导翻译的应用
    5.3.1 抽象语法树的构造
    5.3.2 类型的结构
    5.3.3 5.3 节的练习
    5.4 语法制导的翻译方案
    5.4.1 后缀翻译方案
    5.4.2 后缀SDT的语法分析栈实现
    5.4.3 产生式内部带有语义动作的SDT
    5.4.4 从SDT中消除左递归
    5.4.5 L-属性定义的SDT
    5.4.6 5.4 节的练习
    5.5 实现L-属性的SDD
    5.5.1 在递归下降语法分析过程中进行翻译
    5.5.2 边扫描边生成代码
    5.5.3 L-属性的SDD和LL语法分析
    5.5.4 L-属性的SDD的自底向上语法分析
    5.5.5 5.5 节的练习
    5.6 第5章的总结
    5.7 第5章的参考文献
    第6章 中间代码生成
    第7章 运行时刻环境
    第7章 总结
    第8章 代码生成
    第9章 机器无关优化
    第10章 指令级并行
    第11章 并行性和局部性的优化
    第12章 过程间分析

     

     

     

    下载地址: 网盘下载

     

    转载于:https://www.cnblogs.com/long12365/p/9730344.html

    展开全文
  • 编译原理与技术第二版,李文生老师主编。资源清晰,完整,可放心下载。
  • 这就是传说中的龙书《Compilers Principles Techniques and Tools》第二版的中文版,pdf格式,不是很清晰,也无目录,将就着看吧,不行就自己添加目录
  • 编译原理实验

    2011-12-27 14:50:38
    编译原理实验.rar Flex自动工具词法分析器设计步骤.pdf Tiny语言词法分析器设计过程.pdf Tiny语言代码生成器设计过程.pdf Tiny语言语法分析器设计过程.pdf Tiny语言语义分析器设计过程.pdf ...编译原理实验指导书.pdf
  • 课 内 实 验 指 导 书 2007 年 6 月 第 1 页第 1 页第 1 页第 1 页 编译原理实验指导书 目 录 实验一 用 FLEX 自动生成Tiny 词法分析器1 实验二 利用 BISON 生成逆一个简单的计算器4 附录一 词法分析器生成工具 ...
  • (a) 学习文档“LEX的用法.pdf”。 (b) 准备一个LEX工具,如这里提供的“FLEX251.ZIP”,可上网搜索下载更新的版本。 (c) 以文档中提供的4个输入文件为例,测试LEX工具。有些版本的FLEX需要在辅助程...

    一、词法分析程序自动生成工具的使用(4小时)

     

    实验目的

    学习使用词法分析自动工具LEX。

    实验任务

    使用LEX工具实现编译器的词法分析程序。

    实验内容

    (a) 学习文档“LEX的用法.pdf”。

    (b) 准备一个LEX工具,如这里提供的“FLEX251.ZIP”,可上网搜索下载更新的版本。

    (c) 以文档中提供的4个输入文件为例,测试LEX工具。有些版本的FLEX需要在辅助程序部分增加yywrap()函数:
    int yywrap() {return 1;}

    1. 生成LEX版本的TINY词法分析器,与其它部分组合成一个完整的TINY语言编译器,并完成测试验证。(参见tiny编译器的使用.ppt)
    2. 编写某语言(如:C-语言)的词法描述文件,生成其词法分析器,与其它部分组合成一个完整的TINY语言编译器,并完成测试验证。(提示:可利用增量编程,修改TINY语言的词法描述文件tiny.l,为C-语言编写词法描述文件。)

     

    (二)语法分析程序自动生成工具的使用(4小时)

     

    学习使用语法分析程序自动生成工具YACC;使用YACC工具实现编译器的词法分析程序。

    实验内容

    (a) 学习文档“YACC的用法.pdf”。

    (b) 准备一个YACC工具,如这里提供的“bison.zip”,可上网搜索下载更新的版本。(有源程序可供参考)

    (c) 以文档中提供的输入文件为例,测试YACC工具。需要将两个文件拷贝到特殊目录,详情请阅readme.txt。

    1. 生成YACC版本的TINY语法分析器,与其它部分组合成一个完整的TINY语言编译器,并完成测试验证。(提示:全局头文件GLOBALS.H需要替换为YACC目录下的那个。)

    (3)编写某语言(如:C-语言)的语法描述文件,生成其语法分析器,与其它部分组合成一个完整的TINY语言编译器,并完成测试验证。(提示:可利用增量编程,修改TINY语言的语法描述文件tiny.y,为C-语言编写语法描述文件,全局头文件GLOBALS.H在替换为YACC目录下的那个后需相应修改。)

     

    实验工具及源代码下载

    https://pan.baidu.com/s/14nbZ3Xu5nsaGCRPcycJUHw

    密码:msry

     

    实验原理讲解

     

    1、LEX工具的使用

     

    (1)以文档中提供的4个输入文件为例,测试LEX工具。

    步骤:

    1.将flex.exe复制到tiny.l的目录中

    2.输入命令“FLEX tiny.l”生成lex.yy.c

    3.将main.c lex.yy.c util.c globals.h util.h scan.h放入一个工程中,编译生成.exe文件

     

    FLEX语言的结构如下:

    其中,FLEX文件是使用一种特殊的语言——LEX,编写的,它描述了一种语言的词法结构:其中,第一部分为定义,FLEX工具在处理这一部分的时候,会将definitions部分的所有代码原封不动的插入到lex.yy.c(词法分析代码)中,我们可以在这一部分中写程序需要用到的头文件等内容,通常情况下,这些代码被放在放在“%{”和“%}”之内,直接插入lex.yy.c。

    第二部分是词法规则部分:格式为【模式 { 动作 }】,其中模式为正则表达式,动作是代码片段。当匹配相对应的正则表达式时,这些代码片段就会被执行。

    最后一个部分包括着一些C代码,这些函数被称为辅助函数,它们用于在第2个部分被调用且不在任何地方被定义的辅助程序。如果要将Lex输出作为独立程序来编译,则这一部分还会有一个主程序。LEX对此部份不作任何处理,仅仅将之直接拷贝到输出文件lex.yy.c的尾部。在些部份,可定义对模式进行处理的C语言函数、主函数和yylex要调用的函数yywrap()等。如果用户在其它C模块中提供这些函数,用户代码部份可以省略。

    通过执行以上步骤,可以顺利生成对应词法分析代码lex.yy.c。如图是文件夹内部的情况。如果需要正式编译程序进行完整的词法分析,还需要加上主函数部分。

    (2)使用增量编程,将tiny词法分析器改为C-词法分析器。

     

    这一部分的代码其实在上面的压缩包里面有。。。。

    C-的词法规则结构要比TINY复杂,同时,TINY词法中也含有一些C-没有的关键字,比如repeat这些。由于C-的定义与tiny有所区别,只需要根据C-的规则,对TINY.L进行增删操作即可。

    以下是改进后的C-.L源程序:

    %{
    #include "globals.h"
    #include "util.h"
    #include "scan.h"
    /* lexeme of identifier or reserved word */
    char tokenString[MAXTOKENLEN+1];
    %}
    
    digit       [0-9]
    number      {digit}+
    letter      [a-zA-Z]
    identifier  {letter}+
    newline     \n
    whitespace  [ \t]+
    
    %%
    
    "if"            {return IF;}
    "while"          {return WHILE;}
    "else"          {return ELSE;}
    "return"         {return RETURN;}
    "int"          {return INT;}
    "void"         {return VOID;}
    "="            {return ASSIGN;}
    "=="             {return EQ;}
    "<"             {return LT;}
    "<="             {return LTEQ;}
    ">"             {return RT;}
    ">="             {return RTEQ;}
    "!="             {return UNEQ;}
    "+"             {return PLUS;}
    "-"             {return MINUS;}
    "*"             {return TIMES;}
    ","             {return NOB;}
    "/"             {return OVER;}
    "("             {return LPAREN;}
    ")"             {return RPAREN;}
    ";"             {return SEMI;}
    "["             {return MLPAREN;}
    "]"             {return MRPAREN;}
    "{"             {return LLPAREN;}
    "}"             {return LRPAREN;}
    {number}        {return NUM;}
    {identifier}    {return ID;}
    {newline}       {lineno++;}
    {whitespace}    {/* skip whitespace */}
    "/*"            {     char c;
                          char d='f';
                          do
                          {     c = input();
                                if (c == EOF) break;
                                if (c == '\n') lineno++;
                                if (c == '*'){
                                    c = input();
                                    if (c == '/') d = 'a';
                                }
                          } while (d == 'f');
                    }
    .               {return ERROR;}
    
    %%
    TokenType getToken(void)
    {    static int firstTime = TRUE;
         TokenType currentToken;
         if (firstTime)
         {     firstTime = FALSE;
               lineno++;
               yyin = source;
               yyout = listing;
         }
         currentToken = yylex();
         strncpy(tokenString,yytext,MAXTOKENLEN);
         if (TraceScan) {
            fprintf(listing,"\t%d: ",lineno);
            printToken(currentToken,tokenString);
         }
         return currentToken;
    }
    

    首先是第一部分:宏定义和词法正则表达式描述,这些根据文档中的定义就可以完成,且C-的词法分析器与TINY一样,需要包含globals.h中的宏定义、SCAN.h中的扫描文件方法,这些头文件都需要包含进去。

    第二部分是匹配规则部分:这里将TINY的关键字全部修改为C-语言的关键字,同时结合实验二中所做的词法分析程序,将字符的返回标记全部更改好。通过增量编程的思想,在TINY.L中对相关语句进行修改即可。

    第三部分是用户自定义函数。这一部分与TINY没有差别。

    最后,我们还需要对TINY编译器中的其他组件——utils.c、globals.h等文件进行修改,使其符合C-语言的关键字标准。主要是将utils.c中的printtoken函数,更改为适应C-词法分析的关键字代码即可,做出符合增量编程的一些调整,就可以组合成完整的C-词法分析器。

    最终的C-词法分析器包含以下这些组件:

    2、YACC工具的使用

     

    (1)以文档中提供的输入文件为例,测试YACC工具。

     

    步骤:(与LEX词法分析类似)

    1、将语法分析YACC工具BISON和语法描述文件.Y放入同一个文件夹内。

    2、命令行中输入“bison .y类型的文件名”就可以生成语法分析代码.Y.tab.C。

    3、将生成的语法分析代码与其他部件组合在一起,就可以生成完整的语法分析器。

     

    类似于词法分析文件lex,语法描述语言YACC文件的格式也由三部分组成:定义、规则、函数。

    首先是定义部分:定义部分包括Yacc需要用来建立分析程序的有关记号、数据类型以及文法规则的信息。它还包括了必须在它的开始时直接进入输出文件的任何C代码(主要是其他源代码文件的#include指示)。说明文件的这个部分可以是空的。

    规则部分包括修改的BNF格式中的文法规则以及将在识别出相关的文法规则时被执行的C代码中的动作。文法规则中使用的元符号惯例如下:通常,竖线被用作替换(也可分别写出替换项)。

    最后是用户自定义函数部分,辅助程序部分包括了过程和函数声明,这个部分也可为空。此部分与词法分析中无太大差别。

    (2)编写某语言(如:C-语言)的语法描述文件,生成其语法分析器。

     

    由于C-的语法与TINY十分不同,根据实验指导书上C-的29条语法规则,参照TINY.Y中的格式,进行编写:

    上图展示的是C-语法分析文件的其中一部分,完整代码太长,没办法全部贴出,具体实现部分在文件夹的【Cminus增量语法】文件夹下。

    实现完上面的C-语法描述文件后,我们通过更改一系列TINY语言中使用过的辅助文件如utils.c、globals.h等,让它们适应C-的语法特点(主要是关键字的实现有差别)之后生成一个工程,即可完成C-的语法分析器构造。

    上面这个代码,压缩包里面也有,下载一下吧,emmm。。。

     

    3、生成完整编译器

     

    这是这个实验指导书上规定的最后一步,但是我很不理解,为什么到这里只实现了词法和语法的时候,就要去要求,能生成整个编译器呢??

    明显,是实验的安排出现了问题。

    整体的编译器还需要语义分析、代码生成,甚至如果需要一个能够执行C-代码的虚拟机环境!!这个地方当时助教验收,很多人都是懵的,如果之后这个实验还有这个需求,那我也没有办法,直接用TINY语言的去验收吧。

     

    【下面展示的是有源代码的TINY编译器的生成过程】

     

    展开全文
  • 自己大概整理了一下,希望对大家有用。如果你们有更好的答案希望能共享一下哈
  • 本书深入讨论了编译器设计的重要主题,包括词法分析、语法分析、语法制导分析、类型检查、运行环境、中间代码生成、代码生成、...本书从介绍编译原理性概念开始,然后通过构建一个简单的编译器来逐一解释这些概念。
  • 编译原理哈工大本科课件,涵盖了编译起前端设计的基本内容(语法描述、词法分析和语法分析),压缩包共4个pdf文档。教材为《编译原理技术工具》(龙书)
  • 本书比较全面、系统地介绍了编译程序构造的一般原理和基本实现方法,内容包括词法分析、语法分析、属性文法语法制导翻译、语义分析中间代码产生、符号表运行时存储空间组织、优化目标代码生成、并行编译技术...
  • 现代编译原理-c语言版 又名虎书,这里面有完整c语言版,带有源码,和以及使用的工具和课后练习答案
  • 下载地址:网盘下载 范志东,就职于腾讯数据平台部,负责腾讯大数据平台的产品化,涉及自动化部署、应用...独立开发了基于Intelx86指令集的自定义类c语言的编译系统,包括编译器、汇编器链接器的实现,对计算机程...

    下载地址:网盘下载

    范志东,就职于腾讯数据平台部,负责腾讯大数据平台的产品化,涉及自动化部署、应用调度、交互分析、集群监控、性能调优等,对开源工具Ambari、Hadoop、Spark等有深入的了解。在校期间屡次获得国家奖学金和励志奖学金。独立开发了基于Intelx86指令集的自定义类c语言的编译系统,包括编译器、汇编器与链接器的实现,对计算机程序的加载和运行原理有深刻的认识。深入分析过Linux内核关于CPU功耗方面的代码。爱好广泛,对编程语言、操作系统、编译系统、计算机安全、分布式系统有着浓厚的兴趣。闲暇时会在技术博客上分享自己的学习心得,期望通过互联网把获得知识的快乐心情传递出去。参与了“十一五”校级立项正式出版教材《汁算机操作系统原理》以及全国自学考试教材《计算机应用技术》编写的相关工作。
    张琼声,湖北省松滋县人,中国石油大学(华东)计算机与通信工程学院副教授,硕士生导师。主讲课程:《操作系统》《操作系统课程实习》和《嵌入式操作系统》。主持的《计算机操作系统》课程被评为校级精品课,先后获得中国石油大学优秀教学研究成果一、二、三等奖各一项;曾获评中国石油大学优秀教师、山东省优秀学士论文指导教师;主持或参与科研、教研项目十四项。专业及研究兴趣为系统软件开发技术,包括:操作系统、编译系统、计算机系统安全性。发表科研、教学论文二十余篇。参与翻译《深入理解Linux内核》第3版,编著“十一五”校级立项正式出版教材《计算机操作系统原理》、主编全国自学考试教材《计算机应用技术》。
    下载地址:网盘下载

    转载于:https://www.cnblogs.com/long12365/p/9730090.html

    展开全文
  • 编译原理_第2版_张素琴

    热门讨论 2014-03-16 22:45:41
    编译原理_第2版_张素琴等_清华大学 由张素琴和吕映芝等编著的《编译原理》介绍编译系统的一般构造原 ...本书是高等院校计算机科学与技术专业的本科生教材,也可作为教师 、研究生或软件工程技术人员的参考书。
  • IT业界一向有编译原理“龙虎鲸书”的传说,指的是编译原理最著名最权威的三部教材。此为虎书,龙书是《编译原理技术与工具》,鲸书是《高级编译器设计实现》。 Andrew.W.Appel(阿佩尔)著,现代编译原理
  • Android系统编译原理

    千次阅读 2017-01-20 11:41:31
    Android系统编译原理 [1] 历史  2003年Android公司成立,系统开发  2005年Android被google收购  2007年11月5日,google公司推动成立手机开发联盟(HAL)  2008年9月Android 1.0正式发布,HTC G1使用   ...

    Android系统编译原理

    [1] 历史

        2003年Android公司成立,系统开发
        2005年Android被google收购
        2007年11月5日,google公司推动成立手机开发联盟(HAL)
        2008年9月Android 1.0正式发布,HTC G1使用
        
    [2] 如何研究学习系统?
        1. 了解系统
           (1) 架构
           (2) 内核
           (3) 文件系统
           操作系统 = 内核 + 文件系统(数据和程序分类存储)
           
        2. 使用系统
           运行
           
        3. 研究学习系统原理
           (1) 获取源码
           (2) 编译运行
           (3) 编译原理
           (4) 启动过程
           
           (5) 定制系统
           
    [3] 概述
        理想的手机操作系统 = 应用通用 + 容易开发友好的应用 + 容易开发手机应用
        
        应用层
        ---------------------------------------
        如何让手机应用容易开发?
        如何让友好的应用容易?
        应用框架层
        ---------------------------------------
                                 如何让应用通用?
                                      vm
        系统运行库 和 系统服务
        ---------------------------------------
        如何让硬件更容易使用?
        linux内核
        ---------------------------------------
        hardware


    [4] 应用层
        1. Android 系统中所有应用程序的地位平等, 系统不绑定--开放
        2. 应用层是应用程序开发工程师工作的层次
        
    [5] 应用框架层(Application Framework)
        如何让友好的应用容易?
        1. Activity Manager
           管理Activity之间的切换
           
        2. Window Manager
           管理窗口之间的切换
           
           Activity =  Window + 用户交互代码
           
        3. Content Provider
           程序<--------------Content Provider------------>程序
           例:
           phone                                           联系人
           sms
           
        4. View System
           基本界面组件实现
           
        5. Package Manager
           管理应用程序包
           
        6. Resource Manager
           资源管理, 资源包含: 字符串、图片和布局
           
        7. XMPP(Extensible Messging and Presence Protocol) Service
           可扩展消息与表示协议, 四大即时通讯协议协议,基于xml脚本实现。
           Google的Gtalk基于基于协议协议。
        
        如何让手机应用容易开发?
        1. Notification Manager
           通知管理
           
        2. telephone Manager
           电话管理


        3. Location Manager
           定位管理,可以获得当前的位置信息
           
    注意: 蓝颜色的部分用java语言实现
           
    [6] 虚拟机
        1. Core Libaries
           Java语言核心库
           
        2. Dalvik(冰岛小渔村的名字, 非常小,非美丽)Virtual Machine
           (1) 每个应用程序运行在自己独立的虚拟机上, 每个虚拟机一个进程
           (2) 基于寄存器(指令支持的操作数只能是寄存器和立即数)实现
           (3) 执行.dex文件(针对内存做了优化)
           (4) java类--->.class文件---dx(SDK)---->.dex文件
           (5) 依赖于2.6以上版本的内核, 因为在2.6以上版本的内核中,加入一些虚拟机需要的机制:
               线程和底层的内存管理机制
               
    [7] 系统运行库
        1. libc
           标准C库
           
        2. SSL(Secure Socket Layer 安全套接层)
           在网络传输时, 加入对数据的加密, 有以下三个功能:
           (1) 使用公钥证书对双端进行认证
           (2) 通讯加密
           (3) 数据完整性检查
           
        3. SGL
           2D图形加速引擎
           
        4. Webkit
           web浏览器引擎,支持了Android和一个内嵌web视图
           
        5. FreeType
           位图和适量字体图库(字库)
           
        6. OpenGL | ES
           3D图形加速引擎
           
        7. SQLite
           开源小型关系型数据库
           
        8. Media Framework
           基于PacketVideo Open Core实现, 支持很多的多媒体格式,音频(mp3, AAC和AMR)、视频(mpeg4、H.264 ...)
           支持图片文件(jpg、png...)
           
        9. Surface Manager
           对显示子系统进行管理,用于应用程序的2D和3D图形融合
           
       注意: 绿颜色部分用C/C++实现
          
    [8] kernel
        Binder 用于android系统中进程间通信
       
    [9] 文件系统
        1. /d
           链接到/sys/kernel/debug
           
        2. /data
           用户数据
        
        3. /dev
           设备文件
           
        4. /etc
           链接到/system/etc
           
        5. /mnt
           外部文件系统的挂载点, 如: SDcard
           
        6. /proc 和 /sys
           挂载procfs和sysfs虚拟文件系统
           
        7. /root
           root用户的home目录
           
        8. /sbin
           基本调试工具和启动程序
           
        9. /sdcard
           链接到/mnt/sdcard目录
           
        10. /system
           * /system/app            apk应用程序
           * /system/preinstall
             /system/pri-app
           
           
           * /system/bin            linux应用程序(常用工具)
           * /system/etc            启动脚本和配置文件
           * /system/fonts          字库
           * /system/framework      Application Framework编译出来的包
           * /system/lib            linux的动态库
             /system/vendor/lib     厂家动态库
           
           
           /system/media          开机音乐和系统logo
           
           * /system/vendor/modules linux驱动模块
           
           /system/xbin          linux应用程序
           
           /vendor
           链接到/system/vendor
           
    [10] 获取源码及编译环境配置
         1. Android官网
            (1) 下载源码(repo 和 git)
                断电续传的脚本:
                #!/bin/sh
                
                repo sync
                while [ $? -ne 0 ]
                do
                 repo sync
                done
                
            (2) 配置编译环境
                《开源平板编译环境配置.docx》
                
         2. 芯片厂家(芯片代理商/开发板厂家)
         3. SOC开源社区
         
    [10] Android源代码目录
         dalvik             虚拟机相关工具
         *device(vendor)    厂家目录
         ndk                开发本地工具箱代码
         
         *system             系统核心程序和本地服务程序的源码
         system/core        系统核心程序源码
         system/media       多媒体应用程序支持的源代码
         
         *build              编译脚本(Makefile shell(bash))
         
         *development        开发工具和例子程序源码
         *developers         开发工具和例子程序源码
         
         *frameworks         应用框架层源码
         
         *external           第三方的开源库源代码
         *hardware           硬件抽象层代码
         *packages           应用程序及包的源代码
         sdk                应用程序开发工具箱中工具源代码
         
         *out               编译结果
         
    [11] 配置编译
         u-boot & kernel
         ---------------
         $ cd lichee
         $ ./build.sh config    第一次编译
         $ ./build.sh
         
         Android
         ----------------
         $ cd android 4.4
         
         1. source build/envsetup.sh
            (1) 功能
                1. 添加配置编译命令到当前shell进程
                   hmm(help)           打印配置编译命令的帮助信息
                   tapas               配置编译应用程序(full模拟器)
                   例:
                      $ tapas packages/apps/Contacts
                      
                   croot               在任意的android源代码目录下,回到android源代码根目录
                   m/mm/mmm/mma/mmma   编译命令
                   cgrep               从C/C++文件中搜索特征字符串
                   例:
                      $ cgrep RILD
                      
                   jgrep               从java文件中搜索特征字符串
                   resgrep             从资源文件中搜索特征字符串
                   godir               进入具有指定文件的目录
                   例:
                      $ godir rild.c
                      
                   printenv            打印配置结果
                   
                2. 添加"产品型号-编译类型"到选择菜单(shell进程)
                   产品型号
                   full                android模拟器
                   vbox_x86            x86的android虚拟机
                   fspad_723
                   
                   编译类型
                   eng                 工程机(包含开发工具程序)
                   userdebug           用户调试机(包含部分调试程序)
                   user                普通用户机
                   
            (2) 结果
                命令可以直接shell运行:
                $ hmm
            
         2. lunch(配置)
            (1) 功能
                1. 选择产品型号和编译类型
                   "产品型号-编译类型"
                   
                2. 检查产品是否存在, 存在, 获取产品信息, 根据产品信息判断设备是否存在,存在找到设备,获取设备信息(选择跟硬件相关的软件模块)
                3. 检查选择的编译类型(选择软件模块)是否正确
                4. 打印选择产品信息及其设备信息
                
            (2) 结果(lunch的结果)
                PLATFORM_VERSION_CODENAME=REL               代码名称, REL代表发布版本, 除Android系统开发团队外,其他看到的都是REL
                PLATFORM_VERSION=4.4.2                      Android版本号
               *TARGET_PRODUCT=fspad_723                    产品型号
               *TARGET_BUILD_VARIANT=eng                    编译类型
               *TARGET_BUILD_TYPE=release                   编译类型(release 和 debug), 可以在Android.mk中使用
                TARGET_BUILD_APPS=                          指定当前编译的应用模块
                                                            空                    编译整个Android系统
                                                            应用程序(packages)    编译应用程序(full为目标机)
                TARGET_ARCH=arm                             CPU架构
                TARGET_ARCH_VARIANT=armv7-a-neon            指令集版本 neon 浮点协处理器
                TARGET_CPU_VARIANT=cortex-a7                CPU名
                HOST_ARCH=x86                               编译Android系统的主机类型
                HOST_OS=linux                               编译Android系统的操作系统名
                HOST_OS_EXTRA=Linux-3.13.0-24-generic-x86_64-with-Ubuntu-14.04-trusty
                                                            操作系统名全称
                HOST_BUILD_TYPE=release                     SDK工具为release
                BUILD_ID=KVT49L                             Android版本名
                OUT_DIR=out                                 编译结果的输出目录
            
         2' extract-bsp(平板特有的,非标准文件)
            拷贝kernel 和 驱动模块到Android目录下
            
         3. make(编译)
            (1) 功能
                1. 获取产品信息, 根据产品信息,获取设备信息, 根据设备信息选择源代码模块
                2. 根据编译类型,选择产品中需要的所有的软件的源代码
                3. 编译源代码
                
            (2) 扩展
               *make -j2               启动2(x86 CPU是单核)个线程(job)编译系统
                make help              打印帮助信息
               *make clean             清除编译出来的所有文件
               *make snod              重新生成system.img
               *make ramdisk           重新生成ramdisk.img
               *make bootimage         重新生成boot.image
                make recoveryimage     重新生成recovery.img
                
                make 模块名            编译指定模块
                例: $ make rild
                
               *make clean-模块名      清除指定模块
                例: $ make clean-rild
                
                m                      编译整个android系统,等价于make
               *mm                     编译当前目录及其子目录下的所有模块,不编译依赖模块
                例:
                   $ cd hardware/ril/rild
                   $ mm
                   
                *mmm                    编译指定目录及其子目录下的所有模块, 不编译依赖模块
                例:
                   $ mmm hardware/ril/rild
                   
                mma                    编译当前目录及其子目录下的所有模块,编译依赖模块
                mmma                   编译指定目录及其子目录下的所有模块, 编译依赖模块
                
           
         4. pack
            bootloader.fex + boot.img(kernel + ramdisk.img) + system.img + userdata.img + recorvery.img = lichee/tools/pack/sun8iw3p1_android_fspad-723_card0.img

            bootloader.fex = BOOT0 + u-boot.bin + logo


    [1] source build/envsetup.sh
        1. 功能
           (1) 添加配置编译命令到shell进程
           (2) 添加"产品型号-编译类型"菜单到shell进程
           
        2. 原理
           (1) /bin/bash脚本的执行原理
               1. 语句
                  执行
                  if [ $PATH ]; then
                  ...
                  fi
                  
               2. 命令或脚本
                  1. fork进程
                  2. exec(普通程序或脚本, 参数, 环境变量)
                  
                  echo "hello"
                  
               3. 变量赋值
                  添加"变量=值"到当前shell进程的环境变量区
                  VAR="hello"
                  
               4. 函数定义
                  添加函数定义到当前shell进程的环境变量区
                  func()
                  {
                  ...
                  }
                  
                  函数什么执行?
                  func
                  
         3. 总结
            (1) 添加配置编译函数到shell进程
            (2) 添加"产品型号-编译类型"菜单到shell进程的LUNCH_MENU_CHOICES环境变量数组
                $ set | grep LUNCH_MENU_CHOICES
                
    [2] lunch
        1. 功能
           (1) 选择产品型号和编译类型
               "产品型号-编译类型"
               
           (2) 检查产品是否存在, 存在, 获得产品信息, 根据产品信息获得设备信息,
               检查设备是否存在, 存在, 获得设备信息
               
           (3) 检查选择的编译类型是否正确, 正确,利用这个信息,选择软件(跟调试有关的)模块
           (4) 打印产品信息、设备信息和选择结果(当前shell进程的环境变量区)
           注意: 选择结果存放在当前shell进程的环境变量区
           
        2. 原理
           (1) 重要的文件(厂家目录结构图.bmp)
               vendorsetup.sh        添加"产品型号-编译类型"到lunch菜单
               AndroidProducts.mk    产品列表文件
               产品名.mk             产品信息文件
               BoardConfig.mk        设备信息文件
               
           (2) 选择产品型号和编译类型
               通过shell脚本,显示菜单,并且让用选择,选择的结果存放在当前shell进程的环境变量区
               
           (3) 检查产品是否存在, 存在, 获得产品信息, 根据产品信息获得设备信息
               检查设备是否存在, 存在, 获得设备信息
               1. 获取产品列表文件
                  find device -maxdepth 6 -name AndroidProducts.mk     当前版本
                  find vendor -maxdepth 6 -name AndroidProducts.mk     以前版本
                  
                  build/target/product/AndroidProducts.mk              系统自带的默认产品
                  
               2. 获取产品信息文件
                   在产品列表文件中, PRODUCT_MAKEFILES变量中存放了产品信息文件:
                   PRODUCT_MAKEFILES := \                                                                              
                    $(LOCAL_DIR)/fspad_723.mk \
                    ...
                  
               3. 找到选择产品的产品信息文件
                  用TARGET_PRODUCT中存放的产品名(选择的产品的名称)和整个系统中的产品信息文件中的产品名(存放在PRODUCT_NAME变量)
                  逐一对比, 如果找到相等的,找到产品信息文件,如果找不到相等的,则产品不存在
                  
               4. 获取设备名
                  产品信息文件中的PRODUCT_DEVICE变量中,就是存放的设备名
                  
               5. 获取设备信息文件
                  PRODUCT_DEVICE----传值---->TARGET_DEVICE
                  
                  device/*/$(TARGET_DEVICE)/BoardConfig.mk                  现在版本的厂家目录
                  vendor/*/*/$(TARGET_DEVICE)/BoardConfig.mk                以前版本的厂家目录
                  
                  build/target/product/$(TARGET_DEVICE)/BoardConfig.mk
          
          (4) 检查选择的编译类型是否正确, 正确,利用这个信息,选择软件(跟调试有关的)模块
              lunch函数完成
              
          (5) 打印产品信息、设备信息和选择结果(当前shell进程的环境变量区)
              printconfig
              
    [3] make(make.pdf)
        1. 功能
           (1) 根据产品型号, 找到产品信息,获得设备名,根据设备名,找到设备信息
           (2) 根据设备信息,选择硬件相关的软件模块
           (3) 根据编译类型, 选择调试相关的软件模块
           (4) 编译选取的软件模块
           
        2. 原理
           (1) 根据产品型号, 找到产品信息,获得设备名,根据设备名,找到设备信息
               build/core/confg.mk
               
           (2) 根据设备信息,选择硬件相关的软件模块
               根据BoardConfig.mk中的信息,选取软件模块, 如:
               如果选取了wifi,wifi依赖的应用程序、库、驱动模块等都会被编译到系统
               
           (3) 根据编译类型, 选择调试相关的软件模块
               产品有以下三种编译类型:
               eng                工程机版本,开发阶段使用,有大量的调试程序
               userdebug          用户调试机, 测试阶段使用, 有root权限,含调试测试程序
               user               用户机, 最终用户使用
               
               每个模块都存在标签:
               eng                工程机使用的模块
               debug              用于用户调试机的模块
               tests              测试模块
               samples            样例
               optional           自由选择模块
               空                 没有标签
               
               如何根据编译类型选择模块?
               eng                编译标签为eng和debug的模块
                                  产品模块(PRODUCT_PACKAGES)
                                  
               userdebug          编译标签为debug的模块
                                  产品模块(PRODUCT_PACKAGES)
                                  
               user               产品模块(PRODUCT_PACKAGES)
               
           (4) 编译总框架
               build/core/Makefile(主要的编译规则)
               build/core/main.mk(主要的Makefile)
               
               
           (5) $(ONE_SHOT_MAKEFILE)
               编译整个工程, 此变量为空
               编译模块时,ONE_SHOT_MAKEFILE装载编译模块的Makefile文件, 文件名叫Android.mk
               
               1. 如何管理模块?
                  (1) 一个模块一个Makefile文件(名称: Android.mk)
                  (2) 每个模块编译出来一个程序、库、Java
                  
               2. 如何添加一个模块到Android系统?
                  (1) 添加程序或库或包的源代码
                  (2) 添加Android.mk
                  
               3. 如何编写Android.mk?
                  《Android.mk说明》
                  
               
             
    [4] 总结
        1. 如何添加产品?(所有的源代码及配置文件使用fspad_723)
           (1) 添加vendorsetup.sh文件
           (2) 添加AndroidProducts.mk文件
           (3) 添加T3.mk(拷贝参考产品)
               PRODUCT_NAME
               PRODUCT_DEVICE =   
           (4) 添加BoardConfig.mk(拷贝参考产品)
           
        2. 如何添加一个模块?(apk)


    Android.mk说明:

    1. 设置当前模块的编译路径为当前文件夹路径
       LOCAL_PATH := $(call my-dir)


    2. 清理(可能由其他模块设置过的)编译环境中用到的变量
       include $(CLEAR_VARS)


    3. 模块编译变量
       变量                          用途
       LOCAL_SRC_FILES               当前模块包含的所有源代码文件
       LOCAL_MODULE                  当前模块的名称,这个名称应当是唯一的,模块间的依赖关系就是通过这个名称来引用的
       LOCAL_C_INCLUDES              C/C++ 语言需要的头文件的路径
       LOCAL_STATIC_LIBRARIES        当前模块在静态编译时,需要的静态库
       LOCAL_SHARED_LIBRARIES        当前模块在运行时依赖的动态库
       LOCAL_CFLAGS                  C/C++编译器的参数
       
       include $(BUILD_EXECUTABLE)
       gcc $(LOCAL_CFLAGS) $(LOCAL_SRC_FILES) -o $(LOCAL_MODULE) -I$(LOCAL_C_INCLUDES) $(LOCAL_STATIC_LIBRARIES) -l$(LOCAL_SHARED_LIBRARIES) 
       
       LOCAL_JAVA_LIBRARIES          当前模块依赖的Java共享库
       LOCAL_STATIC_JAVA_LIBRARIES   当前模块依赖的Java静态库
       LOCAL_PACKAGE_NAME            当前模块的APK应用的名称
       
       LOCAL_CERTIFICATE             签署当前应用的证书名称
       
       LOCAL_MODULE_TAGS             当前模块所包含的标签,Android.mk的必选,一个模块可以包含多个标签
                                     标签的值可能是debug, eng, tests, samples 或 optional
                                     
       build/core/definitions.mk
       通常会用下面函数获取上面环境变量的值:
       提供配置编译需要的函数
       $(call my-dir)                        获取当前文件夹路径
       $(call all-subdir-java-files)         获取当前目录子目录下所有的java源代码文件
       $(call all-java-files-under, 目录)    获取指定目录下的所有Java文件
       $(call all-c-files-under, 目录)       获取指定目录下的所有C语言文件
       $(call all-Iaidl-files-under, 目录)   获取指定目录下的所有 AIDL 文件
       $(call all-makefiles-under, 目录)     获取指定目录下的所有Make文件
     
    4. 模块类型(make.pdf)
       include $(BUILD_%_%)          %代码表0个或多个字符


       BUILD_EXECUTABLE              编译目标机上的可执行文件(ELF)
       BUILD_STATIC_LIBRARY          编译目标机上的静态库(*.a 编译时使用)
       BUILD_SHARED_LIBRARY          编译目标机上的动态库文件(*.so)
       BUILD_JAVA_LIBRARY            编译目标机上的java动态库
       BUILD_STATIC_JAVA_LIBRARY     编译目标机上的java静态库
       BUILD_PACKAGE                 编译目标机上的java包
       
       寻找Android.mk例子的方法:
       find . -depth -name Android.mk -exec grep BUILD_STATIC_LIBRARY {} \;


    产品信息文件说明:

    在产品配置文件中, 存储产品信息,这些信息存放在变量中:
    变量                           说明
    PRODUCT_COPY_FILES             编译该产品时需要拷贝的文件,以“源路径 : 目标路径”的形式
    PRODUCT_PROPERTY_OVERRIDES     产品属性, 最终放入/system/build.prop
    PRODUCT_PACKAGE_OVERLAYS     不修改packages中apk的情况下,自定义产品中的framework和package中的资源文件
    DEVICE_PACKAGE_OVERLAYS        不修改packages中apk的情况下,自定义设备中的framework和package中的资源文件


    PRODUCT_BRAND                  产品商标
    * PRODUCT_NAME               最终用户将看到的完整产品名,会出现在“关于手机”信息中
    * PRODUCT_DEVICE               产品设备名
    PRODUCT_MODEL                  产品型号,最终用户将看到


    PRODUCT_CHARACTERISTICS        tablet-平板模式 phone-电话模式
    PRODUCT_AAPT_CONFIG            指定支持哪些尺寸,哪些密度(dot per inch)的屏幕           
    PRODUCT_AAPT_PREF_CONFIG       指定屏幕尺寸及密度
                                   android系统根据屏幕尺寸和密度来加载相应图片资源,使得android界面可以适用各种界面
                                   具体见《Android屏幕规范.jpg》


    PRODUCT_LOCALES               产品支持的地区,以空格分格
    *PRODUCT_PACKAGES             产品版本中包含的应用程序, 以空格分格
    PRODUCT_MANUFACTURER           产品厂家
    PRODUCT_OTA_PUBLIC_KEYS        对于该产品的OTA公开key列表
    PRODUCT_POLICY                 产品使用的策略
    PRODUCT_CONTRIBUTORS_FILE      HTML文件, 包含项目的贡献者
    PRODUCT_TAGS                 产品标签,以空格分格


    Android文件系统:



    编译结果:

    out
    ├── host                               SDK 中的各种工具(emulator,adb...)
    │   ├── common                         所有主机都用的通用库(java库)
    │   │   └── obj
    │   │       └── JAVA_LIBRARIES
    │   └── Linux-x86                      用linux-x86主机上工具程序
    └── target                             目标机上运行的各种程序
        ├── common                         所有产品都用的通用程序(java程序或库)
        │   ├── docs                       文档目录
        │   ├── obj                        中间文件
        │   │   ├── APPS                   应用程序的中间文件
        │   │   └── JAVA_LIBRARIES         java库的中间文件
        │   └── R                          资源文件(java代码形式)
        │       ├── android
        │       ├── com
        │       ├── jp
        │       └── org
        └── product                         产品(特定平台)专用程序
            └── fspad-723                   fspad-723型号产品(全志A23平台)程序
                ├── data                    用户数据, 该目录中的内容被挂载到/data目录下
                ├── obj
                ├── recovery                恢复版的根文件系统
                ├── root                    根文件系统,装有最基本的命令, 该目录中的内容被挂载到/目录下
                ├── symbols
                ├── system                  系统文件系统, 该目录中的内容被挂载到/system目录下
                -------------------------------------------------------------
                ├── ramdisk.img             root目录打包
                ├── ramdisk-recovery.img    recovery目录打包
                ├── boot.img                kernel + ramdisk.img
                ├── system.img              system目录打包
                ├── userdata.img            data目录打包
                └── recovery.img            kernel + ramdisk-recovery.img
                
         为什么root目录打包后叫ramdisk.img?
         (1) 什么是ramdisk?
             用内存模拟磁盘存放文件系统, 内存称为ramdisk
             
         (2) 为什么root目录打包后叫ramdisk.img?
             root目录下的内容在运行时存放在内存
             注意: root目录下存放的是根文件系统
         
         为什么kernel + ramdisk.img被打包成boot.img?
         android系统将kernel和根文件系统存放在一个分区,便于android系统启动时,一起拷贝
         到内存,内核启动完成后,直接挂载根文件系统

    转自:Android系统编译原理

    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 15,411
精华内容 6,164
关键字:

编译原理技术与工具pdf