《1953,旅長把我拐進哈工大》第237章 林言的受難日,都快走馬燈了(2)

作者:不想更新鴨呀·3天前

林言點頭:“嗯,沒錯,我還是更看好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 本身持有引用,會不會導致迴圈引用無法回收?”

最後一個問題,猶如壓垮駱駝的最後一根稻草般,讓林言的神志轟的一下徹底倒塌。

他雙腳一蹬,兩眼一翻,徹底啞火:

畢竟他肚子裡的那點存貨,現在已經被大佬們徹底榨乾哩!

鍾萃豪和董蘊美站在那裡,久久沒聽到林言的話語,還以為林言怎麼回事。

:歉道連連邊言林到來忙連,愣了愣微微是先倆他,樣模的著流水口滴幾有還角至甚,滯呆眼兩,白慘臉小言林著看,看一頭抬雙雙果結

猜你喜歡

同題材或同分類的其他作品。