前言

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. 5G & 音频,视频

    5G & 音频,视频 直播,webtrtc 音频,视频 基础知识 基本概念.播放流程.封装格式.编解码.传输协议 音视频播放流程 主要流程:采集 -> 前处理 -> 编码 -> ...

  2. Flutter 模拟youtube快进icon

    import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyApp extends State ...

  3. Flutter 可选择的Text

    Column( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, ...

  4. 聚焦 2021 NGK 新加坡区块链技术峰会,探讨DeFi未来新生态!

    2021年1月31日14时,备受行业关注的"2021 NGK 新加坡区块链技术峰会"如期举行.本次峰会由NGK官方主办,以"DeFi"为主题,探讨了区块链技术革 ...

  5. 写了一个vue+antdv的后台管理模板

    1,项目简介 写在前面===>这是一个vue+antdv的后台管理模板 项目地址: https://github.com/BaiFangZi/vue-antd-manage 1.1,概述 ​ 最 ...

  6. MySQL:单表查询

    在线数据库:http://sqlfiddle.com/ 建表脚本:https://gitee.com/bqzzz/sql/tree/master/Scripts 基本查询 ①.查询所有记录 SELEC ...

  7. CCF(除法):线段树区间修改(50分)+线段树点修改(100分)+线段树(100分)

    除法 201709-5 这道题有很多种方法来做,最常用的就是线段树和树状数组. 如果使用线段树来做,就会想到区间修改的update函数.但是这里可能会涉及到v是1或者a[j]是0的情况,所以用这种方法 ...

  8. 模式识别Pattern Recognition

    双目摄像头,单目摄像头缺少深度 Train->test->train->test->predicive

  9. Java 集合框架 01

    集合框架· ArrayList 和 Vector 对象数组的概述和使用 * A:案例演示 * 需求:我有5个学生,请把这5个学生的信息存储到数组中,并遍历数组,获取到每个学生的信息 Student[] ...

  10. ThinVnc-身份验证绕过(CVE-2019-17662)

    ThinVnc-身份验证绕过(CVE-2019-17662) 简介 ThinVNC是一款以网页浏览器为基础设计的远端桌面连接工具,不局限用户端使用那种作业平台,都可以通过采用HTML5为标准的浏览器来 ...