第237章 林言的受难日,都快走马灯了(2/2)
请关闭浏览器的阅读/畅读/小说模式并且关闭广告屏蔽过滤功能,避免出现内容无法显示或者段落错乱。
林言点头:“嗯,没错,我还是更看好ALGOL 60,毕竟它的优势实在太明显,文法严格定义不说,语法分析、语义分析、代码生成各层解耦,条理那叫一个清晰分明。”
会议室里安静了几秒,随即钟萃豪和董蕴美相视一笑,眼中满是棋逢对手的兴奋和火热。
随即不由分说地拉着林言来到桌前,各种画着草图开始推演:
“行,就按你说的路子走,先把这个框架搭建好,硬件短板靠你来补,而我们则把语言往ALGOL 60靠拢,为将来铺好道路!”
不过接下来的推演环节,就成了林言的受难日。
因为钟萃豪和温蕴美在见猎心喜后,完全是逮着林言肚里的那些知识往死里压榨,把林言霍霍的那叫一个欲仙欲死:
“小林,嵌套作用域我们懂了,那过程调用呢?支持递归吗?”
“支......应该支持吧?”
林言咽了口唾沫,硬着头皮回答:“ALGOL 60 允许过程递归调用自已。这就意味着活动记录必须在运行时动态分配在栈上,不能像 FORTRAN 那样全部静态分配。每次调用过程时,在栈上压入一个新的活动记录,包含局部变量、形参、返回地址、动态链和静态链。动态链指向调用者的活动记录,静态链指向定义该过程的外层块的活动记录,这样才能正确访问非局部变量。”
钟萃豪眼睛越来越亮:“静态链和动态链分开......那参数传递呢?还是值传递?”
林言的脑袋已经开始在冒汗了:“ALGOL 60 有两种传递方式,值传递和名传递。值传递就是先把实参求值再传入,这个好理解。但名传递不一样,实参表达式不求值,而是包装成一个 thunk,每次在过程体内用到形参时,都调用 thunk 重新求值。thunk 还要保存求值时的环境,这就涉及闭包的概念。”
“小林啊,你这个思路真是太有意思了,真是让我们豁然开朗啊!”
钟萃豪兴奋得眼里都冒光,丝毫不顾及林言越来越白的脸色,兴高采烈地自言自语道:
“那我们顺着你的思路往下推。语法分析方面,ALGOL 60 的文法本身有递归结构,是不是用递归下降比较合适?”
“递……递归下降可以,但要求文法不能有左递归。”
林言感觉此刻自已的大脑都在嗡嗡作响,“ALGOL 60 报告里的表达式文法是右递归的,避免了这个问题。不过如果我们要自已设计语言,就得手动消除左递归,比如把 E→E+T 改写成 E→T{+T}。另外,算符优先分析法也可以考虑,它对表达式的处理很高效,但不能处理所有上下文无关文法。”
董蕴美忽然插了一句:“那名传递的 thunk 怎么保存环境?是保存整个活动记录指针,还是只保存需要的变量?如果保存整个指针,会不会造成悬挂引用?”
而此刻,林言的脑子在经过大佬们屡屡拷打后,即将进入宕机状态,甚至脑海里已经浮现前世的画面,开始各种走马灯:
闭包、悬挂引用、thunk 的生存期……他穿越前学C语言时听说过这些概念,但具体怎么做,脑子里一片模糊。
只能硬撑着胡言乱语:
“具体实现上,thunk 得保存……保存外层作用域的引用,但也不是整个活动记录都存,得看……看哪些变量被用到了。至于悬挂引用,可以通过……通过某种方式避免……”
说着说着,他的声音越来越小,越来越虚弱,好似油尽灯枯般奄奄一息,即将彻底咽气。
而钟萃豪似乎是完全没注意到林言的情况,听到林言这含糊其辞的回答后,不仅没有丝毫的怜悯,甚至还皱起眉头,继续不顾林言死活地刨根问底:
“某种方式?是引用计数,还是标记清除?如果是引用计数,thunk 本身持有引用,会不会导致循环引用无法回收?”
最后一个问题,犹如压垮骆驼的最后一根稻草般,让林言的神志瞬间轰然倒塌。
林言双脚一蹬,两眼一翻,满脸安详地躺在椅子上彻底摆烂:
毕竟他肚子里的那点存货,现在已经被大佬们彻底榨干哩!
钟萃豪和董蕴美站在那里,久久没听到林言的话语,还以为林言怎么回事。
结果双双抬头一看,看着林言小脸惨白,两眼呆滞,甚至嘴角还有几滴口水流着的模样,他俩先是微微愣了愣,连忙来到林言身边连连道歉: