当前位置: 首页 > news >正文

上线了建站怎么样中国材料价格网

上线了建站怎么样,中国材料价格网,.net 快速网站开发,广州地铁封闭最新消息Java源码的前端编译 欢迎来到我的博客#xff1a;TWind的博客 我的CSDN:#xff1a;Thanwind-CSDN博客 我的掘金#xff1a;Thanwinde 的个人主页 0.前言 当一份Java代码写好时#xff0c;将其进行编译#xff0c;运行#xff0c;并不是简单把这个Java源码从头到尾执行…Java源码的前端编译 欢迎来到我的博客TWind的博客 我的CSDN:Thanwind-CSDN博客 我的掘金Thanwinde 的个人主页 0.前言 当一份Java代码写好时将其进行编译运行并不是简单把这个Java源码从头到尾执行一般来说会经历前端编译和后端编译两个阶段前端编译会把Java源码进行分析拆解填充并进行一些优化来变成字节码 后端编译是发生在JVM已经在解释执行字节码时的JIT会进行一些分析来将热点代码直接替换成大部分情况下效率更高的本地机器码并进行许多优化从而提高效率 除去前后编译还有提前编译后面都会写文章一一介绍 1.前端编译阶段 前端编译是一个Java源码的开始在这里会将其转化为可以执行效率不谈的字节码 Javac Javac是收录于JDK中的Java编译器。该工具可以将后缀名为.java的源文件编译为后缀名为.class的可以运行于JVM的字节码Javac是由Java写的运行javac的实质便是命令行的调用javac hello.java Java对于如何把.java文件转化为.class文件规范得很宽松可能会导致class在一些JDK上能编译一些却不行的情况 具体来说Javac的编译过程可分为四个阶段 初始化插入式注解处理器解析与填充符号表 把源代码转化为标记集合来构造抽象语法树填充符号表 注解处理器处理注解语义分析与生成字节码 标注检查数据流与控制流分析解语法糖字节码生成 下面让我们一个个来看 初始化插入式注解处理器 JDK5之后Java提供了对注解的支持原本的方案是把注解作为运行时才发挥作用的但是到了JDK6引入了插入式注解处理器让注解处理可以发生在编译阶段一般来说运行时的注解只能完成一些反射自动化类的操作但注解处理时可以动态的向其中加入代码譬如lombok之类的动态生成代码使注解能在代码层面影响代码 SPI 许多的框架其实都是依靠于这套机制完成的而这些是基于一种名为 SPI 的技术 和SPI对应的是APIAPIApplication Programming Interface API就是上方实现方已经实现了接口要求调用方去实现它 SPI反过来接口由调用方决定实现方要根据调用方的接口要求去实现这个接口来提供服务 API最典型的实现就是OAuth2服务你需要按照OAuth2提供商的要求去实现登录过程 SPI最典型的也就是JDBC,日志各种数据库的JDBC驱动都是按照统一的接口规范来编写的完全符合调用者制定的规范众多的日志实现类也同理 但这只是SPI的概念和Java中修改源代码的需求好像并无交集 具体来说Java设计了许多接口来供其他包作者去适配 这其中就包括注解的解释接口javax.annotation.processing.AbstractProcessor或是javax.annotation.processing.Processor插入式注解处理器会放在META-INF/services之中 在编译的时候也就是一开始编译Javac会先加载所有实现了这个接口的类也就是所有插入式注解处理器包括你自定义的这实际上破坏了双亲委派模型 因为对于javac对一般的java程序也一样来说这些插入式注解处理的实现SPI都属于“应用程序级”的应该由最低级的应用程序类加载器加载 但实际上他们的接口都位于“高层”其接口是由启动类加载器加载的但是这些高层的接口要去加载自己的实现类就属于高级类加载器加载低级类加载器了 这里java引入了线程上下文类加载器这个加载器可以跨界进行加载这样就能帮助高层的加载器加载底层的类 至于这里为什么强调“线程上下文”我们可以以tomcat举例通常里面有多个线程来处理请求相互应该隔离对于java不同类加载器加载的同一个类视为不同类不相同也不兼容这样就能隔离开不同线程 也不用担心每个线程都要去加载一个SPI只会进行一次类加载剩下的都会从缓存之中直接加载尽管是其他线程 总而言之 通过SPI我们就能解决Javac在准备编译时去加载插入式注解处理器的问题了 解析与填充符号表 词法语法分析 这里会把代码中的字符流转化为标记TokenToken是编译时的最小元素比如int a b 2会拆分成6个Tokenint ab2 接着会把这些Token按照顺序构造成抽象语法树AST其代表了一个程序的语法结构你可以理解为是一个能保存一个程序的所有信息的数据结构 之后Javac就不会再操作字符流了一切都会围绕着语法树来进行 填充符号表 符号表类似于一个哈希表用来标识每一个符号的地址和其信息用人话来说的话就是会标记一些Token记录下这些Token的名字类型作用域等等譬如方法名变量名这类的会用来进行各种检测优化比如语法检查分配地址子类的符号表就像是电话簿一样的角色 注解处理器处理注解 这里相对的简单会调用每一个注解处理器进行处理如果其对语法树进行了更改就会回退到解析与填充符号表 重新处理因为可能改变了语法以及符号表这个操作称之为轮Round可以抽象成下面这个图 当所有注解处理器都处理完成后便会进入下一个阶段 语义分析与生成字节码 这里已经具有了一个完整的语法树和符号表最后一步就是把这些转化成字节码了 标注检查 这里会进行类型赋值是否互相兼容变量使用前是否声明还会进行常量折叠这是前端编译中为数不多的优化int a 1 2这里会把1 2 在语法树上直接变成3 数据及控制流分析 这里会对各种逻辑进行进一步的验证比如对于局部变量用之前有无赋值是否有返回值异常是否会处理这种更复杂的控制 值得注意的是这里的分析是和类加载期间的分析运行时基本相同但存在一些东西只能在编译期或者运行时检测 就比如说局部变量的finalJVM对于字节码的要求是越短越好对于局部变量的final关键字会直接被消除那如何保证其值不会变那就轮到编译器来判断了 为什么不会去掉成员变量的final因为JVM 运行时有可能用到比如常量折叠、只读约束等 解语法糖 语法糖是一些用来帮助程序员进行编程的特殊语法或许其不严谨或不规范但是其能大幅度提升程序员的幸福度 包括泛型是的Java匪夷所思没有真正的实现泛型详见类型擦除自动拆装箱自动变长参数等这些语法会在这个阶段被替换成最基础的语法 字节码生成 这里是最后一个阶段把语法树符号表转化成字节码 字节码的格式极其严格这里会把其严格的转化成字节码并向其中添加一些其他的代码比如类构造器,实例构造器 变量初始化调用父类构造等等 并还会添加一些优化,比如把字符串的替换成StringBuffer的append之类的 到此编译结束 现在已经生成了一份详尽且严谨的字节码接下来一步就是开始解释执行并开始最大的舞台后端编译及优化
http://www.zqtcl.cn/news/356281/

相关文章:

  • 网站 数据库 模板网站系统建设合作合同范本
  • 网站空间租赁费用企业网站建设需要多少钱知乎
  • 免费建网站哪个模板多浅谈学校网站建设
  • 精致的个人网站手机网站建设基本流程图
  • 优秀网站网页设计图片主机屋做网站视频
  • 安徽网站建设电话编程一个最简单游戏代码
  • 西宁圆井模板我自己做的网站在线平面设计图
  • 浦口区网站建设技术指导做软件需要网站吗
  • 丹东有做公司网站的吗搜索引擎 wordpress
  • 做网站代理国内课程网站建设现状
  • 中国建设银行手机网站下载从零开始建设企业网站
  • 网站友情链接怎么弄seo平台
  • 建设网站一定要备案吗嘉兴做网站设计
  • 如何制作营销网站模板做外贸需要关注的网站有什么好处
  • 东莞勒流网站制作wordpress 自定义字段 查询
  • 温州网站开发风格做影视剧组演员垂直平台网站
  • c 网站开发培训怎么做网站的站点地图
  • html 网站模板简单网站制作北京海淀
  • 大庆做网站找谁珠海网站搭建
  • 网站建设方面的外文宿迁房产网找房
  • 运营 网站遵义网站开发制作公司
  • 动力论坛源码网站后台地址是什么网站上微信支付功能
  • 网站需求分析模板深圳3d制作
  • 宿迁网站建设推广公司wordpress忘记密码了
  • 成都双语网站开发flat wordpress
  • 大连做公司网站的公司网络营销的网站
  • 做网站 人工智能怎么做商业服务网站
  • 自助建站公司四平市住房和城乡建设部网站
  • 淄博网站seo价格世界新闻最新消息
  • 网站开发 毕业答辩pptwordpress qq邮箱订阅