所谓磨刀不误砍柴功,今天来梳理一下方舟编译器的前端部分。
前文中说过,编译器的前端中要有词法句法扫描器、解析器,这里还要加上语义规则器。大概的流程是这样的,程序的代码进入Scanner,分析出有意义、可修改的部分,进入到Parser中,和SemanticElaboration配合,解析出语义来,变成中端可以识别的形式,再传入中端里去。
让我很感兴趣的是,这个过程具体是怎样的呢?如何用机器辨别代码单元,如何分类,如何准确得知对应功能呢?
这个时候我想起来一种方法,大数据。通过分析大量代码来深度学习,迭代次数多了,自然就能辨别代码的词汇和句意了。当然这只是我的一个猜想。实现起来或许比整个方舟编译器还要困难。
在知乎用户小菜叔叔那里我得到了一部分算法原理。
首先是明确一类字符的格式。满足这个格式的字符串,一般就拥有同一类含义。
词法分析后,代码就变成了一串一串独立的字符串,然后送入语法分析器。按照既定的规则,把这些字符串排列起来,形成另一套完整规范的代码句子。而这样的一套套句子,正是中端可以识别分析的。
而如何解析,拆分,重构这些源代码,正是前端的核心算法。这一套算法将是我们下一步要去尝试分析的目标。
Mpl2mpl包内正是前端负责这一部分的算法所在的包。
⭐class_hierarchy
⭐class_init
⭐gen_check_cast
这三个文件的作用是辨别输入的程序代码中的父类、子类以及接口实现,然后收集这些接口定义的方法。检查本地的静态方法,然后扫描对比本地的方法和分辨出的代码,看程序中筛选出的方法对象是否可以替换。
然后是java_eh_lower和java_intrn_lowering。Lower这个单词很好理解:降级。
⭐java_eh_lower
⭐java_intrn_lowering
前者是用来识别输入的java代码其中的异常处理部分代码的,拿出来对比后将其替换为mpl可以识别的代码。后者则是识别更具有一般性的代码的,然后再把函数替换为mpl可以识别的形式。
先到这里。