学一手,知乎大V(轮子哥)当年靠它进微软亚洲研究院
前言
vczh本名陈梓瀚,不过大家更愿意叫他「轮子哥」,毕业于华南理工大学软件学院。vczh大学时代就在微软实习,毕业后即加入微软。开始时是在微软上海,后来进入北京的微软亚洲研究院。现已移居美国西雅图,在Office组做工程师。
大家一方面对其高强度关注妹子,更新频繁,“轮带逛”的称号褒贬不一;另一方面大家对其技术也有所疑惑,但是不可否认的是他技术还是比大多数人厉害的!
轮子哥在编译和图形学上面有着深厚的造诣,有兴趣的可以看下: 进入2012 -- 回顾我走过的编程之路。
后来我因为一些原因申请了到微软亚洲研究院(MSRA)的人事调动。2011年1月份我在获得了经理的批准之后,从上海前往北京参加研究院的面试。这一次面试仍然有五轮。这次面试很难,其中一个面试官因为在我的简历上发现了很多跟编译器有关的东西之后,决定让我实现一个strncpy函数,要求是CPU对内存的访问次数要最少。
这包含了很多诸如带宽、对齐和二进制字节位移操作等各种问题。方法本身就已经很繁琐,再加上纸上写代码总是免不了要犯错误,所以我依然没有时间把整个程序写完。另一个面试官老外在年轻的时候也做过一些编译器的事情,让我出乎意料的是他在面试的过程中没有跟我出题目,反而就编译器的各种算法和问题聊了整整一个小时,基本上我会的知识全部都因为要回答问题而说了出来。
编译原理
什么是编译原理
计算机是只认识二进制的,但是我们平常开发中根本不会使用二进制进行开发,我们使用的都是 Java、C 这类的高级语言,每种语言都会经过一系列的转换才能被计算机识别,那么到底是谁做的这项工作呢?一个被称为 编译器(compiler)
的大佬出场了。
语言处理器
在现实生活中,你如何才能和老外对话?你是不是需要学英语?我们有一些同学可能认为英语难学,经常会在英语书上做一些汉语标记方便理解,以至于闹出了啼笑皆非的事情。
那么,谁做了由英语到方便记忆
的英语之间的转换呢?答案是你的大脑。所以,我们可以归纳一下这个过程。
因为我们懂汉语(自己的一套语法规则),我们把英语(需要学习的语言)转换为我们便于理解的汉语(大脑翻译规则),我们才能学会英语和老外对话(转换为目标语言)。
上面举出的这个学英语的例子,其实就是一个由原程序经过某种机制转换,把它变成目标语言的过程。也就是
编译器就是一个翻译官的角色,它负责把源程序的语法翻译成目标程序能够理解的语法。
ANTLR
简介
GitHub: https://github.com/antlr
从头实现一个编译器的难度远远超过了一般开发者的能力。编写编译器所需要的理论基础、技术功底和精力都远非普通软件可比。
幸运的是,ANTLR的出现使这个过程变的易如反掌。ANTLR能够根据用户定义的语法文件自动生成词法分析器和语法分析器,并将输入文本处理为(可视化的)语法分析树。这一切都是自动生成的,所需的仅仅是一份描述该语言的语法文件。
ANTLR改变了这一切。ANTLR自动生成的编译器前端高效、准确,能够将开发者从繁杂的编译理论中解放出来,集中精力处理自己的业务逻辑。ANTLR4引入的自动语法分析树创建和遍历机制,极大地提高了语言识别程序的开发效率。
用途
ANTLR是一款强大的语法分析器生成工具,可用于读取、处理、执行和翻译结构化的文本或二进制文件。它被广泛应用于学术领域和工业生产实践,是众多语言、工具和框架的基石。
Twiter搜索使用ANTLR进行语法分析,每天处理超过20亿次查询;Hadoop生态系统中的Hive、Pig、数据仓库和分析系统所使用的语言都用到了ANTLR; Lex Machina将ANTLR用于分析法律文本;
Oracle公司在SQL开发者IDE和迁移工具中使用了ANTLR; NetBeans公司的IDE使用ANTLR来解析C++; Hibernate对象-关系映射框架(ORM)使用ANTLR来处理HQL语言。
快速开始
UNIX
- 安装 JDK (1.7及以上版本)
- 你可以通过浏览器从ANTLR的网站下载ANTLR,或者使用命令行工具curl:
$ cd /usr/local/lib
$ curl -O https://www.antlr.org/download/antlr-4.9-complete.jar
- 设置好CLASSPATH环境变量,Java就能够找到ANTLR工具和运行库。在UNIX系统上,你可以手动执行以下代码或者将其添加到启动脚步中(对于bash命令行,就是.bash_profile):
export CLASSPATH=".:/usr/local/lib/antlr-4.9-complete.jar:$CLASSPATH"
- 每次手动输入这些java命令是一件令人痛苦的事情,所以最好通过别名(alias)或者shell脚步的方式。
$ alias antlr4='java -Xmx500M -cp "/usr/local/lib/antlr-4.9-complete.jar:$CLASSPATH" org.antlr.v4.Tool'
$ alias grun='java -Xmx500M -cp "/usr/local/lib/antlr-4.9-complete.jar:$CLASSPATH" org.antlr.v4.gui.TestRig'
WINDOW
-
安装 JDK (1.7及以上版本)
-
从 https://www.antlr.org/download/ 网址下载antlr-4.9-complete.jar(或任何版本)保存到第三方Java库的目录,比如C:\Javalib
-
将antlr-4.9-complete.jar添加到CLASSPATH,
使用系统属性对话框 -> 环境变量 -> 创建或添加CLASSPATH变量
或者在命令行中输入:
SET CLASSPATH=.;C:\Javalib\antlr-4.9-complete.jar;%CLASSPATH%
-
使用批处理文件或doskey命令,为ANTLR工具和TestRig创建简短方便的命令:
批处理文件(在系统路径下的目录下)antlr4.bat和grun.bat
java org.antlr.v4.Tool %*
@ECHO OFF
SET TEST_CURRENT_DIR=%CLASSPATH:.;=%
if "%TEST_CURRENT_DIR%" == "%CLASSPATH%" ( SET CLASSPATH=.;%CLASSPATH% )
@ECHO ON
java org.antlr.v4.gui.TestRig %*
或者,使用doskey命令:
doskey antlr4=java org.antlr.v4.Tool $*
doskey grun =java org.antlr.v4.gui.TestRig $*
安装测试
直接启动:
$ java org.antlr.v4.Tool
ANTLR Parser Generator Version 4.9
-o ___ specify output directory where all output is generated
-lib ___ specify location of .tokens files
...
或者在java中使用-jar选项:
$ java -jar /usr/local/lib/antlr-4.9-complete.jar
ANTLR Parser Generator Version 4.9
-o ___ specify output directory where all output is generated
-lib ___ specify location of .tokens files
...
初识ANTLR
在一个临时目录中,将下列语法放在文件Hello.g4中
// 定义一个名为Hello的语法
grammar Hello;
r : 'hello' ID ; // 匹配一个关键字hello和一个紧随其后的标识符
ID : [a-z]+ ; // 匹配小些字母组成的标识符
WS : [ \t\r\n]+ -> skip ; // 忽略空格、Tab、换行以及\r(Windows)
然后运行ANTLR工具:
$ cd /Hello
$ antlr4 Hello.g4
$ javac Hello*.java
现在测试它:
$ grun Hello r -tree
(Now enter something like the string below)
hello parrt
(now,do:)
^D
(The output:)
(r hello parrt)
(That ^D means EOF on unix; it's ^Z in Windows.) The -tree option prints the parse tree in LISP notation.
It's nicer to look at parse trees visually.
$ grun Hello r -gui
hello parrt
^D
这会弹出一个对话框,显示规则r匹配关键字hello和world部分。
好了,这篇文章暂时介绍ANTLR4到此,后续会研究些高级应用并整合到Spring Boot项目中,给大家输出出来!