之後,還是選擇了手寫遞歸下降。」陸懷民笑著說道:「YACC本質上是LALR(1)文法解析器生成器。它的優勢很明顯,快速、自動化,把語法規則寫進去就能自動生成代碼,省時省力。在通用場景下,它確實是個好工具。」
此言一出,大夥兒都有些驚訝地看向陸懷民。
特別是彭遠征和鄭國光,震驚之色更是溢於言表,他們完全沒有聽說過的工具,陸懷民居然了如指掌?
陸懷民繼續解釋道:「不過YACC的局限也很明確。」
他說著,走到實驗室的小黑板前,拿起一支粉筆。
「一是生成的代碼可讀性差,調試困難。自動生成的解析器,狀態機展開之後動輒幾千行,出了問題很難找到根源。二是靈活性不足,YACC適合處理標準的上下文無關文法,但對於我們這種工程應用,有很多非標準的需求。」
他在黑板上畫了一個簡單的框圖,一邊畫一邊說。
「就拿我們的後處理編譯器來說。數控工具機的G代碼,看起來像標準指令,實際上每家廠商都有自己的一套方言。西門子的SINUMERIK係列用一種格式,法那科的用另一種格式————有些指令甚至不是嚴格意義上的程式語言。」
「如果用YACC,每適配一套數控係統的G代碼方言,就要重新寫一套文法規則,重新生成一遍代碼。而且一旦遇到那些非標準的指令,YACC的LALR框架就力不從心了。」
「你說得沒錯。」陳傑森忽然由衷地笑了:「YACC確實有這些局限。我們用YACC,很多時候也要花額外的時間來繞過它的框架限製。但很少有人能在項目初期就想得這麼清楚,多數人都是用上了才發現不對,然後再回頭打補丁,最後代碼堆得就很亂。」
他看著陸懷民,心中也不由得感嘆,對方確實不是浪的虛名之輩。
「陸先生,」陳傑森繼續感興趣地問道,「你們這個後處理編譯器,目標是要適配多少種數控係統?」
「目前國內常見的,大概有七八種。西門子的SINUMERIK係列、法那科的FANUC係列、東德和蘇聯的幾套老係統,再加上國內幾家工具機廠自己搞的簡易數控。每一種的G代碼方言都不一樣,有的甚至連語法結構都完全不同。」
他頓了頓,走到彭遠征的終端前,指著屏幕上那幾行代碼說:「但我們不打算為每一種方言單獨寫一套編譯器。那樣做,十種方言就要維護十套代碼,任何一個底層算法改了,十套代碼全得跟著動。這樣的工程對任何開發者來說都是是噩夢。」
陳傑森微微皺起眉頭:「那你們打算怎麼做?」
看本書最新章節,請到oop.tw
「分層編譯。」陸懷民拿起粉筆,在黑板上又畫了兩層框圖:「前端統一解析,生成一種中間表示;後端根據目標工具機的G代碼方言,把中間表示展開成具體的指令。前端不變,後端可插拔。加一種新方言,隻需要寫一個新的後端適配器。」
這個思路說出來,陳傑森下意識地點了點頭。
分層編譯這個概念,在國外學術界也是七十年代中後期才逐漸成熟起來的。
UNIX係統裡的可移植C編譯器(PCC)是最早實踐這一思路的項目之一,但在嵌入式編譯器、尤其是工業控製領域,分層編譯的應用還遠未普及。
而眼前這個陸懷民,不僅把這個思路想透了,而且已經開始在工程實踐中落地了。
他在思維上確實遠遠超過了常人,甚至遠遠超過了他在BJ見到的「銀河」的另一個開發者趙遠航。
難怪他能提出「開源社區」的框架並將之付諸實踐。
「中間表示層————」陳傑森繼續追問:「你們準備怎麼定義?是用三地址碼,還是用抽象語法樹?」
「抽象語法樹。」陸懷民又在黑板上畫了一個樹狀結構:「三地址碼適合通用計算,但對於數控加工這種場景,很多語義信息是嵌套的。比如一個循環指令————」
陸懷民舉了一個具體的例子,順手在黑板上寫了幾行偽代碼,解釋循環體內刀位軌跡如何打包成子樹,又如何在後端展開。
彭遠征在旁邊聽著,不由得張了張嘴。
那天麵試的時候,陸懷民跟他提過「分層編譯」和「中間表示」,但當時隻是引了個話頭,沒來得及展開。
。多的像想他比遠,貨的裡子肚民懷陸,到識意正真才他,來出講地整完路思套整一這把民懷陸聽在現
。笑可些有少多,來想刻此,法想的」人何任輸不域領譯編「為以自天那己自而
。頭點連連是也得聽森傑陳
。生學的明聰過見沒是不他
。個幾好過見也他,才天的文論會頂發歲十二、程課心核機算計有所完修歲九十,裡生科本的TIM
。個一的色出為尤也殊特為尤中才天的過見是民懷陸但
。活乾人幫一著帶己自,架框建搭己自,題問義定己自,上地土的蕪荒乎近片一在是他
。的敲推起得經是也,裡室驗實的TIM在放,斷判的出做他且而
。人常了越超遠遠他,麵方這在,度程先領的維思他是還,的怖恐最民懷陸,中斷判的森傑陳在,流交的單簡剛剛過經過不
」。了白明算我,案方術技的們你了聽,室驗實的們你了看天今。的統係」河銀出做下件條的苦艱樣這在麼怎是們你,想在直一我。問疑個一有實確我,前之國中來在,嗎道知你「:道慨感森傑陳」,生先陸「
」。多得明高要搬照目盲比這。路的己自合適更條一擇選在是也時同但。趕追在是們你,生先陸「:了笑然忽,頓了頓他
TIM。法辦笨些這了出逼,角牆了到逼題問際實被是隻們我。了譽過士博陳「
」。沿前的習學們我得值正真是才,累積的域領MAC/DAC在
,民懷陸向看又,錶手眼一了看,的似麼什了起想像然忽,頭搖搖森傑陳」。法辦笨是不可這,不「