前言

vczh本名陈梓瀚,不过大家更愿意叫他「轮子哥」,毕业于华南理工大学软件学院。vczh大学时代就在微软实习,毕业后即加入微软。开始时是在微软上海,后来进入北京的微软亚洲研究院。现已移居美国西雅图,在Office组做工程师。

大家一方面对其高强度关注妹子,更新频繁,“轮带逛”的称号褒贬不一;另一方面大家对其技术也有所疑惑,但是不可否认的是他技术还是比大多数人厉害的!

轮子哥在编译图形学上面有着深厚的造诣,有兴趣的可以看下: 进入2012 -- 回顾我走过的编程之路

后来我因为一些原因申请了到微软亚洲研究院(MSRA)的人事调动。2011年1月份我在获得了经理的批准之后,从上海前往北京参加研究院的面试。这一次面试仍然有五轮。这次面试很难,其中一个面试官因为在我的简历上发现了很多跟编译器有关的东西之后,决定让我实现一个strncpy函数,要求是CPU对内存的访问次数要最少。

这包含了很多诸如带宽、对齐和二进制字节位移操作等各种问题。方法本身就已经很繁琐,再加上纸上写代码总是免不了要犯错误,所以我依然没有时间把整个程序写完。另一个面试官老外在年轻的时候也做过一些编译器的事情,让我出乎意料的是他在面试的过程中没有跟我出题目,反而就编译器的各种算法和问题聊了整整一个小时,基本上我会的知识全部都因为要回答问题而说了出来。

编译原理

什么是编译原理

计算机是只认识二进制的,但是我们平常开发中根本不会使用二进制进行开发,我们使用的都是 Java、C 这类的高级语言,每种语言都会经过一系列的转换才能被计算机识别,那么到底是谁做的这项工作呢?一个被称为 编译器(compiler) 的大佬出场了。

语言处理器

在现实生活中,你如何才能和老外对话?你是不是需要学英语?我们有一些同学可能认为英语难学,经常会在英语书上做一些汉语标记方便理解,以至于闹出了啼笑皆非的事情。

那么,谁做了由英语到方便记忆 的英语之间的转换呢?答案是你的大脑。所以,我们可以归纳一下这个过程。

因为我们懂汉语(自己的一套语法规则),我们把英语(需要学习的语言)转换为我们便于理解的汉语(大脑翻译规则),我们才能学会英语和老外对话(转换为目标语言)。

上面举出的这个学英语的例子,其实就是一个由原程序经过某种机制转换,把它变成目标语言的过程。也就是

编译器就是一个翻译官的角色,它负责把源程序的语法翻译成目标程序能够理解的语法。

ANTLR

简介

官网: https://www.antlr.org/

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

  1. 安装 JDK (1.7及以上版本)
  2. 你可以通过浏览器从ANTLR的网站下载ANTLR,或者使用命令行工具curl:
$ cd /usr/local/lib
$ curl -O https://www.antlr.org/download/antlr-4.9-complete.jar
  1. 设置好CLASSPATH环境变量,Java就能够找到ANTLR工具和运行库。在UNIX系统上,你可以手动执行以下代码或者将其添加到启动脚步中(对于bash命令行,就是.bash_profile):
export CLASSPATH=".:/usr/local/lib/antlr-4.9-complete.jar:$CLASSPATH"
  1. 每次手动输入这些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

  1. 安装 JDK (1.7及以上版本)

  2. https://www.antlr.org/download/ 网址下载antlr-4.9-complete.jar(或任何版本)保存到第三方Java库的目录,比如C:\Javalib

  3. antlr-4.9-complete.jar添加到CLASSPATH,

    使用系统属性对话框 -> 环境变量 -> 创建或添加CLASSPATH变量

    或者在命令行中输入:

    SET CLASSPATH=.;C:\Javalib\antlr-4.9-complete.jar;%CLASSPATH%
  4. 使用批处理文件或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项目中,给大家输出出来!

学一手,知乎大V(轮子哥)当年靠它进微软亚洲研究院的更多相关文章

  1. Python数据分析练手:分析知乎大V

    原文链接:https://zhuanlan.zhihu.com/p/92768131?utm_source=tuicool&utm_medium=referral 知乎,可以说是国内目前最大的 ...

  2. 16、爬取知乎大v张佳玮的文章“标题”、“摘要”、“链接”,并存储到本地文件

    爬取知乎大v张佳玮的文章“标题”.“摘要”.“链接”,并存储到本地文件 # 爬取知乎大v张佳玮的文章“标题”.“摘要”.“链接”,并存储到本地文件 # URL https://www.zhihu.co ...

  3. Python数据分析揭秘知乎大V的小秘密

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 清风小筑 PS:如有需要Python学习资料的小伙伴可以加点击下方链 ...

  4. 云栖专辑|阿里开发者们的第二个感悟:PG大V德哥的使命感与开放心态

    摘要: 2018年12月20日,云栖社区3岁.阿里巴巴常说“晴天修屋顶”,所以我们特别制作了这个专辑——分享给开发者们20个阿里故事,50本书籍. 2015年12月20日,云栖社区上线.2018年12 ...

  5. [转帖] select、poll、epoll之间的区别总结[整理] + 知乎大神解答 https://blog.csdn.net/qq546770908/article/details/53082870 不过图都裂了.

    select.poll.epoll之间的区别总结[整理] + 知乎大神解答 2016年11月08日 15:37:15 阅读数:2569 http://www.cnblogs.com/Anker/p/3 ...

  6. 大V云集!参加首届阿里巴巴在线技术峰会的八大理由

    由阿里巴巴集团.阿里巴巴技术协会(ATA)和阿里云云栖社区联合举办的首届阿里巴巴在线技术峰会(Alibaba Online Technology Summit)将于7月19日-21日20:00-21: ...

  7. 成长为 iOS 大 V 的秘密

    成长为 iOS 大 V 的秘密   前言 毫不谦虚地说,我是国内 iOS 开发的大 V.我从 2011 年底开始自学 iOS 开发,经过 3 年时间,到 2014 年底,我不但写作了上百篇 iOS 相 ...

  8. 【新提醒】N820 N821 android 4.2 V1.1版 - 大V综合交流区 - 360官方论坛

    http://bbs.360safe.com/forum.php?mod=viewthread&tid=3088815&extra=page%3D1%26filter%3Dtypeid ...

  9. 你视为意见领袖的大 V,可能只是个僵尸号

    今日导读 “高手在民间”这句话诚不欺我.互联网普及之后,民间大神在各大论坛如雨后春笋般涌现,忽而指点江山,笑谈国际风云,忽而算无遗策,狙击股市庄家,亦或退而求其次,美妆美食美颜,誓要带领少男少女冲在时 ...

随机推荐

  1. Docker & Node.js

    Docker & Node.js https://nodejs.org/en/docs/guides/nodejs-docker-webapp/ https://docs.docker.com ...

  2. taro taro 多端同步调试

    taro 多端同步调试 debug https://nervjs.github.io/taro/docs/envs-debug.html

  3. windows 隐藏desktop.ini文件

    原文 在文件夹选项>查看 勾选"隐藏受保护的操作系统文件(推荐)"选项

  4. Flutter: Draggable和DragTarget 可拖动小部件

    API class _MyHomeState extends State<MyHome> { List<Map<String, String>> _data1 = ...

  5. Union international inc引进微信线下支付,开启消费无现金时代

    长期以来,Union international inc娱乐集团(公司编号:20151533091)因其客户来自全球各国,特别是除了美国之外的中国用户居多,因此公司一直和中国领先的社交软件微信保持着良 ...

  6. uniapp 自定义弹窗组件

    先上效果: 组件源码:slot-modal.vue <template> <view class="modal-container" v-if="sho ...

  7. django学习-14.sys.argv用法和使用场景

    1.前言 sys是python自带的一个内置模块. "sys.argv[0]"的含义:表示代码本身所在的文件路径. sys.argv说白了就是一个从程序外部获取参数的桥梁,这个&q ...

  8. java基础第11期——Stream流、方法引用、junit单元测试

    1.Stream流 Stream流与io流是不同的东西,用于解决集合类库已有的弊端, 1.1 获取Stream流: Collection集合的Stream方法,注意Map集合要经过转化 default ...

  9. Ajax的基本用法

    1.介绍 2.基本用法 2.1原生写法 $.ajax({ url: url, //是否是异步请求,默认是 // async: false, //请求方式,默认是get //type:'get', // ...

  10. ElasticSearch7.9.2设置密码

    1:设置ElasticSearch的密码 1.1:停止运行ElasticSearch,修改配置. vim elasticsearch-7.9.2/config/elasticsearch.yml 新增 ...