日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

我不是编译器专家

發(fā)布時間:2023/12/20 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 我不是编译器专家 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

這是王垠發(fā)表的一篇文章,轉(zhuǎn)給大家看看,希望有些收獲

王垠是誰?

王垠,四川大學(xué)97級本科畢業(yè),保送到清華大學(xué)計算機(jī)系直博。期間曾在清華大學(xué)計算機(jī)系軟件所就讀,主要進(jìn)行集成電路布線算法的研究。


在此期間,他因《完全用GNU/Linux工作》一文和對TeX的推廣等“非研究成果的業(yè)余東西”而出名。在只剩一年就要博士畢業(yè)的時候,他申請退學(xué),并將1萬7千余字的“退學(xué)申請書”(題為清華夢的粉碎)公布在網(wǎng)上,引起輿論界一時對教育體制、理想主義等的熱議。

王垠的博客

https://www.yinwang.org/

王垠的微博

https://weibo.com/u/6347862377?is_all=1#_rnd1609678848556

我是從之前有個新聞?wù)f王垠準(zhǔn)備去華為工作開始關(guān)注他的,他在微博上發(fā)表的觀點(diǎn),我都會比較關(guān)注,很大的原因是因?yàn)樗暮芏嘤^點(diǎn)非常犀利。

這篇文章我詳細(xì)讀了下,王垠應(yīng)該是一個非常高端的憤青,說他是憤青是因?yàn)榭梢詮乃墓P墨中感受到些許的無奈和吶喊,高端是因?yàn)樗麑芏嗍挛锏恼J(rèn)知是比較深入的。

第一種觀點(diǎn)「為什么我就是沒有遇到一個識我的伯樂」。

我覺得王銀是有才的,只不過這個才,是在一個比較細(xì)分的領(lǐng)域,而且,不是在情商上。

工作多年,我認(rèn)識很多厲害的人,他們大學(xué)都能考上很好的學(xué)校,工作上,他們也能快速的解決問題,更甚至的,能承擔(dān)企業(yè)非常重要的開發(fā)任務(wù)。

但是也僅僅是開發(fā)任務(wù)

就像文中寫道的一樣,跟上面交流的,還有一個或者兩個其他人,這幾個人,才是決定公司項(xiàng)目走向的人。

第二種觀點(diǎn)「別人都是垃圾」

不管是做什么,都是和人打交道,一個人的力量非常有限,如果能聯(lián)合很多人力量的人,那才是強(qiáng)者,王垠是一個強(qiáng)者,他可以是一個呂布,但是絕對不是曹操、劉備、孫權(quán)這樣的人物。

—— 以下是文章原文


工作多年以來,我深刻體會到一個現(xiàn)象,那就是做過“編譯器”工作的人,哪怕只做了點(diǎn)皮毛,都容易產(chǎn)生高人一等的心理,以至于在與人合作中出現(xiàn)各種問題。由于他們往往也存在偏執(zhí)心理和理想主義,所以在惡化人際關(guān)系的同時,也可能設(shè)計出非常不合理的軟件構(gòu)架,浪費(fèi)大量的人力物力。

我曾經(jīng)提到的?DSL?例子,就是這樣的兩個人。他們都自稱做過編譯器,成天在我面前高談闊論,甚至在最基礎(chǔ)的概念上班門弄斧,顯示出一副“教育”其他人的姿態(tài)。其實(shí)他們只有一個人做過?parser,還不算是真正的編譯器工作,卻總顯示出高深莫測的模樣。哲人一樣捋捋胡子,搖搖腦袋,慢條斯理,嗯…… 另外一個完全就是外行,只是知道一些術(shù)語,成天掛在嘴邊。每次他一開口,我都發(fā)現(xiàn)這個人并不知道他自己在說什么,卻仍然洋洋得意的樣子。

我是被他們作為專家請來這個公司的,來了之后卻發(fā)現(xiàn)他們最喜歡的事情,是在我面前顯示他們才是“專家”。他們也問過我問題,可是每一次我都發(fā)現(xiàn)他們并不想知道答案,因?yàn)槲艺f話的時候他們并沒有在聽。不管說什么問什么,他們似乎只想別人覺得他們是最聰明的人。

雖然對其他人趾高氣昂,全懂了的樣子,對于 Brendan Eich(JavaScript 語言的創(chuàng)造者)這樣有權(quán)勢的人物,卻是各種跪舔,顯示出各種“賤”來。我雖然尊重 Brendan Eich 個人和他的語言,然而很明顯他是半路出家,對語言設(shè)計并沒有很深的造詣。對語言稍微有點(diǎn)研究的人,都不會對這種人物顯示出諂媚的態(tài)度。

“Yin,你知道 X 嗎?” 當(dāng)然他期望的是你說不知道,這樣他就能像大師一樣,把這個剛學(xué)到的術(shù)語給你講半天。每當(dāng)這個時候,我就想起一個前同事喜歡說的一句話:“你問我,是因?yàn)槟悴恢?#xff0c;還是因?yàn)槟阒?#xff1f;” 其實(shí)他問的這個概念 X,常常是我很多年前熱心過,試驗(yàn)過,到最后發(fā)現(xiàn)嚴(yán)重問題,拋棄了的概念。

更糟的事情是,這其中一人還是 Haskell 語言的忠實(shí)粉絲,他總是有這樣的雄心壯志,要用“純函數(shù)式編程”改寫全公司的代碼……

遇到這樣的人是非常鬧心的,到了什么程度?他們經(jīng)常雄心勃勃用一種新的語言(Scala,Go 之類)試圖改寫全公司的代碼,一個月之后開始唾罵這語言,兩個月之后他們的項(xiàng)目不了了之,代碼也不知道哪里去了。然后換一種語言,如此反復(fù)……

后來實(shí)在沒做出什么有用的東西,這兩個人又突發(fā)奇想,開始做?DSL,鬧得團(tuán)隊不得安寧,有點(diǎn)資歷的工程師(包括我和一位早期 Netscape 的資深工程師)都極力反對,向大家指出更容易,更省力的解決方案。然而由于管理層根本不懂,所以任憑這兩個人拍胸脯,沒有困難制造困難也要上。因?yàn)闊┯谒麄冊谖颐媲案哒勯熣?#xff0c;而且對這個 DSL 的事情實(shí)在看不下去了,我干脆換了一個部門,不再做跟語言和編譯器相關(guān)的事情。

現(xiàn)在這個 DSL 做了好幾年了,仍然很垃圾,然而公司人傻錢多,居然請到了 Java 界的資深人物來給這 DSL 寫 specification。這兩人也分別升職為 Principal Engineer 和 Distinguished Engineer。當(dāng)看到“Distinguished Engineer”這個 title,我覺得太好笑了。當(dāng)然,我相信有資歷的 PL 人都會明白這 DSL 的問題,我想象著這位 Java 人跟這兩人將會發(fā)生的沖突。如果他對此沒意見的話,那他的水平還真是值得懷疑了。

在 Coverity 和其它公司遇到的編譯器人,基本是差不多的問題。他們下意識里把自己看成是最高檔次的程序員,所以對其他人顯示高高在上的氣勢。

Coverity 有一個 ABC 工程師,因?yàn)樽约簩戇^完整一點(diǎn)的靜態(tài)分析,比較會折騰 C++,總是趾高氣昂的對待其他人,甚至直接對別人說:“你寫的這是什么代碼啊?我絕對不會寫出這么爛的代碼!” 還有一個從斯坦福編譯器教授 Alex Aiken 那里畢業(yè)的 PhD,在 Coverity 做構(gòu)架師,平時一行代碼不寫,也不看其他人寫的,說不出見解深刻點(diǎn)的話,因?yàn)榕c實(shí)際工程脫節(jié),盡在瞎指揮。地位最高的 Distinguished Engineer,成天優(yōu)哉游哉,看一些關(guān)于?parser?的話題,似乎 parser 是他終身的研究方向,也不做什么實(shí)事。

我所在的每一家公司,只要工作跟編譯器沾邊,總是不免遇到這樣的人。其它的我就不細(xì)講了。

有些美國公司在招人的時候表示,對簡歷里提到“做過編譯器”的求職者有戒備心理,甚至直接說“我們不招編譯器專業(yè)的人”。以至于我也曾經(jīng)被過濾掉,因?yàn)槲易鲞^編譯器相關(guān)工作。編譯器專業(yè)的人本來可以做普通的程序員工作,為什么有公司如此明確不要他們呢?我現(xiàn)在明白為什么了,因?yàn)樽哉J(rèn)為是“編譯器專業(yè)”的人,有大概率是性格很差的團(tuán)隊合作者,喜歡顯示出高高在上,拯救世界的姿態(tài),無法平等而尊重的對待其他人。

有些人也把我叫做“編譯器專家”,喜歡在我面前提“編譯器”這個詞。我一直聽著別扭,卻沒有正式拒絕這個稱呼。每每遇到“真正”的編譯器專家,我總覺得自己不是那個圈子的。不是我不能做編譯器的工作,而是編譯器領(lǐng)域人士的認(rèn)識水平,理念和態(tài)度和我格格不入。

所以我應(yīng)該明確表個態(tài):我不是編譯器專家,而且我看不起編譯器這個領(lǐng)域。我一般不會居高臨下看低其它人,然而對于認(rèn)識膚淺卻又自視很高的人,我確實(shí)會表示出藐視的態(tài)度。現(xiàn)在我的態(tài)度是針對編譯器這整個領(lǐng)域。真的,我看這些人不順眼很多年了。

就最后研究的領(lǐng)域,我是一個編程語言(PL)研究者,從更廣的角度來看,我是一個計算機(jī)科學(xué)家。有人聽了“科學(xué)家”一詞總是誤以為我在抬高自己,而在我心目中“科學(xué)家”僅僅是一個職業(yè),就像“廚師”一樣,并不說明一個人的水平和地位。PL 研究者被叫做“計算機(jī)科學(xué)家”是很恰當(dāng)?shù)?#xff0c;因?yàn)?PL 領(lǐng)域研究的其實(shí)不只是語言,而是計算的本質(zhì)。通常人公認(rèn)的計算機(jī)科學(xué)鼻祖?Alan Turing?也可以算是一個 PL 研究者,雖然他認(rèn)識水平比較一般。

IT 業(yè)人士經(jīng)?;煜幊陶Z言(PL)和編譯器兩個領(lǐng)域,而其實(shí) PL 和編譯器是很不一樣的。真懂 PL 的人去做編譯器也會比較順手,而編譯器專業(yè)的卻不一定懂 PL。為什么呢?因?yàn)?PL 研究涵蓋了計算最本質(zhì)的原理,它不但能解釋語言的語義,而且能解釋處理器的構(gòu)架和工作原理。當(dāng)然它也能解釋編譯器是怎么回事,因?yàn)榫幾g器只不過是把一種語言的語義,利用另外一種語言表達(dá)出來,也就是翻譯一下。PL 研究所用的編程范式和技巧,很多可以用到編譯器的構(gòu)造中去,但卻比編譯器的范疇廣闊很多。

深入研究過 PL 的人,能從本質(zhì)上看明白編譯器里在做什么。所以編譯器算是 PL 思想的一種應(yīng)用,然而 PL 的應(yīng)用卻遠(yuǎn)遠(yuǎn)不止做編譯器。每次有人說我是做編譯器的,我都覺得是一種貶低。我只不過拿精髓的理念稍作轉(zhuǎn)換和適應(yīng),做了點(diǎn)編譯器的事情,就被人叫做“編譯器專家”,而我根本不是局限在這個方向。

專門做編譯器的人,一般是專注于“實(shí)現(xiàn)”別人已經(jīng)設(shè)計好的語言,比如 C,C++。他們必須按照語言設(shè)計者寫好的語言規(guī)范(specification)來寫編譯器,所以在語言方面并沒有發(fā)揮的空間,沒有機(jī)會去理解語言設(shè)計的微妙之處。

許多做編譯器的人并不是從零開始寫的,而是拿現(xiàn)成的編譯器來修改,所以他們往往被已經(jīng)存在的,具體的構(gòu)架限制了想象力。極少有編譯器人完整實(shí)現(xiàn)過一個語言,都是在已有的基礎(chǔ)上小改一下,優(yōu)化一些局部的操作。這大大限制了他們可以獲得的全局洞察力。

很多編譯器工程師并沒有接受過系統(tǒng)的 PL 理論教育,有些甚至是半路出家,在學(xué)校里根本沒碰過編譯器,也沒研究過 PL。比如我的第一個公司 Coverity,招進(jìn)去的很多人從來沒碰過編譯器,也不懂 PL。我進(jìn)去不久,Coverity 的 VP 滿口牛氣向新人宣布:“我們會教會你們一切!” 然而很可惜,PL 的精華根本不是一個公司在短期能夠傳授的。Coverity 沒有這個能力,Google,Facebook,Intel,微軟…… 都沒有這個能力。

很多半路出家的編譯器工作者以為在公司跟著做項(xiàng)目,折騰下 LLVM 之類,就會明白所有的原理。然而事實(shí)是很多人這樣做了十幾年,仍然不明白最基礎(chǔ)的原理,因?yàn)樗麄儽痪唧w的實(shí)現(xiàn)限制了想象力。PL 理論聯(lián)系著計算的本質(zhì),不明白這些原理就只能看到膚淺的表面,死記硬背,遇到新的現(xiàn)象就沒法理解了。跟 LLVM 專家聊天,我很多時候發(fā)現(xiàn)他們的知識是死的,僵化在 LLVM 具體的實(shí)現(xiàn)里了。

由于缺乏對 PL 理論的深入研究,編譯器人往往用井底之蛙的眼光來看待語言,總以為他們實(shí)現(xiàn)過的語言(比如 C++)就是一切。一個語言為什么那樣設(shè)計?不知道。它還可以如何改進(jìn)?不知道?!八褪悄莻€樣子!” 這是我常聽編譯器人說的話。當(dāng)然很多編譯器人連 C++ 都沒法完整實(shí)現(xiàn),只是在已有基礎(chǔ)上做了很小的改動。

許多編譯器人把 C++ 的創(chuàng)造者 Bjarne Stroustrup 奉為神圣,卻不知道 Stroustrup 在 PL 領(lǐng)域并不是閃耀的明星。Stroustrup 曾經(jīng)在 2011 年 11 月 11 日來到 IU 進(jìn)行關(guān)于 C++11 的演講,IU 的資深 PL 教授們都有到場。Stroustrup 謙卑的說:“我需要向你們學(xué)習(xí)很多東西來改進(jìn) C++?!?看似“謙虛”,其實(shí)他說的是實(shí)話,因?yàn)?IU 的教授們在語言設(shè)計上確實(shí)比他強(qiáng)很多。

Stroustrup 的整場演講,我沒有看到任何新穎的突破,全都是幾十年早已出現(xiàn),我天天都在用的東西。然而這些 C++ 的改進(jìn)被編譯器人看作是重大的歷史性的突破,因?yàn)樗麄兒芏嗳烁緵]用過其它語言,甚至不知道它們的存在。

后來我的一個能力比較弱的 PL 同學(xué)進(jìn)入了 C++ 委員會,為改進(jìn) C++ 做一些事情。從她的描述和表現(xiàn),我感覺 C++ 委員會氣氛十分的官僚,古板和愚鈍。她進(jìn)了 C++ 委員會之后,感覺整個人都傻了一樣,很膚淺的小事也說得眉飛色舞,好像什么重大的突破一樣。真懂 PL 的一些同學(xué),很少有混進(jìn) C++ 委員會的,因?yàn)槟且馕吨昧硗獾年P(guān)系網(wǎng),讓一些自己根本看不起的人騎在自己頭上,必須先幫他們做一些瞎扯淡的事情。

編譯器人所膜拜的大師,在真正的 PL 研究者眼里其實(shí)不算什么。編譯器人與 PL 研究者在見識上的差距是非常明顯的。PL 人因?yàn)榭赐噶撕芏鄸|西,比較謙虛,往往不想揭穿編譯器人的差距。但編譯器人卻因?yàn)樵凇肮I(yè)界”有地位,趾高氣昂以為自己懂了一切一樣,結(jié)果遇到深刻點(diǎn)的 PL 問題就各種稀里糊涂。

實(shí)際上做編譯器是很無聊的工作,大部分時候只是把別人設(shè)計的語言,翻譯成另外的人設(shè)計的硬件指令。所以編譯器領(lǐng)域處于編程語言(PL)和計算機(jī)體系構(gòu)架(computer architecture)兩個領(lǐng)域的夾縫中,上面的語言不能改,下面的指令也不能改,并沒有很大的創(chuàng)造空間。

編譯器領(lǐng)域幾十年來翻來覆去都是那幾個編程模式和技巧,玩來玩去也真夠無聊的。起初覺得新鮮,熟悉了之后也就那個樣了。很多程序員都懂得避免“低水平重復(fù)”,可是由于沒有系統(tǒng)的學(xué)習(xí)過編譯器,他們往往誤以為做編譯器是更高級,更有趣的工作,而其實(shí)編譯器領(lǐng)域是更加容易出現(xiàn)低水平重復(fù)的地方,因?yàn)樗膭?chuàng)造空間非常有限。

同樣的編譯優(yōu)化技巧,在 A 公司拿來做 A 語言的編譯器,到了 B 公司拿來做 B 語言的編譯器…… 大同小異,如此反復(fù)。運(yùn)氣好點(diǎn),你可能遇到 C,C++,Java。運(yùn)氣不好,你可能遇到 JavaScript,PHP,Ruby,Go 之類的怪胎,甚至某種垃圾 DSL。但公司有要求,無論語言設(shè)計如何蹩腳,硬件指令設(shè)計如何繁瑣,你編譯出來的指令必須能正確運(yùn)行所有這語言寫出來的代碼。你說這活是不是很苦逼?

我在 Cornell 的時候,有一個很有權(quán)勢的編譯器教授,從未發(fā)表有理論價值的 paper,卻老在 Java 上面做文章。他和他的博士生們總是把一些其它語言幾十年前已經(jīng)有的“新特性”搬到 Java 上面,老酒換新瓶,發(fā) paper 拉 funding。由于拉了很多錢,所以在系里很受寵,他的學(xué)生們在其它人面前都趾高氣昂的樣子。

后來這教授的一個學(xué)生去了 Facebook,幫他們做 HipHop,一個從 PHP 到 C++ 的“編譯器”。其實(shí)這種“源到源”編譯器做起來不算難,但給 PHP 這樣劣質(zhì)的語言做編譯器,實(shí)在是狗血的工作,繁瑣而頭痛。沒有任何理論價值不說,在工業(yè)界有什么價值也難說。我的一個前同事曾經(jīng)對 Facebook 的這個項(xiàng)目發(fā)表了一個尖銳而幽默的評價:“Facebook 現(xiàn)在不但給母豬涂上了口紅,而且真的開始 f.. 它了!”

后繼的還有 PHP VM 一類的東西,越來越離譜。后來這位同學(xué)可能也受不了,換組去做其它跟語言無關(guān)的事情了。在 PL 研究者看來,VM 也并沒有什么稀奇。PL 領(lǐng)域有各種各樣的“抽象機(jī)”(abstract machine),比如 CEK machine,它們揭示了計算的方方面面。我自己都設(shè)計實(shí)現(xiàn)過好幾個“可逆抽象機(jī)”,它們可以進(jìn)行所謂“可逆計算”。所以一個 PL 研究者很容易就能設(shè)計出一個 VM 來,它們只不過是一種經(jīng)過部分優(yōu)化的解釋器。

每每看到編譯器人說到“VM”這個詞的時候那種榮耀而敬畏的神情,好像只有他們明白 VM 是什么,我就覺得好笑,外加一種說不出的滋味。編譯器人雖然知道一個具體的 VM 怎么實(shí)現(xiàn),知道一些死板的細(xì)節(jié)和術(shù)語,卻不知道 VM 的本質(zhì)是什么,不知道一個全新的,具有新特性的 VM 要怎么設(shè)計出來。

在《Chez Scheme 的傳說》一文中,我提到在 Cornell 的時候選過一門編譯器課程,后來在半學(xué)期的時候 drop 掉了?,F(xiàn)在回想起這段歷史,發(fā)現(xiàn)它對“教育理念”這件事挺有啟發(fā)意義。教育是什么,是為了什么?Cornell 的這門課給了我一個很好的反面教材。

這個編譯器課程那一年的教授是 Tim Teitelbaum,他也是 GrammaTech 公司的創(chuàng)始人。GrammaTech 是與 Coverity 類似的靜態(tài)分析工具,不過 GrammaTech 還能分析二進(jìn)制代碼。Tim Teitelbaum 是 Donald Knuth 的崇拜者,他經(jīng)常提到 Knuth 提出的一些“偉大概念”,比如 attribute grammar??偸前?Knuth 那些東西說成是最偉大的發(fā)明。

這門課不知道最初是誰設(shè)計的。Andrew Myers 和 Tim Teitelbaum 以前交替著講這個課。

那么我為什么會 drop 這門課,而且是在學(xué)校允許 drop 課程的 deadline 之后呢?因?yàn)樗慕逃砟罘浅5穆浜蠛筒缓侠?#xff0c;可以說就是坑人的。

從課程的大綱你可以看出來,它是很傳統(tǒng)的編譯器課程,一開頭花很多時間精力去折騰 parser。源語言是一種類似 Java 的語言,parser 是使用類似 lex,yacc 的工具生成的。這種盲目重視 parser 的誤區(qū),我已經(jīng)在另外一篇文章批評過,但還這不是我鄙視的重點(diǎn)。

這門課最讓人受不了的事情,發(fā)生在我成功完成 parser,開始編譯代碼的第一個 pass 之后。當(dāng)?shù)玫侥谴巫鳂I(yè)分?jǐn)?shù)的時候,我驚呆了。我從來沒有得過這么差的分?jǐn)?shù)!仔細(xì)看原因,說我的代碼沒通過好些“測試”。我到那個時候才明白,原來提交后的代碼,會被助教拿來跑一些我毫不知情的測試(test),然后他簡單的根據(jù)這些測試的結(jié)果給出分?jǐn)?shù)。

作業(yè)本身的要求是用大段大段的英語寫下來的。你需要按照這些英語描述從零實(shí)現(xiàn)編譯器。真的是從零開始,沒有任何的框架或者示例代碼,完全從白紙開始。經(jīng)過許多努力,你寫出了編譯器,還自己寫了一些小測試,你覺得完全滿足了作業(yè)的要求??墒翘峤恢?#xff0c;你的編譯器代碼卻要被一整套你手里沒有的“測試”進(jìn)行檢驗(yàn)。所以最后你驚訝的發(fā)現(xiàn),自己以為做對了,而助教那里的測試有那么多沒通過!

最讓人無語的事情是,學(xué)生手里是沒有這套測試的,而且他們不給你。也就是說,你提交作業(yè)的時候,無法用最后給你評分用的那些測試來跑你的編譯器,所以你無法知道提交之后會有多少測試失敗。

當(dāng)我向助教和教授抗議,說這樣不合理,要求得到那些測試的時候,我受到粗暴的拒絕和鄙視。那種語氣,好像是在說我是一個不合格的學(xué)生,提一些無理要求。用來打分的測試怎么可能給你,你是太笨了吧?

很多其它 Cornell 學(xué)生被這樣對待,可能都以為沒什么,按照他們的要求做就行了,然而這是完全不合理的。按照合理的教學(xué)理念,學(xué)生應(yīng)該有權(quán)得到自己學(xué)習(xí)狀態(tài)的反饋。如果學(xué)生做這種編程作業(yè),就應(yīng)該能從實(shí)際的測試中得到反饋,知道自己的編譯器是否符合要求。要知道,大段大段的英語描述,是很容易漏看或者誤解的。只有大量的測試才能正確的抓住“要求”本身。所以不給測試,就相當(dāng)于不給你準(zhǔn)確的要求,到后來卻要拿這套測試來給你打分。

課程本來應(yīng)該把測試連同英語描述一起給學(xué)生,他們實(shí)現(xiàn)之后,自己跑通所有測試,再提交代碼。這樣學(xué)生就能準(zhǔn)確的把握作業(yè)的“要求”,而不是看著那些混淆不堪的英語段落自己在那里猜。

因?yàn)檫@個原因,而且由于教授和助教的傲慢態(tài)度。我最終決定在課程都快進(jìn)行到一半的時候 drop 這門課程。當(dāng)然,要進(jìn)行這個操作是需要系主任簽字特許的,為此我還在系主任那里留下一筆“污點(diǎn)”。

在我看來,Cornell 教授們的這種做法,根本就不是合格的教育者,可以說就是在坑人,整人,害人。在他們的理念里,教育是單方面的,學(xué)生必須通過作業(yè)和考試,而教授卻不需要為教學(xué)方法負(fù)責(zé),可以隨便怎么教,作業(yè)和考試想怎么整都行。

很多 Cornell 教授有類似的現(xiàn)象,教學(xué)不用心,光是各種拉 funding,耀武揚(yáng)威,完全不顧學(xué)生死活。也許這就是為什么 Cornell 總是有學(xué)生自殺。我走了之后有一年,在一個星期之內(nèi)有三個學(xué)生從學(xué)校里瀑布旁邊的吊橋跳下去自殺,新聞轟動了全美國。

后來在網(wǎng)上看到有人罵 Cornell,說:“Cornell 想教你游泳,于是他把你推進(jìn)池塘里,等你撲騰上岸。等你快上來的時候,他又朝你扔一塊大石頭,然后繼續(xù)等你游上來。等你又快上岸了,他又拿起一個榔頭往你頭上猛砸。這樣你就可以死了,可是 Cornell 仍然在那里等著你游上岸來……”

這段話恰到好處的描述了我的在 Cornell 的經(jīng)歷。

轉(zhuǎn)學(xué)到 IU 之后,我參加了 Kent Dybvig 的編譯器課程,發(fā)現(xiàn)我所設(shè)想的編譯器課程原來早已被他實(shí)現(xiàn)了,而且實(shí)現(xiàn)的如此友好。編譯器的每一個 pass,都會把所有的“官方測試”發(fā)給學(xué)生。學(xué)生按照要求實(shí)現(xiàn)每個編譯器 pass,在自己電腦上跑通所有測試,充分檢查,然后才提交作業(yè)。而且作業(yè)的網(wǎng)站會自動測試你提交的代碼,在提交的當(dāng)時就給你反饋:“你有 N 個測試沒通過,請修改后重新提交?!?/p>

這才是正確的教育方法,因?yàn)樗o予學(xué)生合理的反饋,讓他們清晰的知道自己的表現(xiàn)是否符合預(yù)期,主動進(jìn)步,而不是拿一些學(xué)生事先不知道的標(biāo)準(zhǔn)在那里瞎坑人,光是給人打分。

Cornell 沒有明白教育的目的是培養(yǎng)人,而不只是給人發(fā)文憑。Dybvig 教授不但技術(shù)和學(xué)術(shù)水平遠(yuǎn)高于傳統(tǒng)的編譯器人,而且他的課程也設(shè)計得如此科學(xué)和友好。這才是真正的教育者。

雖然苦逼,編譯器人往往自高自大,高估自己在整個 IT 領(lǐng)域里的地位,看低其它程序員。編譯器人很多認(rèn)為自己懂了編程語言的一切,而其實(shí)他們只是一知半解。

編譯器領(lǐng)域最重要的教材,龍書和虎書,在我看來也有很多一知半解,作者自己都稀里糊涂的內(nèi)容。而且花了大量篇幅講?parser?這種看似高深,實(shí)則膚淺的話題,浪費(fèi)讀者太多時間,誤導(dǎo)他們認(rèn)為 parser 是至關(guān)重要的技術(shù)。以至于很多人上完編譯器課程,只學(xué)會了寫 parser,對真正關(guān)鍵的部分沒能理解。龍書很難啃,為什么呢,因?yàn)樽髡咦约憾疾辉趺炊;柗Q改進(jìn)了龍書,結(jié)果還是很難啃,感覺只是換了一個封面而已。

我曾經(jīng)跟虎書作者 Andrew Appel 的一個門徒合作過,當(dāng)時這人在 IU 做助理教授。借著一次我跟她做 independent study 的機(jī)會,逼我寫毫無意義的論文,而且對人非常的 push 和虛偽。作為普林斯頓大學(xué)畢業(yè)的 PhD,學(xué)識水平跟 IU 的其他教授格格不入,卻在待人接物方面顯示出各種“賤”,對編譯器領(lǐng)域的“牛人”各種跪舔,隨時都在顯示自己以前在某某人身邊工作過。那是我在 IU 度過的最難受的一個學(xué)期,這使我對“編譯器人”的偏見又加深一層。

編譯器領(lǐng)域的頂級人物如此,其它聲稱做過編譯器的人也可想而知了。大部分自稱做過編譯器的人,恐怕連最基本的的編譯器都沒法從頭寫出來。利用 LLVM 已有的框架做點(diǎn)小打小鬧的優(yōu)化,就號稱自己做過編譯器了。許多編譯器人士死啃書本,膚淺的記憶各種術(shù)語(比如 SSA),死記硬背具體實(shí)現(xiàn)細(xì)節(jié)(比如 LLVM 的 IR),看不透,無法靈活變通。

所以我常說,編譯器是計算機(jī)界死知識最多,教條主義最嚴(yán)重的領(lǐng)域。經(jīng)常是某人想出一個做法,起個名字,其他人就照做,死記硬背,而且把這名字叫得特別響亮。你要是一時想不起這名字是什么意思,立馬被認(rèn)為是法國人不知道拿破侖,中國人不知道m(xù)z x。你不是做編譯器的!

現(xiàn)在因?yàn)?AI 的泡沫,很多人轉(zhuǎn)向所謂“AI 框架”,“AI 編譯器”。這類職位如此之多,以至于很多人根本沒碰過編譯器,也搖身一變成為了“深度學(xué)習(xí)編譯器工程師”。

半路出家的“AI 框架工程師”和“AI 編譯器工程師”們,在別人寫出來的框架上小打小鬧優(yōu)化一下,就以為自己做的是世界上最前沿的工作,卻不知道深入研究過 PL 的人其實(shí)很容易就看破了那些東西。很多 AI 框架工程師嘴里各種奇怪的術(shù)語,卻看不透所謂“AI 框架”只不過是“可求導(dǎo)編程語言”,完全不能從高級語言和邏輯的角度去看問題。

AI 框架和編譯器里面的原理和本質(zhì)很容易被 PL 理論解釋,PL 研究者能夠?yàn)檫@些項(xiàng)目指出正確的方向,避免不必要的彎路,然而這些自詡為“編譯器人”的 AI 框架工程師們完全意識不到這一點(diǎn)。自高自大,膜拜權(quán)威,完全沒有去聽 PL 研究者在說什么,甚至覺得能“教育”比自己看得透的人。

每一個大公司都要趁著 AI 這個熱度做自己的“AI 框架”,“AI 編譯器”,唯恐不做自己的框架,就會在業(yè)界丟面子,所以一窩蜂而上。一定要聘用名聲很大的 AI 框架專家來公司站臺,雖然也不知道他最后能做出什么來。所有 AI 框架和編譯器都大同小異,屬于無謂的重復(fù)勞動。有些人搗鼓一下這個框架,然后用同樣的技巧去搗鼓另外一個,中間都是一些工程性的臟活。這種事情真是非常無聊。

AI 的熱潮正在褪去,大部分 AI 公司會在一年之內(nèi)失敗。“AI 編譯器”的工作也會瀕臨滅絕。所以任憑他們自己瞎蒙亂撞吧,反正堅持不了多久了。

這就是為什么雖然有多次編譯器的工作機(jī)會,包括 Apple 的 LLVM 部門,我最后都沒去。進(jìn)入 Intel 的時候,本來編譯器部門也歡迎我,可是再三考慮之后還是選擇了其它方向。因?yàn)槲液芮宄挠浀?#xff0c;每一次做編譯器相關(guān)工作都是非常壓抑的,需要面對一些沉悶古板而自以為是的人,而且內(nèi)容真的是重復(fù),無聊和枯燥。

我唯一敬佩的編譯器作者是?Kent Dybvig,但我也不想跟他一起做編譯器。最近很多芯片公司的“AI 編譯器”部門找我,我全都拒絕了。我不喜歡身邊圍繞著這些人,做著這些事。我寧愿去賣燒餅也不想做編譯器。

由于編譯器人的性格特征,除非一個公司專門要做編譯器,否則對于曾經(jīng)做過編譯器,想換個方向的求職者,在面試的時候最好深刻了解他們的性格,態(tài)度和做事方式,看他們是否能看淡這些,能否平等對待其他人,能否理性而實(shí)在的對待工程。否則自視很高的“編譯器人”進(jìn)了公司,很可能對團(tuán)隊成為一種災(zāi)難。

我寫這篇文章是為了警醒廣大 IT 公司,也是為了在精神上支持其它程序員。我希望他們不要被編譯器的“難度”迷惑了,不要被編譯器人嚇唬和打壓。你們做的并不是更低級,更無聊的工作。正好相反,真正可以發(fā)揮創(chuàng)造力的空間并不在底層的編譯器一類的東西,而在更接近應(yīng)用和現(xiàn)實(shí)的地方。

每當(dāng)有人向我表示編譯器高深莫測,向往卻又高攀不上,我都會給他打一個比方:做編譯器就像做菜刀。你可以做出非常好的菜刀,然而你終究只是一個鐵匠。鐵匠不知道如何用這菜刀做出五花八門,讓人心曠神怡,米其林級別的菜肴,因?yàn)槟鞘谴髲N的工作。要做菜還是要打鐵,那是你自己的選擇,并沒有貴賤之分。

推薦閱讀:

專輯|Linux文章匯總

專輯|程序人生

專輯|C語言

我的知識小密圈

總結(jié)

以上是生活随笔為你收集整理的我不是编译器专家的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。