zoukankan      html  css  js  c++  java
  • 关于Javac编译器的那点事(一)

    Javac是什么?

    它是一种编译器,将Java对人非常友好的语言,编译转化对所有机器都非常友好的语言,即:JVM能够识别的语言,也就是Java字节码。而Java字节码,说白了就是一连串二进制数字。

    Javac中有什么? 

    既然它是编译器, 这时候就要回想一下大学所学《编译原理》;什么词法分析,语法分析,语义分析,目标代码生成,目标代码优化……好吧,我承认这方面,已经被我扔进回收站,等我好好还原一下;

    恢复成功,有图为证:

     

     下面详细讲一下,Javac中词法分析器的内部原理:

    先上图,看一下词法分析器的类结构及功能:(注意:这是简图,与实际还是有些出入的;I代表接口,C代表类)

    词法分析过程在JavaParser的parseCompilationUnit()方法中进行;

    词法分析的结果:就爱那个一个类所有关键词,匹配成Token类任意一项即可;

    注:Token中除了,定义了Java语言的保留关键字外;还定义了一个特殊的词:Token.IDENTIFIER,用于表示用户自定义的名称哦!

    提出问题:

    如何分辨一个个Token?如:为什么就知道package是一个Token.PACKAGE,而不是用户自定义的Token.IDENTIFIER呢?

    如何识别一个Token?如:为什么就知道package是一个Token,为什么不是pac或packa呢?

    解答问题:

    问题一: 因为JavacParser类会根据Java语言的规范控制什么顺序、地方应该出现什么Token; 即:JavacParser已经定义好了Token流的顺序规则;

    问题二:判断一个Token是在Scanner.nextToken()中定义的, 其核心由Keywords类负责将Name对象同Token相对应;

    过程:利用Java的语法规则,将字符集合转化为Name对象 ---> 构建Name.table这个内部类的Name对象数组  ---> 传出Name对象到Keywords的key()中找到对应的Token

     Keyword类先将Token中所有元素转化成Name对象,然后建立Name对象和Token的对应关系,将关系保存在Keyword类的key数组中。当传入一个Name对象时,通过key数组就可以找到Token的类型了;

  • 相关阅读:
    Delphi 调用DLL TStream作为参数
    Delphi 退出时注销子窗口应注意的问题
    Excel文件转换成用友实施工具Excel格式
    Delphi Function 返回值忘记默认赋值的一些问题
    vscode 安装golang插件方法
    git merge
    vant ui 双向输入框禁止手机键盘弹出
    回调地狱
    vue 数组对象循环添加一个属性 在页面上动态渲染时更改属性值
    Windows下安装Redis,并设置开机自动启动
  • 原文地址:https://www.cnblogs.com/zhaojinxin/p/7027959.html
Copyright © 2011-2022 走看看