他没想到在国内,连彭远征这样顶尖高校的研究生都完全没有听说过。
这样一来,他很快意识到自己刚才的话有些不妥,正要开口解释,旁边的陆怀民却先接了话。
“陈博士,YACC的原理我们倒是不陌生,不过我们权衡之后,还是选择了手写递归下降。”陆怀民笑着说道:
“YACC本质上是LALR(1)文法解析器生成器。它的优势很明显,快速、自动化,把语法规则写进去就能自动生成代码,省时省力。在通用场景下,它确实是个好工具。”
此言一出,大伙儿都有些惊讶地看向陆怀民。
特别是彭远征和郑国光,震惊之色更是溢于言表,他们完全没有听说过的工具,陆怀民居然了如指掌?
陆怀民继续解释道:“不过YACC的局限也很明确。”
他说着,走到实验室的小黑板前,拿起一支粉笔。
“一是生成的代码可读性差,调试困难。自动生成的解析器,状态机展开之后动辄几千行,出了问题很难找到根源。二是灵活性不足,YACC适合处理标准的上下文无关文法,但对于我们这种工程应用,有很多非标准的需求。”
他在黑板上画了一个简单的框图,一边画一边说。
“就拿我们的后处理编译器来说。数控机床的G代码,看起来像标准指令,实际上每家厂商都有自己的一套方言。西门子的SINUMERIK系列用一种格式,法那科的用另一种格式……有些指令甚至不是严格意义上的编程语言。”
“如果用YACC,每适配一套数控系统的G代码方言,就要重新写一套文法规则,重新生成一遍代码。而且一旦遇到那些非标准的指令,YACC的LALR框架就力不从心了。”
“你说得没错。”陈杰森忽然由衷地笑了:
“YACC确实有这些局限。我们用YACC,很多时候也要花额外的时间来绕过它的框架限制。但很少有人能在项目初期就想得这么清楚,多数人都是用上了才发现不对,然后再回头打补丁,最后代码堆得就很乱。”
他看着陆怀民,心中也不由得感叹,对方确实不是浪的虚名之辈。
“陆先生,”陈杰森继续感兴趣地问道,“你们这个后处理编译器,目标是要适配多少种数控系统?”
“目前国内常见的,大概有七八种。西门子的SINUMERIK系列、法那科的FANUC系列、东德和苏联的几套老系统,再加上国内几家机床厂自己搞的简易数控。每一种的G代码方言都不一样,有的甚至连语法结构都完全不同。”
他顿了顿,走到彭远征的终端前,指着屏幕上那几行代码说:
“但我们不打算为每一种方言单独写一套编译器。那样做,十种方言就要维护十套代码,任何一个底层算法改了,十套代码全得跟着动。这样的工程对任何开发者来说都是是噩梦。”
陈杰森微微皱起眉头:“那你们打算怎么做?”
“分层编译。”陆怀民拿起粉笔,在黑板上又画了两层框图:
“前端统一解析,生成一种中间表示;后端根据目标机床的G代码方言,把中间表示展开成具体的指令。前端不变,后端可插拔。加一种新方言,只需要写一个新的后端适配器。”
这个思路说出来,陈杰森下意识地点了点头。
分层编译这个概念,在国外学术界也是七十年代中后期才逐渐成熟起来的。
UNIX系统里的可移植C编译器(PCC)是最早实践这一思路的项目之一,但在嵌入式编译器、尤其是工业控制领域,分层编译的应用还远未普及。
而眼前这个陆怀民,不仅把这个思路想透了,而且已经开始在工程实践中落地了。
他在思维上确实远远超过了常人,甚至远远超过了他在北京见到的“银河”的另一个开发者赵远航。
难怪他能提出“开源社区”的框架并将之付诸实践。
“中间表示层……”陈杰森继续追问:
“你们准备怎么定义?是用三地址码,还是用抽象语法树?”
“抽象语法树。”陆怀民又在黑板上画了一个树状结构:
“三地址码适合通用计算,但对于数控加工这种场景,很多语义信息是嵌套的。比如一个循环指令……”
陆怀民举了一个具体的例子,顺手在黑板上写了几行伪代码,解释循环体内刀位轨迹如何打包成子树,又如何在后端展开。
彭远征在旁边听着,不由得张了张嘴。
那天面试的时候,陆怀民跟他提过“分层编译”和“中间表示”,但当时只是引了个话头,没来得及展开。
现在听陆怀民把这一整套思路完整地讲出来,他才真正意识到,陆怀民肚子里的货,远比他想象的多。
而自己那天自以为“编译领域不输任何人”的想法,此刻想来,多少有些可笑。
陈杰森听得也是连连点头。
他不是没见过聪明的学生。
MIT的本科生里,十九岁修完所有计算机核心课程、二十岁发顶会论文的天才,他也见过好几个。
但陆怀民是见过的天才中尤为特殊也尤为出色的一个。
他是在一片近乎荒芜的土地上,自己定义问题,自己搭建框架,自己带着一帮人干活。
而且他做出的判断,放在MIT的实验室里,也是经得起推敲的。
不过经过刚刚简单的交流,在陈杰森的判断中,陆怀民最恐怖的,还是他思维的领先程度,在这方面,他远远超越了常人。
“陆先生,”陈杰森感慨道:
“你知道吗,在来中国之前,我确实有一个疑问。我一直在想,你们是怎么在这样艰苦的条件下做出‘银河’系统的。今天看了你们的实验室,听了你们的技术方案,我算明白了。”
他顿了顿,忽然笑了:
“陆先生,你们是在追赶。但同时也是在选择一条更适合自己的路。这比盲目照搬要高明得多。”
“陈博士过誉了。我们只是被实际问题逼到了墙角,逼出了这些笨办法。MIT在CAD/CAM领域的积累,才是真正值得我们学习的前沿。”
“不,这可不是笨办法。”陈杰森摇摇头,忽然像想起了什么似的,看了一眼手表,又看向陆怀民,“陆先生,其实我这次来,除了参观交流之外,还有一些想法想和你单独聊聊。”
“关于开源社区的运作机制,关于你们那套技术标准委员会的治理架构,马丁教授和我讨论过很多次。”
“教授说,你们在开源模式和工程实践上的探索,给了他很大的启发。他也一直在思考,MIT在这些领域积累的东西,能不能用一种更有意义的方式发挥作用。他希望,我这次来,能代表他和你们取得联系并建立一些合作。”
他顿了顿:
“具体的事情有些复杂,一两句话说不清楚。如果方便的话,下午或者晚上,我们找个安静的地方单独聊聊。我相信,这个合作一旦达成,对你们接下来的研究一定会有实实在在的帮助。”
陆怀民微微一怔,随即点了点头:“当然。我也很期待和陈博士深入交流。”
钱振华在旁边一直没怎么说话,此时见时机正好,连忙笑着接口:
“那就这么安排。下午我们在系里腾一间小会议室,你们二位好好聊聊。”