學一手,知乎大V(輪子哥)當年靠它進微軟亞洲研究院

三升水發表於2021-04-09

前言

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專案中,給大家輸出出來!

相關文章