CSDN 編者按】從日常生活中發(fā)現(xiàn)電梯軟件的系統(tǒng)崩潰,到將一個(gè)業(yè)余項(xiàng)目發(fā)展成為最受開(kāi)發(fā)者喜愛(ài)的編程語(yǔ)言,這是全球開(kāi)發(fā)者Graydon Hoare與Rust的一段奇妙故事。
原文鏈接:https://www.technologyreview.com/2023/02/14/1067869/rust-worlds-fastest-growing-programming-language/
未經(jīng)授權(quán),禁止轉(zhuǎn)載!
作者 | Clive Thompsonarchive page 譯者 | 彎月出品 | CSDN(ID:CSDNnews)
許多軟件項(xiàng)目的建立都是因?yàn)槟硞€(gè)地方的某個(gè)程序員遇到了一個(gè)需要解決的問(wèn)題。Graydon Hoare 的故事也源于此。
Rust 誕生背景
2006 年,Hoare 是一名 29 歲的計(jì)算機(jī)程序員,就業(yè)于開(kāi)源瀏覽器公司 Mozilla。有一天,回到溫哥華的公寓,他發(fā)現(xiàn)電梯壞了,原因是電梯的軟件系統(tǒng)崩潰了。這已不是第一次發(fā)生這樣的事情。Graydon Hoare 住在 21 樓,想到要爬樓梯回家,他頓時(shí)感到很惱火:“我們這些從事計(jì)算機(jī)工作的人甚至無(wú)法制造出一部不會(huì)崩潰的電梯!”Graydon Hoare 知道,許多此類的崩潰都是由于程序使用內(nèi)存的方式存在問(wèn)題而造成的。電梯之類的設(shè)備內(nèi)部的軟件通常是用 C++ 或 C 等語(yǔ)言編寫的,用這兩種語(yǔ)言編寫的代碼運(yùn)行速度非常快,而且代碼非常緊湊。然而,問(wèn)題在于,這兩種語(yǔ)言也很容易意外引入內(nèi)存錯(cuò)誤,這些錯(cuò)誤會(huì)導(dǎo)致程序崩潰。根據(jù)微軟的估計(jì),其代碼中 70% 的漏洞是由于使用這些語(yǔ)言編寫的代碼存在的內(nèi)存錯(cuò)誤造成的。對(duì)于大多數(shù)人而言,當(dāng)知道自己需要爬到 21 樓時(shí),都會(huì)很生氣,但也就僅此而已了。但 Graydon Hoare 決心為此做點(diǎn)什么。于是,他打開(kāi)筆記本,開(kāi)始設(shè)計(jì)一種全新的計(jì)算機(jī)語(yǔ)言,他希望這種語(yǔ)言能夠編寫出沒(méi)有內(nèi)存錯(cuò)誤、小而快的代碼。他將其命名為 Rust,英文單詞“rust”本是一種真菌,中文中叫植物銹病的不少都是這類真菌造成的,他說(shuō)這個(gè)名字的寓意是:“為了生存而過(guò)度設(shè)計(jì)”。
17 年后,Rust 發(fā)展成為了全球最熱門的新語(yǔ)言之一。有將近 280 萬(wàn)程序員使用 Rust 編寫代碼,從微軟到亞馬遜,許多公司都將其視為未來(lái)的關(guān)鍵。聊天平臺(tái) Discord 使用 Rust 來(lái)加速其系統(tǒng),Dropbox 使用它來(lái)將文件同步到用戶的計(jì)算機(jī),而 Cloudflare 使用它來(lái)處理超過(guò) 20% 的互聯(lián)網(wǎng)流量。在 Stack Overflow 的年度調(diào)查中,Rust 連續(xù)七年蟬聯(lián)“最受程序員喜愛(ài)”的編程語(yǔ)言。就連美國(guó)政府也在積極地推廣 Rust 軟件,將其作為確保流程更安全的一種方式。與許多成功的開(kāi)源項(xiàng)目一樣,Rust 的發(fā)展也離不開(kāi)社區(qū)的共同努力,現(xiàn)有數(shù)百名貢獻(xiàn)者仍在支持,其中許多是志愿者。Graydon Hoare 本人在 2013 年退出了該項(xiàng)目,很放心地將其移交給了其他工程師,包括 Mozilla 的核心團(tuán)隊(duì)。創(chuàng)造一種新的計(jì)算機(jī)語(yǔ)言并不罕見(jiàn)。許多程序員都會(huì)利用業(yè)余時(shí)間建立一個(gè)小項(xiàng)目。但是,能夠在 JavaScript、Python 或 Java 等眾多流行的編程語(yǔ)言之中站穩(wěn)腳跟,實(shí)屬罕見(jiàn)。
C/C++ 的天然“大坑”
為了理解 Rust 為何如此實(shí)用,我們應(yīng)該深入了解編程語(yǔ)言對(duì)計(jì)算機(jī)內(nèi)存的處理。簡(jiǎn)單來(lái)說(shuō),你可以將計(jì)算機(jī)中的動(dòng)態(tài)內(nèi)存想象成一塊黑板。軟件運(yùn)行時(shí)會(huì)不斷地在黑板上寫數(shù)據(jù),記錄哪個(gè)數(shù)據(jù)保存到了哪里,并在不需要的時(shí)候?qū)⑵洳脸5牵煌挠?jì)算機(jī)語(yǔ)言,管理這塊黑板的方式也不同。C 以及 C++ 等早期的語(yǔ)言傾向于賦予程序員很大的權(quán)力,讓他們來(lái)決定何時(shí)以及如何使用這塊黑板。這種能力很強(qiáng)大,代碼可以動(dòng)態(tài)控制內(nèi)存,加快軟件的運(yùn)行速度。這就是為什么 C 和 C++ 常用于編寫“裸機(jī)”代碼,即直接與硬件交互。許多沒(méi)有 Windows 或 Linux 之類的操作系統(tǒng)的機(jī)器,比如透析機(jī)或收銀機(jī)等,都運(yùn)行著這樣的代碼。(此外,C 和 C++ 之類的語(yǔ)言也用于更高級(jí)的計(jì)算:有時(shí)操作系統(tǒng)需要與硬件通信。Windows、Linux 和 MacOS 的內(nèi)核都是用 C 語(yǔ)言編寫的。)雖然 C 和 C++ 的速度很快,但這是有代價(jià)的。編程人員需要仔細(xì)記錄寫入哪塊內(nèi)存,以及何時(shí)擦除。如果不小心忘記刪除某些內(nèi)容,結(jié)果會(huì)怎樣?可能會(huì)導(dǎo)致軟件崩潰,當(dāng)軟件嘗試使用它認(rèn)為是空的內(nèi)存,但實(shí)際上其中已保存了數(shù)據(jù),就會(huì)崩潰。或者,這會(huì)成為非法用戶的入侵渠道。黑客會(huì)發(fā)現(xiàn)程序沒(méi)有正確清理內(nèi)存,本應(yīng)被清除的密碼或財(cái)務(wù)等信息仍然存在,他們就會(huì)偷偷攫取這些數(shù)據(jù)。隨著 C 和 C++ 代碼的規(guī)模增大,即便是程序員再細(xì)心,也可能會(huì)犯很多內(nèi)存錯(cuò)誤,從而導(dǎo)致軟件中 bug 累累。無(wú)人機(jī)公司 Fusion Engineering 的聯(lián)合創(chuàng)始人兼 Rust 庫(kù)團(tuán)隊(duì)負(fù)責(zé)人 Mara Bos 表示:“在 C 或 C++ 中,你總是會(huì)擔(dān)心代碼隨時(shí)出現(xiàn)問(wèn)題。”上個(gè)世紀(jì) 90 年代,Java、JavaScript 和 Python 等一系列語(yǔ)言開(kāi)始流行。這些語(yǔ)言采取了完全不同的方法。為了減輕編程人員的壓力,這些語(yǔ)言使用“垃圾收集器”自動(dòng)管理內(nèi)存,這些組件會(huì)在軟件運(yùn)行時(shí)定期清理內(nèi)存。你可以編寫沒(méi)有內(nèi)存錯(cuò)誤的代碼。但缺點(diǎn)是失去了細(xì)粒度的控制。程序的執(zhí)行速度也減慢了(因?yàn)槔占加昧岁P(guān)鍵的處理時(shí)間)。用這些語(yǔ)言編寫的軟件需要使用更多的內(nèi)存。因此,編程世界分成了兩大陣營(yíng)。如果軟件需要快速運(yùn)行或在嵌入式設(shè)備的微型芯片上運(yùn)行,則選用 C 或 C++ 編寫更合適。如果是網(wǎng)絡(luò)應(yīng)用程序或手機(jī)應(yīng)用,則可以選用一種更新的、具有垃圾收集功能的語(yǔ)言。
編程大佬紛紛加入 Rust
Graydon Hoare 創(chuàng)建的 Rust 語(yǔ)言與上述這些方法有很大的不同。Rust 不需要程序員手動(dòng)找出數(shù)據(jù)在內(nèi)存中的位置,而是由語(yǔ)言本身來(lái)管理。但 Rust 對(duì)于如何在程序中使用或復(fù)制數(shù)據(jù)有許多嚴(yán)格的規(guī)則。程序員必須學(xué)習(xí)這些編程規(guī)則—— 比 Python 或 JavaScript 更繁瑣的規(guī)則。雖然編寫代碼的難度有所提高,但代碼是“內(nèi)存安全的”,你無(wú)需擔(dān)心不小心插入致命的內(nèi)存錯(cuò)誤。最為重要的是,Rust 還將提供“并發(fā)安全”。現(xiàn)代程序可以同時(shí)做多件事——并發(fā),有時(shí)不同的線程會(huì)嘗試修改同一塊內(nèi)存,而 Rust 的內(nèi)存系統(tǒng)會(huì)阻止這種操作。在剛開(kāi)始設(shè)計(jì) Rust 時(shí),Graydon Hoare 在 Mozilla 工作,已是一名擁有十多年軟件開(kāi)發(fā)經(jīng)驗(yàn)的老程序員。起初,Rust 只是一個(gè)業(yè)余項(xiàng)目。Graydon Hoare 花了幾年時(shí)間來(lái)開(kāi)發(fā) Rust,當(dāng)?shù)谝淮蜗蚱渌绦騿T展示這門語(yǔ)言時(shí),收到的反饋褒貶不一。“有些人很熱情,而有些人則表示不喜歡,還說(shuō)這門語(yǔ)言壓根不行,永遠(yuǎn)沒(méi)機(jī)會(huì)使用。”然而,Mozilla 的高層卻對(duì) Rust 很感興趣。他們認(rèn)為,Rust 可以幫助他們構(gòu)建更好的瀏覽器引擎。瀏覽器是非常復(fù)雜的軟件,出現(xiàn)內(nèi)存錯(cuò)誤的風(fēng)險(xiǎn)極高。Patrick Walton 也是 Mozilla 的一名員工,他也參與了 Rust 的開(kāi)發(fā)工作。當(dāng)初,Patrick Walton 放棄繼續(xù)攻讀編程語(yǔ)言博士的學(xué)位,并加入了 Mozilla。偶爾的一次機(jī)會(huì),JavaScript 的創(chuàng)建者 Brendan Eich 把他拉進(jìn)了 Mozilla 的一次會(huì)議:“我們?cè)谟懻?Rust 的設(shè)計(jì)決策,你要不要來(lái)看看?”Patrick Walton 覺(jué)得 Rust 非常棒,于是,他開(kāi)始和 Graydon Hoare 一起開(kāi)發(fā)該語(yǔ)言。后來(lái)越來(lái)越多的工程師加入了他們的隊(duì)伍。當(dāng)時(shí)的很多人,包括 Mozilla 的工程師 Niko Matsakis 和 Felix Klock,都有內(nèi)存和編程語(yǔ)言相關(guān)的研究經(jīng)驗(yàn)。 Patrick Walton Niko Matsakis Felix Klock Manish Goregaokar圖源:MITTechnologyReview
2009 年,Mozilla 決定正式支持 Rust。該語(yǔ)言是完全開(kāi)源的,而且其決策由創(chuàng)造者全權(quán)負(fù)責(zé),不過(guò) Mozilla 同意出錢資助幾位工程師。于是,Rust 小組占據(jù)了公司的一間會(huì)議室,Mozilla Research 的聯(lián)合創(chuàng)始人 Dave Herman 將其稱為“書(shū)呆子洞穴”,并在門外張貼了一個(gè)標(biāo)志。在這之后的十年里,Mozilla 雇傭了十幾名工程師全職研究 Rust。Walton 回憶道:“每個(gè)人都覺(jué)得自己在從事一項(xiàng)偉大的事業(yè)。” 這種興奮延伸到了 Mozilla 的大樓之外。2010 年代初期,Rust 吸引了世界各個(gè)角落的科技志愿者,他們中的有些人在大型科技公司工作。其中一名主貢獻(xiàn)者是德國(guó)的一名高中生。2010年,Mozilla 在加拿大不列顛哥倫比亞省舉行會(huì)議,Eich 發(fā)表了關(guān)于實(shí)驗(yàn)性語(yǔ)言的演講,他說(shuō):“如果你對(duì)編程語(yǔ)言充滿了興趣,就一定要試試看 Rust。”
確認(rèn) Rust 核心,程序運(yùn)行更快,更安全2010 年代初期,Mozilla 的工程師和世界各地的 Rust 志愿者逐漸打磨出了 Rust 的核心:內(nèi)存的管理方式。他們創(chuàng)建了一個(gè)“所有權(quán)”系統(tǒng),一個(gè)數(shù)據(jù)只能由一個(gè)變量引用,這大大降低了內(nèi)存出問(wèn)題的風(fēng)險(xiǎn)。Rust 的編譯器會(huì)嚴(yán)格執(zhí)行所有權(quán)規(guī)則。如果編程人員違反這些規(guī)則,編譯器將拒絕編譯代碼,也不會(huì)將其變成可運(yùn)行的程序。Rust 使用的許多技巧都算不上新穎,Manish Goregaokar 是 Rust 開(kāi)發(fā)人員工具團(tuán)隊(duì)的負(fù)責(zé)人,早年曾在 Mozilla 工作,他表示:“大多是幾十年前的研究”。但 Rust 工程師善于發(fā)現(xiàn)這些設(shè)計(jì)概念,并將它們轉(zhuǎn)化為實(shí)用的功能。隨著這個(gè)團(tuán)隊(duì)不斷改進(jìn)內(nèi)存管理系統(tǒng),逐漸地 Rust 不再需要自己的垃圾收集器,直到 2013 年,他們刪除了垃圾收集器。如今用 Rust 編寫的程序運(yùn)行速度更快,因?yàn)橛?jì)算機(jī)不會(huì)每隔一段時(shí)間就停下來(lái)清理垃圾。Hoare 指出,一些軟件工程師認(rèn)為 Rust 仍然擁有類似于垃圾收集的元素:“引用計(jì)數(shù)”系統(tǒng),這個(gè)系統(tǒng)是內(nèi)存所有權(quán)機(jī)制的一部分。但無(wú)論采用了哪種方式,如今 Rust 的性能確實(shí)提高了,距離硬件越來(lái)越近,就像 C 和 C++ 一樣,同時(shí)也保證了內(nèi)存安全。2012 年,Steve Klabnik 開(kāi)始接觸 Rust 的開(kāi)發(fā)工作,并在之后的十年里負(fù)責(zé)編寫相關(guān)文檔,他表示,刪除垃圾收集后“Rust 變成了一門更精簡(jiǎn)且更有效地語(yǔ)言。”友好的社區(qū)文化
在此過(guò)程中,Rust 社區(qū)建立了一種文化:對(duì)新人異常友好,而且非常開(kāi)放。微軟首席工程師 Nell Shamrell-Harrington 曾在 Mozilla 從事 Rust 的開(kāi)發(fā)工作,她表示:“我們不會(huì)稱任何人為菜鳥(niǎo),沒(méi)有任何問(wèn)題是愚蠢的問(wèn)題。”她說(shuō),部分原因是 Hoare 在很早以前就發(fā)布了“行為準(zhǔn)則”,任何為 Rust 做出貢獻(xiàn)的人都應(yīng)該遵守這些準(zhǔn)則。Rust 社區(qū)成員說(shuō),社區(qū)接受了這套準(zhǔn)則,并且成功地吸引到了很多編程高手加入 Rust。即便程序員犯錯(cuò),編譯器拋出的錯(cuò)誤消息也很友好,不僅描述了錯(cuò)誤,而且還會(huì)就如何修復(fù)禮貌地提出建議。Shamrell-Harrington 說(shuō):“當(dāng)我犯錯(cuò)誤時(shí),C 和 C++ 的編譯器會(huì)讓我覺(jué)得自己是一個(gè)很糟糕的人。而 Rust 編譯器更像是在指導(dǎo)你編寫超級(jí)安全的代碼。”2015 年,該團(tuán)隊(duì)全力以赴最終發(fā)布了 Rust 的“穩(wěn)定”版本。這個(gè)版本非常可靠,可用于為真正的客戶編寫軟件。距離 Rust 歸入 Mozilla 旗下已經(jīng)過(guò)去六年了,在漫長(zhǎng)的開(kāi)發(fā)期間內(nèi),編程人員一直渴望嘗試演示版本,盡管這些版本的表現(xiàn)會(huì)很糟糕,Goregaokar 說(shuō):“編譯器一直在崩潰”。終于是時(shí)候?qū)ⅰ?.0”推向世界了。Walton 記得自己蜷縮著身體坐在電腦前奮戰(zhàn)了幾個(gè)小時(shí)。Klabnik“在過(guò)去兩周內(nèi)寫了大約 45 頁(yè)的文檔,”他回憶道。2015 年 5 月 15 日,他們終于發(fā)布了第一個(gè)版本,眾多 Rust 粉絲聚集在世界各地慶祝。Mozilla 的投資很快開(kāi)始獲得回報(bào)。2016 年,Mozilla 小組發(fā)布了 Servo,這是一款使用 Rust 構(gòu)建的新型瀏覽器引擎。第二年,另一個(gè)小組使用 Rust 重寫了 Firefox 中渲染 CSS 的部分。這一變化給瀏覽器帶來(lái)了明顯的性能提升。此外,Mozilla 還使用 Rust 重寫了處理 MP4 多媒體文件的代碼。很快,Rust 開(kāi)發(fā)人員就聽(tīng)到很多公司都在嘗試他們的新語(yǔ)言。三星公司的程序員告訴在法國(guó) Mozilla 辦公室工作的 Klock,他們已經(jīng)開(kāi)始使用 Rust 語(yǔ)言了。Facebook(現(xiàn)改名為 Meta)使用 Rust 重新設(shè)計(jì)了程序員管理其內(nèi)部源代碼的軟件。Walton 如今在 Meta 工作,他表示:“無(wú)論怎么夸 Rust 的重要性都不為過(guò)。”很快,許多重要軟件的核心部分都開(kāi)始采用 Rust 編寫。2020 年,Dropbox 推出了其“同步引擎”的新版本,他們的工程師也用 Rust 重寫了該引擎。該系統(tǒng)最初是用 Python 編寫的,但現(xiàn)在要處理幾十億個(gè)文件(以及在線同步的數(shù)萬(wàn)億個(gè)文件)。軟件工程師 Parker Timmerman(最近離開(kāi)了 Dropbox)表示,Rust 降低了處理如此復(fù)雜的系統(tǒng)的難度。他說(shuō):“使用 Rust 寫程序很愉快,這門語(yǔ)言太棒了,很有趣。你感覺(jué)自己就像一位魔術(shù)師,使用其他語(yǔ)言時(shí)根本不會(huì)有這樣的感覺(jué)。我們做了一個(gè)很明智的決定,這是一項(xiàng)新技術(shù)。”一些公司發(fā)現(xiàn) Rust 減輕了他們對(duì)內(nèi)存錯(cuò)誤的恐懼,Mara Bos 使用 Rust 重寫了控制無(wú)人機(jī)的軟件,該軟件最初是用 C++ 編寫的。還有一些人感受到放棄垃圾收集的好處了。在 Discord,長(zhǎng)期以來(lái)工程師們一直對(duì) Go 中的垃圾收集器很不滿。他們用 Go 編寫的軟件大約每?jī)煞昼娋托枰獔?zhí)行一次垃圾收集,盡管 Discord 的工程師寫得非常仔細(xì),沒(méi)有垃圾需要收集。2020 年,他們用 Rust 重寫了該系統(tǒng),如今運(yùn)行速度提高了 10 倍。現(xiàn)如今,就連科技巨頭亞馬遜的云計(jì)算平臺(tái) AWS 的高管和工程師也越來(lái)越相信 Rust 可以幫助他們編寫更安全、更快的代碼。Shane Miller 為 AWS 創(chuàng)建了一個(gè) Rust 團(tuán)隊(duì),他表示:“Rust 具有獨(dú)特的優(yōu)勢(shì),可以提供其他語(yǔ)言無(wú)法提供的優(yōu)勢(shì)。Rust 能提供一種語(yǔ)言的多種超能力。”對(duì)這家云計(jì)算巨頭來(lái)說(shuō),最重要的是,一項(xiàng)基于 Rust 代碼的研究發(fā)現(xiàn),Rust 代碼的運(yùn)行效率非常高,其耗電量只有用 Java 編寫的同等程序的一半。Miller 說(shuō):“因此,我可以創(chuàng)建一個(gè)數(shù)據(jù)中心,運(yùn)行 2 倍的工作負(fù)載。或者,只需一半大小的數(shù)據(jù)中心就可以完成同等量的工作,畢竟數(shù)據(jù)中心需要建立在城市中心,不能放到郊區(qū)。”Rust 的成功讓一些長(zhǎng)期貢獻(xiàn)者感到有些緊張。隨著科技巨頭陸續(xù)開(kāi)始采用這種語(yǔ)言,他們對(duì) Rust 產(chǎn)生的影響也越來(lái)越大。這些巨頭公司資金充沛,足夠負(fù)擔(dān)工程師全職開(kāi)發(fā) Rust,實(shí)際上如今 Rust 團(tuán)隊(duì)的幾位領(lǐng)導(dǎo)者就是亞馬遜和微軟的員工。而其他有價(jià)值的貢獻(xiàn)者必須在業(yè)余時(shí)間從事 Rust 的開(kāi)發(fā),比如 Bos 除了運(yùn)營(yíng)她的無(wú)人機(jī)創(chuàng)業(yè)公司外,還需要承擔(dān)華為的 Rust 工作,但作為 Rust 庫(kù)的團(tuán)隊(duì)負(fù)責(zé)人,她的這部分工作并不會(huì)獲得任何酬勞。Bos 表示,這種現(xiàn)象在開(kāi)源項(xiàng)目中很常見(jiàn):大公司有能力更多地參與項(xiàng)目開(kāi)發(fā),他們可以推動(dòng)整個(gè)項(xiàng)目,解決他們關(guān)心的問(wèn)題,但小公司就沒(méi)有這種能力。她說(shuō):“大公司確實(shí)有這樣的一些影響力”。但到目前為止,沒(méi)有任何公司采取任何措施來(lái)敲響警鐘。Klabnik 對(duì)亞馬遜參與 Rust 的開(kāi)發(fā)表示擔(dān)憂,“我擔(dān)心嗎?當(dāng)然擔(dān)心了。我會(huì)覺(jué)得這個(gè)項(xiàng)目比其他項(xiàng)目更糟糕嗎?并不會(huì)。”
基金會(huì)成立,開(kāi)源不再用“愛(ài)”發(fā)電
2021 年,各大科技公司出資成立了一個(gè)非營(yíng)利性 Rust 基金會(huì),以支持志愿者。在 Miller 領(lǐng)導(dǎo)該基金會(huì)的頭兩年里,他們提供了 2 萬(wàn)美元的資助,用于支持希望承擔(dān) Rust 主要功能開(kāi)發(fā)但短期內(nèi)需要資金支持的貢獻(xiàn)者。此外,該基金會(huì)還為托管 Rust 代碼的服務(wù)器提供了資金,并付錢給一家技術(shù)公司,以確保這些服務(wù)器全天候運(yùn)行。Miller 說(shuō),在常見(jiàn)的開(kāi)發(fā)風(fēng)格中,這項(xiàng)工作以前是由“兩名志愿者完成的,他們基本上有 50% 的時(shí)間在待命,其中一名是來(lái)自意大利的學(xué)生。”這種語(yǔ)言的發(fā)展速度非常不可思議。如果說(shuō) Rust 誕生于 2006 年,那么如今即將結(jié)束青春期,走向成熟期。汽車公司正在采用 Rust 來(lái)構(gòu)建運(yùn)行車輛的關(guān)鍵代碼,航空航天公司也在使用這種編程語(yǔ)言。Dropbox 的 Timmerman認(rèn)為:“將來(lái),到處都會(huì)使用 Rust。”微軟高管甚至公開(kāi)表示,他們將使用 Rust 編寫越來(lái)越多的新代碼,而C和C++的使用將越來(lái)越少,最終為零。所有使用 C 和 C++ 編寫的舊代碼不會(huì)消失,會(huì)一直使用,可能會(huì)持續(xù)數(shù)十年。但是,如果 Rust 成為編寫快速和裸機(jī)代碼的常用語(yǔ)言,我們會(huì)逐漸地意識(shí)到,我們的軟件環(huán)境將變得越來(lái)越可靠,不那么容易崩潰,也不至于那么不安全。看到 Rust 如今的發(fā)展,最驚訝的人莫過(guò)于 Hoare 本人。因?yàn)椋霸S多語(yǔ)言都半路夭折了,”他說(shuō)。. 使用語(yǔ)義化標(biāo)簽:盡可能使用語(yǔ)義化標(biāo)簽,這樣可以讓搜索引擎更好地理解你的頁(yè)面結(jié)構(gòu),同時(shí)也更容易閱讀和維護(hù)。
2. 遵循標(biāo)準(zhǔn)結(jié)構(gòu):HTML有一些固定的結(jié)構(gòu),如<head>、<body>等,不要隨意更改它們的順序或忽略它們。
3. 不要濫用標(biāo)簽:避免過(guò)多使用無(wú)意義的標(biāo)簽,如<div>、<span>等,應(yīng)該盡可能使用合適的語(yǔ)義化標(biāo)簽。
4. 標(biāo)簽閉合:HTML標(biāo)簽必須成對(duì)出現(xiàn),即必須有起始標(biāo)簽和結(jié)束標(biāo)簽,確保標(biāo)簽的正確閉合。
5. 屬性使用雙引號(hào):HTML屬性值必須用雙引號(hào)括起來(lái),如< img src="image.jpg">。
6. 避免使用內(nèi)聯(lián)樣式:內(nèi)聯(lián)樣式會(huì)增加HTML文件的大小,而且不利于維護(hù),應(yīng)該將CSS樣式單獨(dú)寫在一個(gè)外部文件中。
7. 避免使用表格布局:表格布局雖然簡(jiǎn)單易用,但是不利于SEO和響應(yīng)式布局,應(yīng)該盡可能使用CSS布局。
8. 圖片添加alt屬性:所有圖片都應(yīng)該添加alt屬性,描述圖片的內(nèi)容,這不僅有助于SEO,還可以提高網(wǎng)站的可訪問(wèn)性。
9. 避免使用過(guò)時(shí)標(biāo)簽和屬性:如<center>、<font>等已經(jīng)被廢棄,不應(yīng)該再使用,應(yīng)該使用CSS來(lái)實(shí)現(xiàn)相應(yīng)的效果。
10. 注釋代碼:注釋代碼可以幫助其他開(kāi)發(fā)人員更好地理解你的代碼,也有助于自己以后維護(hù)代碼。
ython和其他編程語(yǔ)言不同,可選的IDE(編程集成環(huán)境)很多,但很多并不是為中小學(xué)的信息科技教學(xué)設(shè)計(jì)的,鑒于此,作者所在研究團(tuán)隊(duì)根據(jù)一線教學(xué)需求,開(kāi)發(fā)了XEdu信息科技教學(xué)版,集成了教學(xué)中涉及的絕大多數(shù)庫(kù)和模塊,降低了中小學(xué)教師教學(xué)Python的技術(shù)門檻。
近兩年,筆者一直在努力開(kāi)發(fā)一個(gè)名叫“XEdu”的開(kāi)箱即用的人工智能開(kāi)發(fā)工具。為了解決環(huán)境搭建的問(wèn)題,筆者借助Conda(一個(gè)開(kāi)源的軟件包管理系統(tǒng))封裝了一個(gè)綠色軟件,用戶只要一解壓,就擁有了深度學(xué)習(xí)的編程環(huán)境。很多信息科技(技術(shù))教師看到這個(gè)“XEdu一鍵安裝包”后,想到可以用這樣的方法將中小學(xué)常見(jiàn)的Python庫(kù)封裝起來(lái),然后形成一個(gè)定制的教學(xué)環(huán)境,省去維護(hù)上的很多成本。
理由:為什么要定制編程環(huán)境
中小學(xué)新版的信息科技教材幾乎都選擇了Python,Python是一個(gè)開(kāi)源編程語(yǔ)言,擁有很多IDE(編程集成環(huán)境),如IDLE、Anaconda、PyCharm、VSCode、Spyder、Subl i me、Atom和Thonny等,那為什么一線教學(xué)還會(huì)提出定制教學(xué)環(huán)境的需求呢?
1.Python IDE太多導(dǎo)致選擇困難
Python的IDE種類繁多,各有各的特點(diǎn),且功能使用差別較大,教師們難免患上選擇困難癥。IDE本身沒(méi)有優(yōu)劣之分,主要是看用戶需求。高校的數(shù)據(jù)科學(xué)、人工智能課程一般推薦Anaconda,而工程師和程序員往往選擇PyCharm和VSCode。對(duì)于教學(xué)來(lái)來(lái)說(shuō),Jupyter Notebook的文本和代碼相結(jié)合方式特別適合做“學(xué)案”。對(duì)于初學(xué)入門的學(xué)生來(lái)說(shuō),界面簡(jiǎn)潔干凈的Thonny則是最佳選擇。
2.為中小學(xué)設(shè)計(jì)的Python IDE很少
雖然IDE很多,但為中小學(xué)信息科技教學(xué)設(shè)計(jì)的Python IDE很少。中小學(xué)的Python學(xué)習(xí)應(yīng)該聚焦在編程和算法上,而弱化軟件附加的功能。程序員選擇PyCharm和VSCode,是因?yàn)殚_(kāi)發(fā)工程需要項(xiàng)目管理、版本管理方面的功能;而信息科技教學(xué)一般不會(huì)寫很復(fù)雜的代碼,不會(huì)去開(kāi)發(fā)信息系統(tǒng),也不需要太復(fù)雜的輔助工具。
3.庫(kù)環(huán)境管理困難
Python的最大特點(diǎn)是擁有無(wú)窮無(wú)盡的第三方庫(kù)或者模塊,教學(xué)中往往需要用PIP工具安裝各種庫(kù)。因?yàn)閃indows系統(tǒng)不帶完整的編譯工具,對(duì)于一些沒(méi)有預(yù)編譯的庫(kù)或者依賴關(guān)系比較復(fù)雜的庫(kù),往往容易安裝失敗。而信息科技的教學(xué)環(huán)境一般在機(jī)房,如果一開(kāi)始沒(méi)有把可能涉及的庫(kù)都裝好,那么每一次開(kāi)機(jī)都要重新安裝。這不僅需要足夠的網(wǎng)絡(luò)帶寬,還很浪費(fèi)時(shí)間。
因此,一線信息科技教師會(huì)期望有一個(gè)工具,可以將信息科技教學(xué)中常用的庫(kù)文件全部?jī)?nèi)置,并且內(nèi)置Jupyter、Thonny和常見(jiàn)的第三方庫(kù)。只要解壓,就能使用,既方便教師部署機(jī)房環(huán)境,也方便學(xué)生在家自學(xué)。
方案:定制編程環(huán)境的技術(shù)實(shí)現(xiàn)
XEdu之所以能做到將編程環(huán)境打包為一個(gè)文件,是因?yàn)榻柚恕癮nconda”(一個(gè)著名的Python IDE)中的“conda-pack”。顧名思義,“conda-pack”就是一個(gè)環(huán)境打包的工具,其使用的大致步驟如下:
第一步:安裝conda環(huán)境。
下載miniconda安裝包并安裝(https://docs.conda.io/en/latest/miniconda.html#)。
第二步:構(gòu)建一個(gè)新的Python環(huán)境,如筆者取名為“env”的環(huán)境。
在conda的PowerShell Promp(t下面簡(jiǎn)稱為“Prompt”)中輸入conda create-n env python=3.8.3-y
在Prompt中繼續(xù)輸入命令conda activate env,激活環(huán)境“env”。
第三步:安裝所需要的各種庫(kù)文件。
在Prompt中繼續(xù)輸入pip install XEdu-python MMEdu BaseNN BaseDT BaseML BaseDeploy。
在Prompt中繼續(xù)安裝Jupyter和Thonny:pip install jupyter notebook thonny==4.0.0。
以此類推,完成所有的第三方庫(kù)的安裝。
第四步:打包編程環(huán)境。
在Prompt中繼續(xù)輸入conda pack-n env-o env.tar.gz。
由于環(huán)境打包只能是tar.gz格式,對(duì)Windows支持不友好,等待打包完成后,再使用解壓軟件解壓,然后做一些細(xì)節(jié)調(diào)整,最后壓縮成自解壓文件。
第五步:為編程環(huán)境添加啟動(dòng)腳本文件。
要想激活這個(gè)Python環(huán)境,還需要在命令行中執(zhí)行env\Scripts\activate.bat,為了讓學(xué)生有更好的體驗(yàn),可以把這個(gè)命令行指令封裝成為啟動(dòng)腳本文件。
封裝的IDLE啟動(dòng)腳本文件,如圖1所示。同樣,可以封裝出啟動(dòng)CMD腳本,如圖2所示。
對(duì)Thonny和Jupyter Notebook的啟動(dòng),需要稍做一些處理,以避免和計(jì)算機(jī)上已經(jīng)安裝的舊環(huán)境產(chǎn)生沖突。具體的腳本內(nèi)容有點(diǎn)長(zhǎng),這里略過(guò)。
第六步:壓縮為自釋放文件。
利用7zip、WinRAR等工具,將整個(gè)目錄打包為自解壓文件。
實(shí)踐:以XEdu為模板設(shè)計(jì)信息科技教學(xué)版本
在明確了定制編程環(huán)境的方案后,核心的工作就是確定需要預(yù)裝哪些庫(kù)。
考慮到XEdu的定位是人工智能教育的工具包,那么XEdu-Python、MMEdu、BaseDT、BaseNN、BaseML和BaseDeploy是必備的核心庫(kù)。因?yàn)橐蕾囮P(guān)系,在安裝這些庫(kù)時(shí)會(huì)自動(dòng)安裝另外一些庫(kù),如opencv-python、numpy、pandas、matplotlib、scikit-learn、pillow、requests、onnxruntime和tqdm等。
上面列出的庫(kù),已經(jīng)覆蓋了絕大多數(shù)信息科技教材涉及的庫(kù)。考慮到不可能將全國(guó)的教材都全部整理一遍,因此筆者以浙江教育出版社的高中教材和清華大學(xué)出版社的初中教材為主,又加入了如下一些庫(kù):pyinstaller、flask、pyautogui、pypinyin、gradio、tkinter、wordcloud、jieba、pywebio、pyttx3、pinpong、pysmplegui、remi、turtle等。
此外,筆者認(rèn)為需要規(guī)范學(xué)生的代碼和相關(guān)文件存放習(xí)慣,于是梳理了文件目錄。如圖3所示,其中checkpoints是存放AI訓(xùn)練的權(quán)重文件的,dataset是存放數(shù)據(jù)集的,EasyDL是簡(jiǎn)易深度學(xué)習(xí)軟件系列,env是Python的運(yùn)行環(huán)境和庫(kù)文件,utils是一些可能需要的內(nèi)置功能,XEdu示例代碼是XEdu系列人工智能教學(xué)所需的代碼文件,教學(xué)資源則供教師存放各種配套的資源。
反饋:來(lái)自一線教師的測(cè)試和評(píng)價(jià)
筆者將這個(gè)解壓就可以使用的Python編程環(huán)境,命名為“XEdu信息科技教學(xué)版”,并提供給身邊熟悉的信息技術(shù)教師使用。目前得到了不錯(cuò)的使用反饋,尤其是兼容性很好,在Win7(64位)系統(tǒng)上運(yùn)行正常。
這一編程環(huán)境不僅可以用于信息科技教學(xué),還可以用于人工智能科創(chuàng)活動(dòng)。針對(duì)部分教師給出的反饋,需要讓Jupyter Notebook支持中文,筆者在Jupyter Notebook的啟動(dòng)腳本中增加了“set.UTF8”,同時(shí)再次修改了一些細(xì)節(jié),包括去除thonny文件的標(biāo)語(yǔ)等。
總結(jié):幸福都是奮斗出來(lái)的
當(dāng)完成這個(gè)“XEdu信息科技教學(xué)版”后,筆者心情特別好,因?yàn)榻處焸冋莆樟私鉀Q方案和技術(shù)后,編程環(huán)境完全可以根據(jù)自己的需求來(lái)定制。信息科技教師的幸福要由自己來(lái)掌握。
本文作者:
謝作如
溫州科技高級(jí)中學(xué)
邱奕盛
華東師范大學(xué)教育信息技術(shù)學(xué)系/上海數(shù)字化教育裝備工程技術(shù)研究中心
文章刊登于《中國(guó)信息技術(shù)教育》2023年第19期
引用請(qǐng)注明參考文獻(xiàn):
謝作如,邱奕盛.為信息科技教學(xué)定制一個(gè)Python編程環(huán)境[J].中國(guó)信息技術(shù)教育,2023(19):82-84.