作者 |Adam Berg
【資料圖】
譯者 | 彎月
出品 | CSDN(ID:CSDNnews)
嘗試新的編程語(yǔ)言
大約一年前,我決定了解一下Rust。我閱讀了相關(guān)書籍,學(xué)習(xí)了一些教程,還閱讀了一些文章。后來(lái),我決定用Rust編寫我的第一個(gè)命令行應(yīng)用程序。
學(xué)習(xí)一門新語(yǔ)言的感覺(jué)有點(diǎn)像嘗試RPG游戲中的一個(gè)新角色。剛開(kāi)始的時(shí)候,一切都令人興奮。隨著學(xué)習(xí)的不斷加深,你會(huì)意識(shí)到以前在編程工作中遇到的挫敗感又一次出現(xiàn)了。我認(rèn)為,這些“挫敗感”大多是因?yàn)闊o(wú)聊引起的。如果在玩電子游戲的時(shí)候感到無(wú)聊,完全可以重新開(kāi)始。畢竟游戲的目的就是享受樂(lè)趣。然而,在軟件開(kāi)發(fā)中,重頭開(kāi)始是一件大事。我想通過(guò)本文,探討一下我決定暫時(shí)放棄Rust(以及其他語(yǔ)言),并集中精力(重新)學(xué)習(xí)C的一些原因。
“原生”語(yǔ)言
在計(jì)算機(jī)編程中,“原生”語(yǔ)言指的是計(jì)算機(jī)可以理解的語(yǔ)言。然而,最近我在思考一個(gè)問(wèn)題:我個(gè)人的“原生”編程語(yǔ)言是什么。
我從十幾歲開(kāi)始接觸Java,但大多數(shù)時(shí)候都是圍繞著教程打轉(zhuǎn)。后來(lái),進(jìn)入大學(xué),我的專業(yè)是工程學(xué),大一的時(shí)候我選修了C語(yǔ)言。這門課的成績(jī)呈兩極分化:要么是學(xué)霸,要么是學(xué)渣。我覺(jué)得這很正常,因?yàn)槟憔帉懙某绦蛞茨苷9ぷ鳎淳团懿煌?。在這門課中,我學(xué)習(xí)了編程的所有基礎(chǔ)知識(shí),并大致了解了計(jì)算機(jī)的工作原理。這門課的學(xué)習(xí)堅(jiān)定了我的想法:我想學(xué)習(xí)編程,而且從那時(shí)起C語(yǔ)言就在我心里扎了根。
現(xiàn)如今,我掌握了(至少可以正常使用)多門編程語(yǔ)言:C、C#、C++、Assembly、Php、Java、Golang、Rust、Swift、ActionScript 3、JavaScript、TypeScript、Haxe 和 Python。我經(jīng)常拿人類語(yǔ)言與計(jì)算機(jī)語(yǔ)言做類比?!霸Z(yǔ)言”就好象我們的母語(yǔ),母語(yǔ)與其他語(yǔ)言最大的不同在于,在說(shuō)話或?qū)懽鞯臅r(shí)候,母語(yǔ)會(huì)自然而然地涌現(xiàn)。而其他語(yǔ)言,則需要在腦海中翻譯,而且在說(shuō)出來(lái)之前也需要先在腦海中打草稿。雖然我的其他語(yǔ)言也可以說(shuō)的很流利,但終究比不上母語(yǔ)。
在提到C語(yǔ)言時(shí),人們的第一反應(yīng)是“C語(yǔ)言太難了”。回顧以往的經(jīng)歷,我卻覺(jué)得JavaScript、Swift 和 Rust才是最難理解的語(yǔ)言。這些語(yǔ)言擁有很多神奇的“魔法”,因此很難搞清楚究竟怎么回事。我發(fā)現(xiàn)在用這些語(yǔ)言編寫代碼時(shí),我的大腦會(huì)編寫偽 C 代碼,然后轉(zhuǎn)譯為正在使用的語(yǔ)言。
于是,我開(kāi)始思考為什么我還要學(xué)習(xí)這些新語(yǔ)言。我開(kāi)始使用 JavaScript 是因?yàn)樗蔷帉慦eb交互式應(yīng)用程序的唯一方法。后來(lái),我開(kāi)始使用 Swift,因?yàn)樗翘O果提供的編寫 iOS 應(yīng)用程序的唯一方式。最后,我又開(kāi)始學(xué)習(xí)Rust,主要是因?yàn)樗芰餍小?/p>
每種語(yǔ)言都讓我學(xué)習(xí)到了很多新知識(shí),但每種語(yǔ)言都讓我略感酸澀。我受夠了慢吞吞的JavaScript(尤其是在 Web 開(kāi)發(fā)領(lǐng)域,我們想方設(shè)法進(jìn)行各種微優(yōu)化,實(shí)際上換一種語(yǔ)言也許立即可以將速度提升2倍)。Swift就像是一副帶著蘋果logo的手銬。我不認(rèn)為自己會(huì)在蘋果圍墻花園之外使用這門語(yǔ)言,而且我無(wú)法接受只能在一個(gè)平臺(tái)上開(kāi)發(fā)的編程語(yǔ)言。我原本希望Rust能夠給我?guī)?lái)一絲欣喜。雖然我至今認(rèn)為它有這種潛質(zhì),但不幸的是,我發(fā)現(xiàn)Rust的語(yǔ)法很笨拙,而且學(xué)習(xí)的時(shí)間甚至超過(guò)了實(shí)際編寫代碼的時(shí)間。誠(chéng)然,隨著經(jīng)驗(yàn)的增加,這種情況會(huì)慢慢改善??紤]到很有可能Rust不會(huì)大火,所以我不打算花太多時(shí)間在上面。我還沒(méi)有真正體驗(yàn)過(guò)Rust聲稱要解決的C/C++中的問(wèn)題。這可能是因?yàn)槲乙矝](méi)有花太多時(shí)間學(xué)習(xí)C/C++,但我認(rèn)為在尋求解決方案之前,我們應(yīng)該首先正確理解問(wèn)題。
C 語(yǔ)言的編程核心
最近,我突然想起可以使用emscripten編譯C語(yǔ)言在Web上使用。過(guò)去,我曾嘗試過(guò),但這次我想花一些時(shí)間結(jié)合C語(yǔ)言和SDL庫(kù),編寫一個(gè)游戲《乓》的概念驗(yàn)證。
在成為 Web 開(kāi)發(fā)人員之前,我是一名游戲開(kāi)發(fā)人員,我一直認(rèn)為游戲引擎的運(yùn)行方式比網(wǎng)站更直觀。我已經(jīng)開(kāi)始嘗試使用 SDL 編寫非游戲應(yīng)用程序。第一次是記筆記的類似 GUI 終端的應(yīng)用程序。我花了一些時(shí)間來(lái)整理想法,目前我有了一個(gè)能用的應(yīng)用程序。我希望盡快編寫完該應(yīng)用程序。
此外,我還嘗試在 iPhone 6手機(jī)上運(yùn)行了相同的代碼。蘋果不支持在iPhone 6上編譯 Swift 應(yīng)用程序。在檢查了SDL的兼容性后,我注意到它能夠在 iOS 6 及更高版本上運(yùn)行,這意味著它實(shí)際上能支持從iPhone 3GS之后所有iOS設(shè)備。經(jīng)過(guò)此次嘗試,我發(fā)現(xiàn)我完全可以不使用Swift 和 Objective-C,同時(shí)我比大多數(shù)現(xiàn)代“iOS 開(kāi)發(fā)人員”具有更好的 iOS 兼容性。
在 Web 開(kāi)發(fā)方面,我很不喜歡需要“安裝”的Web 應(yīng)用程序。Web應(yīng)用程序?qū)嶋H上并不能與本地文件系統(tǒng),而將服務(wù)節(jié)點(diǎn)、IndexedDB等組合起來(lái),確保在離線狀態(tài)下正常工作太復(fù)雜了。使用C以我熟悉和喜愛(ài)的方式讀取和寫入文件非常簡(jiǎn)單。C語(yǔ)言的應(yīng)用程序本來(lái)就只能離線,在線才是后來(lái)添加的功能。
在我看來(lái),Web 應(yīng)用程序應(yīng)該作為正確安裝的應(yīng)用程序的補(bǔ)充。我很有興趣探索一下相反方向的工作是否有意義。例如用 C 語(yǔ)言為編寫桌面版的應(yīng)用程序,然后確保相同的代碼也能夠在瀏覽器中運(yùn)行。
我厭倦了沒(méi)有互聯(lián)網(wǎng)就無(wú)法訪問(wèn)應(yīng)用程序。我厭倦了總是需要打開(kāi)一堆瀏覽器的標(biāo)簽頁(yè)。我厭倦了需要很長(zhǎng)時(shí)間才能打開(kāi)應(yīng)用程序。如今,處理器的速度越來(lái)越快,但我們卻找了各種理由編寫更糟糕的應(yīng)用程序。
總結(jié)
我感覺(jué)自己目前的狀態(tài)就像是開(kāi)始了一個(gè)新角色。也許將來(lái)我對(duì)C語(yǔ)言的看法也會(huì)和其他語(yǔ)言一樣。但值得慶幸的是,我堅(jiān)信更進(jìn)一步掌握C語(yǔ)言更加有價(jià)值。C語(yǔ)言是構(gòu)建其他一切的基礎(chǔ)。也許我會(huì)發(fā)現(xiàn) Rust 復(fù)雜的語(yǔ)法和規(guī)則是值得的。但我必須親自嘗試得出結(jié)論,而不是盲目地跟風(fēng),人云亦云。
關(guān)鍵詞: 歷經(jīng)眾多現(xiàn)代編程語(yǔ)言后 我又回到了