即便此刻坐在教室里,李林當然也是不會聽課的。
而是把注意力全都放在了面前的書上。
《C語言程序設計》《征服C指針》《深入理解C指針》……
一本接一本,李林似乎想要從幾張紙里榨出答案。
可越看,他越覺得腦子裡不是被知識填滿,而是愈發混亂。
什麼內存分配、指針運算、堆與棧各種知識點。
此刻漂浮在他的腦海里,互不隸屬,無法收束。
還差一個東西。
一個能把這些碎片統合起來的框架。
但他不知道那個東西長什麼樣。
李林嘆了口氣,合上書。
最終還是在晚自習開始前,去了實驗樓。
301的門虛掩著。
他推開門,胡云程正坐在那把轉椅上轉圈,同時還能隱約看出正舉著本書。
認真閱讀ing……
「s……nb。」
這些天跟胡云程獨處,李林已經見識過他太多離譜操作、變臉合集。
所以此刻也只能給出一個略顯無力的評價。
「喲,」
胡云程熟練地剎停,看著門口的李林,臉上浮現出的是戲謔,
「哦~我的C語言大佬,終於肯回來了?」
「想通了?又想學算法了?還是準備放棄你那高深的C語言,老老實實轉C++了?」
雖然話語調侃,但他的語氣中還是帶著幾分李林能聽得出的迫切。
畢竟他這個被胡云程欽點的「內門弟子」,幾天前剛剛挨過一頓劈頭蓋臉的罵。
起因是他第一次嘗試突破失敗後,來辦公室問的那個問題。
「胡老師,我想系統學習C語言的內存管理機制,應該從哪裡入手?」
李林記得自己說話時的表情應該是無比認真的,甚至比聽胡云程講課還要認真的多。
但胡云程不滿意。
對他提出的問題,胡云程很不滿意。
「現在離信奧初賽就剩這麼幾天了,這個知識點不在考試大綱里。你突然要學這個?你認真的?」
李林點點頭。
「我有不得不學的理由……」
「你有個屁。」
胡云程站起來,怒火越燒越旺,
「我TM看你就是知道自己過不了初賽,故意找藉口逃避,裝出一副刻苦鑽研的樣子給誰看?你之前在班上學習怎麼沒見你這麼刻苦、這麼鑽研,你早有這個勁,你數學能考TM三十分?」
劈頭蓋臉一頓輸出之後,胡云程見李林沒有反應,更氣了。
凸(゜皿゜メ)
李林當然明白胡云程在憂慮什麼。
確實,在這個節骨眼上,一個連初賽都未必能過的人,放著考試大綱不複習,跑去啃C語言的內存管理,在任何人看來都是瘋了。
他張了張嘴,想解釋,可話到嘴邊又咽了回去。
解釋不了。
「現在你有兩條路。」
胡云程終究還是重新坐下來,雖然語氣依舊硬邦邦的,但已經沒了那麼大的火氣,
「要麼轉C++,對你這種新手來說語法更友好,也好上手。要麼繼續學算法,比你鑽研那些沒用的有用一百倍。」
「相信我,你有機會的。」
話說得難聽,而且最後似乎怕他真的不理解,還特意補充了對他來說很難說出口的努力。
李林知道,這是胡云程在真心實意地給他指路。
「……」
但他搖搖頭。
突破C語言,對他來說,比競賽重要的多。
胡云程盯著他看了好一會兒,才心灰意冷地擺擺手。
「那你以後就不要來我這了。」
「……」
「ber——你還真走啊!」
胡云程猛地竄了起來,臉上的表情幾乎變成了(゚д⊙)
「你走了你就別回來!」
「……」
然而李林已經走出太遠,收不到他這句狠話了。
之後這兩天,李林翻遍了手頭能找到的資料。
書本、網課、論壇帖子、技術博客……
只要標題裡帶著「C語言內存管理」「指針高級應用」「動態內存分配」的,他全看了。
然而,要麼講的都是他已經懂了的基礎概念,要麼就是根本沒講到點子上。
他需要的不是「怎麼做」,而是「為什麼」。
所以。
今天他又站在這間辦公室門口了。
胡云程自然以為他是想通了,放棄了。
兩天嘛,磨一磨年輕人的銳氣、或者說可悲的自尊心,也不算是浪費時間。
胡云程就是這麼想的。
但李林開口的第一句話,就讓他再次失去了當預言家的權利。
「當使用函數指針實現回調,且該函數需要修改多個不同生命周期和不同類型的變量時,應該如何設計接口,才能同時保證簡潔性、類型安全,並系統性避免內存泄漏和懸空指針?」
同一個類型的問題,但比上次具體得多。
「……」
胡云程沉默了。
他現在才知道李林回來是做什麼的。
表決心。
證明他這幾天是真的在學,不是在裝樣子。
他面無表情地盯著李林,李林也毫不猶豫地盯了回來。
然後,得到了胡云程的回答,
「我不知道。」
不是敷衍,是真的不知道。
他鑽研了這麼多年算法,對於這些底層的實現細節,早就拋到了腦後。
當年也許學過吧,也許翻過幾篇相關的論文,但那些記憶早就被消磨得渣都不剩了。
「胡老師,我需要一個方向。」
李林似乎早就預料到這個答案,認真地回答道,
「這件事對我很重要。」
胡云程嘆了口氣,轉過身,隨手指了指辦公室一側。
依舊是琳琅滿目的書籍。
《作業系統》《編譯原理》《程式語言實現模式》……
李林看得有些眼暈。
「看這些就能……」
「屁用沒有。」
胡云程直接打斷了李林,
「我只是伸個懶腰。」
「?」
「然後,找個人幫你問問……不對,是幫我問問,畢竟這個問題,我也挺感興趣的。」
胡云程終究還是鬆口了。
看著他滿臉的(不)感興趣,李林笑了。
鞠躬,沖他道了聲謝。
「別搞這沒用的,趕緊滾一邊去——」
在就在胡云程掏出老花鏡撥弄手機時,李林也沒閒著,坐在一旁隨手翻起書來。
都是擺在胡云程辦公桌上的一些雜誌、期刊之類的雜書。
這兩天,李林的弦繃太緊了。
現在是離答案最近的時候,也是他最該放鬆的時候。
省得一會兒聽到好消息再樂極生悲。
對於一個近兩天只睡了不到4小時的18歲發育期少年來說,這可不是危言聳聽。
「三位諾貝爾物理學獎得主因為對混沌和隨機現象的研究而分享了今年的諾貝爾物理學獎……」
「裝男人……男人裝……」
「據說,面向對象思想的雛形來源於細胞,細胞里既有遺傳物質,又有處理這些物質的酶……」
「世界母猩猩圖鑑……」
「……」
「——等會?」
我剛才是不是看到了什麼?
李林猛地抄過剛才隨便瞟過的一本雜誌。
「細胞?」
「細胞……」
「細胞!」
李林猛地一拍桌子,差點把一旁的胡云程給嚇到彈起來。
但他沒空在意這些了。
他只覺得,有什麼東西——
對上了。
李林快速把整篇文章讀了一遍。
不是在意它的字面意思,而是它所指向的思維方式。
就像細胞:
細胞膜包裹著細胞核與細胞器,遺傳物質和加工這些物質的酶被封裝在同一個單元里,彼此不分離。
數據就是遺傳物質,函數指針就是酶,結構體就是細胞膜。
把數據和操作數據的方法封裝成一個不可分割的「細胞」,然後讓這些細胞自己去管理自己的生命周期,自己去響應外部的消息。
多生命周期?那就各自管理各自的生命周期,在接口處做統一的安全校驗。
類型安全?用函數指針的類型簽名來保證輸入輸出的一致性。
至於內存泄漏和懸空指針……如果一個「細胞」從創建到銷毀都有清晰的邊界,那些野指針就變成了可以捕獲的已知錯誤,而不是無法預防的災難。
一通百通。
酣暢淋漓。
但更重要的是,李林不止是這個問題通了。
他全通了。
因為眾所周知,這其實是很簡單的面向對象思想——
封裝、繼承、多態。
這些東西從來不是C++憑空發明出來的,它們在C語言裡一樣可以被實現,只不過需要你自己動手搭建。
可李林之前從來沒有往這個方向想過。
因為他把先後分得太清了。
C語言是面向過程,C++是面向對象。
這是課本上白紙黑字寫著的,是每一個學編程的人都被反覆灌輸過的分類。
過程是過程,對象是對象,怎麼能混為一談?
先學C再學C++,先學走再學跑,順序不能亂。
可此刻他忽然意識到,這種「先後」只是教學的順序,不是事物本身的順序。
面向對象的思想從一開始就隱藏在C語言的指針和結構體裡,只是要走到足夠深的地方才能看見它。
它不是C語言之後才出現的東西,它從一開始就在那裡。
誰管他什麼先來後到。
真是……
踏破鐵鞋無處覓,得來全不費工夫。
李林突然的笑,又把一旁暗中觀察的胡云程嚇了一跳。
「這孩子……是不是壓力太大了?」
但李林是開心的,迸發出一種豁然開朗的、收都收不住的笑意。
他意識到了,是他自己一直把自己困在「學習的順序」里。
先學語文再學英語,先學C語言再學算法,先補數學才能碰計算機……
但知識從來不是一條單行線。
它是一張網,任何一個節點都可以是入口,任何一個節點也都可以通向所有其他節點。
你只需要一個東西把它們連起來。
而他終於找到了那個東西——
一個更高的視角。
那麼這場考驗,也就迎刃而解了。
你很強,沒錯。
強到縱橫一個時代。
但是。
我,來自未來。
「系統,再次突破C語言。」
隨著他的默念,眼前瞬間白光一閃。
【考驗加載中……】
世界褪去。
等他再睜開眼的時候——
耳邊是老式小型機嗡嗡的低鳴,空氣里正瀰漫著焊接松香的氣味。
【1972年】
【美國新澤西州,貝爾實驗室】