小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

博采 27 門語言之長,提升 Python 的能力

 黃爸爸好 2021-12-21

來源丨經(jīng)授權(quán)轉(zhuǎn)自Python貓(ID:python_cat)

Python貓注:Python 語言誕生 30 年了,如今的發(fā)展勢頭可謂如火如荼,這很大程度上得益于其易學易用的優(yōu)秀設(shè)計,而不可否認的是,Python 從其它語言中偷師了不少。本文作者是一名資深的核心開發(fā)者,他廣博的視野和精準的認識,讓我對 Python 的設(shè)計了解得更為全面,同時,他“利用自豪感而非恐懼感”的說法,傳達出來的是“專注于自我的進步,不嫉妒他人的成功”的原則,對我也很有幫助。原文寫于 2015 年,躺在我的收藏夾里很久很久了,如今順利翻譯掉,這是一件能提升自豪感的有意義的事。最后祝大家開卷有益,讀有所獲。


作者:Nick Coghlan
譯者:豌豆花下貓@Python貓
英文:https://www./posts/2015/10/languages-to-improve-your-python.html
聲明:本翻譯是出于交流學習的目的,基于 CC BY-NC-SA 4.0 授權(quán)協(xié)議。為便于閱讀,內(nèi)容略有改動。

目錄

  • 拓寬我們的視野
  • 過程式編程:C、Rust、Cython
  • 面向?qū)ο蟮臄?shù)據(jù)模型:Java、C#、Eiffel
  • 面向?qū)ο蟮?C 派生:C++、D
  • 面向數(shù)組的數(shù)據(jù)處理:MATLAB/Octave、Julia
  • 統(tǒng)計數(shù)據(jù)分析:R
  • 計算管道建模:Haskell、Scala、Clojure、F#
  • 事件驅(qū)動編程:JavaScript、Go、Erlang、Elixir
  • 漸變類型:TypeScript
  • 動態(tài)元編程:Hy、Ruby
  • 務(wù)實問題解決:Lua、PHP、Perl
  • 編程思維:Scratch、Logo

作為世界上最流行的編程語言之一的共同設(shè)計者,我經(jīng)??吹揭粋€令人沮喪的行為(在 Python 社區(qū)和其它社區(qū)):有影響力者試圖激發(fā)人們對“敗給”其它開源社區(qū)的恐懼,從而調(diào)動人們對社區(qū)作貢獻的積極性。(我自己偶爾也會犯這種錯誤,這讓我更容易發(fā)現(xiàn)其他人是否也落入了同樣的陷阱)。

雖然學習其它編程語言社區(qū)的經(jīng)驗是件好事,但基于恐懼的方法來激勵行動是有嚴重問題的,因為這會刺激本社區(qū)成員將其它社區(qū)的人視為爭奪開源貢獻者關(guān)注的敵人,而不是作為在更大挑戰(zhàn)中的潛在盟友(推動軟件開發(fā)藝術(shù)發(fā)展)。這還會告訴那些喜歡其它語言的人,在一個把他們以及他們的同伴視為“敵對競爭對手”的社區(qū)里,他們是不受歡迎的。

事實上,我們希望有多種多樣的跨平臺的開源編程語言供選擇,因為編程語言是思考的首要工具——使我們能夠以明確的方式表達我們的想法,從而讓計算機也能夠理解。如果有人找到了一種適合大腦的語言,能夠解決眼前的問題,那就太好了,不管他們選擇的是哪種(些)語言。

因此,我對 Python 社區(qū)有三個具體的請求,以及一個較為寬泛的建議。首先,我的請求是:

  1. 如果我們要利用社區(qū)的本能來激勵行動,就應(yīng)該避免利用恐懼感,而應(yīng)該利用自豪感。 當我們將恐懼作為激勵因素時,就像在說“如果我們不做 X,就會失去開發(fā)者對 Python 的關(guān)注”,這等于是故意地在自由的開源貢獻者中創(chuàng)造悲觀的情緒。然而,依賴社區(qū)的自豪感就像在說“目前尚不清楚如何在 Python 中解決 X 問題。如果我們看看 Y 語言,就可以看到他們有一個非常好的方法來解決問題 X,我們可以吸收進 Python,以提供類似的舒適的用戶體驗?!狈e極的態(tài)度讓我們對自己的努力感到自豪,而不是貶低他人的努力,這有助于在 Python 社區(qū)內(nèi)促成一種持續(xù)學習的文化,并促進與其它社區(qū)改善協(xié)作關(guān)系,共同發(fā)展。

  2. 克制對其它開源編程語言社區(qū)采取輕蔑的態(tài)度,尤其當這些社區(qū)授權(quán)人們解決自己的問題,而不是等待商業(yè)軟件供應(yīng)商來解決問題。 世界上大多數(shù)重要的問題解決起來都是無利可圖的(因為受苦于這些問題的人并不富裕,而且無法左右機構(gòu)基金的決定),所以我們應(yīng)該鼓勵試圖解決這些問題的人,不管我們?nèi)绾慰创麄兊募夹g(shù)選擇。

  3. 如果我們認識的人剛開始學習編程,并且他們選了一種我們不喜歡的語言,我們應(yīng)該支持他們的選擇。 他們比我們更知道什么適合自己,適合我們的語言不一定適合他們。如果他們對自己最初的選擇感到了沮喪,甚至已經(jīng)對學習編程變得沒有動力,此時再給他們推薦別的編程語言。這個建議還適用于那些在改善糟糕的網(wǎng)絡(luò)安全狀況的人:我們在面對天生不安全的語言時,采取的方法是改進操作系統(tǒng)的沙箱功能,逐步學習有更好的本地安全屬性的語言,并改善現(xiàn)有語言的默認行為,而不是列舉為什么從程序安全性的角度來看,他們選擇的語言是一個糟糕的選擇,來迷惑初學者。(如果有人部署了由初學者編寫的未經(jīng)審核的軟件來處理安全敏感的任務(wù),那就不是開發(fā)者的問題,而且部署者的問題,他們沒有對軟件的出處和安全屬性進行適當?shù)谋M職調(diào)查。)

我的寬泛的建議針對那些遇到了 Python 核心程序的限制,并因此希望探索 Python 中可用的“思考工具”的人。這個建議就是:

拓寬我們的視野

在開發(fā) Python 核心程序的過程中,我們會做的一件事是查看其它語言中解決了我們正面臨的問題的特性,看看是否有辦法既吸收它們,又使 Python 代碼更易于閱讀和編寫。這意味著學習其它專注于特定軟件開發(fā)風格的編程語言,可以幫助我們在使用 Python 時,提高對這種編程風格的理解。

為了提供幫助,我在下面列出了一些值得探索的領(lǐng)域,以及可能加深對這些領(lǐng)域的理解的語言。我盡可能鏈接了維基百科的頁面,而不是直接鏈接到語言的主頁,因為維基百科經(jīng)常會提供有趣的歷史背景,當你為了教育目的學習一門新的編程語言,而不是直接用于實際應(yīng)用時,這些背景值得去了解。

雖然我知道這些語言中的大部分(并且在開發(fā)生產(chǎn)系統(tǒng)時使用過幾種),但這份推薦清單中還包括我間接知道的語言(通常是通過閱讀教程和設(shè)計文檔,或者通過與我信任的人交談,以獲取對一門語言的優(yōu)點與缺陷的洞察)。

還有很多本應(yīng)該放但沒有放進名單里的語言語言,所以下面羅列的僅是我感興趣的部分(例如,我主要感興趣的是 Linux、Android 和 Windows 的生態(tài)系統(tǒng),所以我舍棄了 Apple 生態(tài)中的 Objective-C 和 Swift 語言,另外我也不熟悉 Processing 這種專注于藝術(shù)的編程語言,無法想象學習它們能教給 Python 開發(fā)者什么)。

除了考慮一門語言可能教給你的東西,如果你想獲得一份更全面的清單,可以去查看 IEEE Spectrum 關(guān)于編程語言流行度和增長度的年度榜單。

過程式編程:C、Rust、Cython

Python 默認的執(zhí)行模型是過程式的:從主模塊的頂部開始,逐條語句地執(zhí)行。Python 對下面介紹的所有數(shù)據(jù)和編程建模方法的支持,都建立在這種過程式的執(zhí)行模型上。

C 語言仍然是無可爭議的底層過程式編程的統(tǒng)治者。它是 Python 官方解釋器以及 Linux 操作系統(tǒng)內(nèi)核的核心實現(xiàn)語言。作為一名軟件開發(fā)人員,學習 C 語言是更多地了解底層硬件的最好方法之一——C 語言經(jīng)常被稱為“可移植的匯編語言”,對于任何新的 CPU 架構(gòu)來說,第一個交叉編譯的應(yīng)用程序?qū)⑹?C 編譯器。

Rust 是一種相對較新的編程語言,由 Mozilla 創(chuàng)造。Rust 的目標是吸取整個行業(yè)在不使用 C 時遇到的所有教訓,設(shè)計一門能與 C 庫相互操作的新語言,提供底層的系統(tǒng)編程所需的對硬件用途的精確控制,但使用不同的編譯方法來進行數(shù)據(jù)建模和內(nèi)存管理,從結(jié)構(gòu)上消除許多困擾 C 程序的常見缺陷(如緩沖區(qū)溢出、指針重復釋放錯誤、空指針訪問和線程同步問題)。經(jīng)過培訓和早期的專業(yè)經(jīng)驗,我是一名嵌入式系統(tǒng)工程師,而 Rust 是我見過的第一種看起來有潛力縮減當前由 C 語言和自定義匯編代碼所主導的生態(tài)位的新語言。

Cython 也是一種較底層的過程式語言,但與 C 和 Rust 等通用語言不同,Cython 專門用于編寫 CPython 的擴展模塊。為了實現(xiàn)這一目標,Cython 被設(shè)計為 Python 的超集,允許程序員選擇何時支持純 Python 語法以獲得靈活性,何時支持 Cython 的語法擴展,以便生成在速度和內(nèi)存效率方面能與原生 C 代碼相當?shù)拇a。

學習這些語言,你可以加深在內(nèi)存管理、算法效率、二進制接口(ABI)兼容性、軟件可移植性、以及將源代碼轉(zhuǎn)換為運行系統(tǒng)等實踐方面的見解。

面向?qū)ο蟮臄?shù)據(jù)模型:Java、C#、Eiffel

編程最主要做的事情之一是為現(xiàn)實世界建模,最流行的做法是提供原生的語法支持面向?qū)ο缶幊蹋簩?shù)據(jù)作結(jié)構(gòu)化的分組,使用類方法操作那些數(shù)據(jù)結(jié)構(gòu)。

Python 本身是經(jīng)過精心設(shè)計的,無需先編寫自己的類就可以使用面向?qū)ο蟮奶匦?。并不是每種語言都采用這種方法——本小節(jié)中列出的語言都認為學習面向?qū)ο笤O(shè)計是使用該語言的必要條件。

在 20 世紀 90 年代中后期,Sun Microsystems 公司進行了一次大規(guī)模的市場推廣,Java 成為了許多高等院校中計算機科學入門課的默認語言。雖然如今在許多教學活動中,Java 已經(jīng)被 Python 所取代,但它仍然是開發(fā)商用程序時最流行的語言之一。還有一些基于通用 JVM(Java 虛擬機)運行時的語言,例如 Python 的 Jython 實現(xiàn)。Android 系統(tǒng)的 Dalvik 和 ART 環(huán)境則是基于 Java 開放的 API 二次開發(fā)。

C# 在許多方面與 Java 相似,在 Sun 和微軟未能解決他們關(guān)于微軟的 Java 實現(xiàn)(即 J++)的業(yè)務(wù)差異之后,C# 成為了一種替代方案。像 Java 一樣,這是一門開發(fā)商用程序的流行語言,還有其它一些語言共享著 .NET CLR(公共語言運行時),包括 Python 的 IronPython 實現(xiàn) (最早的 IronPython 1.0 的核心組件被提取成了與語言無關(guān)的 .NET 動態(tài)語言運行庫)。在很長一段時間里,. NET 是一種專用于 Windows 的技術(shù),而 mono 作為一種跨平臺的開源實現(xiàn),但微軟在 2015 年初轉(zhuǎn)向了開源生態(tài)系統(tǒng)戰(zhàn)略。

與此清單中的大多數(shù)語言不同,我不推薦在日常工作中使用 Eiffel。但是,我依然推薦學習它,因為它教會了我許多關(guān)于良好的面向?qū)ο笤O(shè)計的知識,比如它認為“可驗證的正確性”是應(yīng)用程序的設(shè)計目標。(學習 Eiffel 也讓我明白了為什么“可驗證的正確性”并不是大多數(shù)軟件開發(fā)時的設(shè)計目標,因為可驗證的正確軟件實在不能很好地處理模糊性,并且完全不適用于那些你不清晰相關(guān)的約束條件卻需要給自己留下足夠的回旋余地,以便能夠通過迭代開發(fā)找出更具體的細節(jié)的情況。)

學習這些語言,你可以深入了解繼承模型、契約式設(shè)計、類不變性(class invariant)、前置條件、后置條件、協(xié)方差、逆變、類方法解析順序、泛型編程以及其它適用于 Python 類型系統(tǒng)的概念。還有很多標準庫模塊和第三方框架使用這種“看得見的面向?qū)ο蟆钡脑O(shè)計風格,比如 unittest 和 logging 模塊,以及 Django 框架中基于類的視圖。

面向?qū)ο蟮?C 派生:C++、D

CPython 運行環(huán)境可以被視為一個“帶有對象的 C”的編程環(huán)境——在其核心,CPython 使用 C 的方法實現(xiàn)面向?qū)ο缶幊蹋炊x C 結(jié)構(gòu)體來保存相關(guān)的數(shù)據(jù),并將結(jié)構(gòu)體的實例作為第一個參數(shù)傳遞給函數(shù),然后對數(shù)據(jù)進行操作(這就是 CPython C API 中全能的 PyObject * 指針)。這種設(shè)計模式對應(yīng)到 Python 層面,就是實例方法的顯式 self 參數(shù)以及類方法的顯式 cls 參數(shù)。

C++ 的目標是保持與 C 語言源代碼的完全兼容,同時添加更高級的特性,例如支持原生的面向?qū)ο缶幊毯突谀0宓脑幊?。它是出了名的冗長和難以編程(盡管 2011 年對語言標準的更新解決了許多糟糕的問題),但它也是許多領(lǐng)域的編程首選,包括 3D 建模的圖形化引擎和跨平臺應(yīng)用的開發(fā)框架(例如 Qt)。

D 語言也很有趣,因為它與 C++ 的關(guān)系類似于 Rust 與 C 的關(guān)系:它的目標是保留 C++ 的大多數(shù)令人滿意的特性,同時也避免它的許多問題(如缺乏內(nèi)存安全)。不像 Rust,D 不是一種從頭開始設(shè)計的新編程語言——恰恰相反,D 是 C++ 的衍生物,雖然它不像 C++ 一樣是一個嚴格的 C 超集,但它遵循著一個設(shè)計原則,即任何落入 C 和 D 的共同子集的代碼,在兩種語言中必須要表現(xiàn)一致。

學習這些語言,你可以更深入地了解將高級語言的特性與底層 C 運行時模型相結(jié)合的復雜性。學習 C++,在 Python 中操作用 C++ 編寫的庫和工具包時,也可能會有幫助。

面向數(shù)組的數(shù)據(jù)處理:MATLAB/Octave、Julia

面向數(shù)組的編程是為了支持數(shù)值編程模型:那些基于矩陣代數(shù)和相關(guān)數(shù)值方法的模型。

雖然 Python 的標準庫不直接支持這一點,但 Python 在設(shè)計時考慮了面向數(shù)組的編程,并專門為第三方 NumPy 庫和類似的面向數(shù)組的工具添加了一系列語法和語義特性。

在許多方面,Python 的科學技術(shù)棧 被作為商業(yè) MATLAB 的替代方案,后者被廣泛用于科學和工程領(lǐng)域的建模、仿真和數(shù)據(jù)分析。GNU Octave 是一個開源的方案,目標是兼容 MATLAB 代碼的語法,允許人們對照這兩種面向數(shù)組的編程方法。

Julia 是另一種相對較新的語言,重點關(guān)注面向數(shù)組的編程和基于類型的函數(shù)重載。

學習這些語言,你可以了解 Python 的科學技術(shù)棧,以及有機會通過像 OpenCL 和 Nvidia 的 CUDA 這種技術(shù)來探索硬件層面的并行執(zhí)行,并通過 Apache Spark 和專用于 Python 的 Blaze 來了解分布式數(shù)據(jù)處理。

統(tǒng)計數(shù)據(jù)分析:R

隨著對大型數(shù)據(jù)集的接觸越來越多,對靈活處理這些數(shù)據(jù)集的分析工具的需求也越來越大。R 編程語言就是這樣的工具,它特別關(guān)注統(tǒng)計性的數(shù)據(jù)分析和可視化。

學習 R 能會讓你深入了解 Python 在科學技術(shù)棧的統(tǒng)計分析能力,尤其是 pandas 數(shù)據(jù)處理庫和 seaborn 統(tǒng)計可視化庫。

計算管道建模:Haskell、Scala、Clojure、F#

面向?qū)ο蟮臄?shù)據(jù)建模和面向數(shù)組的數(shù)據(jù)處理主要關(guān)注靜態(tài)的數(shù)據(jù),無論是以命名的屬性形成集合的形式,還是以結(jié)構(gòu)化數(shù)據(jù)形成數(shù)組的形式。

相比之下,函數(shù)式編程語言強調(diào)以計算流的形式對動態(tài)數(shù)據(jù)進行建模。即便只學習函數(shù)式編程的基本知識,也能極大地改進數(shù)據(jù)轉(zhuǎn)換操作的結(jié)構(gòu),即使在其它過程式、面向?qū)ο蠡蛎嫦驍?shù)組的程序中也是如此。

Haskell 是一種函數(shù)式編程語言,對 Python 的設(shè)計產(chǎn)生了重大影響,最顯著的是在 Python 2.0 中引入的列表推導式。

Scala 是一種(存疑的)JVM 函數(shù)式編程語言,加上 Java、Python 和 R,它們是 Apache Spark 數(shù)據(jù)分析平臺的四種主要編程語言。盡管 Scala 的設(shè)計偏重于函數(shù)式編程,但它的語法、數(shù)據(jù)模型和執(zhí)行模型的設(shè)計也最大限度地降低 Java 程序員使用的門檻(因此所謂“存疑的”——其實是因為,Scala 最好被歸類為一門具有強函數(shù)式編程支持的面向?qū)ο缶幊陶Z言)。

Clojure 是另一種基于 JVM 的函數(shù)式編程語言,是 Lisp 的一種方言。它之所以出現(xiàn)在這份清單里,因為它是 Python 的 toolz 函數(shù)式編程工具包的靈感來源。

F# 不是我自己特別熟悉的語言,但它作為 .net CLR(公共語言運行時)推薦的函數(shù)式編程語言,所以還是值得關(guān)注。

學習這些語言,你可以深入了解 Python 自己的計算管道建模工具,包括容器推導式、生成器、生成器表達式、functools 和 itertools 標準庫,以及第三方的 Python 函數(shù)工具包,比如 toolz。

事件驅(qū)動編程:JavaScript、Go、Erlang、Elixir

計算管道是處理數(shù)據(jù)轉(zhuǎn)換和分析問題的一種極佳的方法,但許多問題需要程序作為持久性服務(wù)運行,等待事件發(fā)生,然后處理那些事件。在這類服務(wù)中,為了能夠同時容納多個用戶(或多個操作),通常必須要并發(fā)地處理多個事件。

JavaScript 最初是作為 Web 瀏覽器的事件處理語言而開發(fā)的,允許網(wǎng)站開發(fā)者在本地響應(yīng)客戶端操作(如鼠標點擊和按鍵敲擊)和事件(如網(wǎng)頁完成了渲染)。所有現(xiàn)代瀏覽器都支持它,它與 HTML5 領(lǐng)域?qū)ο竽P停―OM)一起,已經(jīng)成為一種定義用戶界面外觀和行為的事實上的標準。

Go 是谷歌設(shè)計的一種用于創(chuàng)建高度可伸縮的 Web 服務(wù)的專用語言,并且已經(jīng)被證明是一種非常適合開發(fā)命令行應(yīng)用程序的語言。從編程語言設(shè)計的角度來看,Go 最有趣的方面是在其核心并發(fā)模型中使用了通信順序進程(Communicating Sequential Processes)概念。

Erlang 是由愛立信設(shè)計的專用語言,用于創(chuàng)建高度可靠的電話交換機以及類似的設(shè)備。它被用于開發(fā)出了流行的 RabbitMQ 消息代理中間件。Erlang 使用 Actor 模型作為核心的并發(fā)原語,在執(zhí)行線程之間傳遞消息,而不是讓它們直接共享數(shù)據(jù)。雖然我從未用過 Erlang 編程,但我的第一份全職工作涉及一個基于 Actor 的 C++ 并發(fā)框架,而該框架由一名前愛立信工程師開發(fā),另外,我自己也開發(fā)了一個這樣的框架,基于德州儀器(Texas Instrument)的輕量級 DSP/BIOS 運行時(現(xiàn)在的 TI-RTOS)里面的 TSK (Task)和 MBX (Mailbox)原語。

Elixir 出現(xiàn)在這份清單里,因為它被設(shè)計運行在 Erlang VM 上,提供了與 Erlang 相同的并發(fā)語義,同時還提供了一系列在語言層面上的特性,打造出一個更加全面的環(huán)境,更有可能吸引其它語言例如 Python、Java 或 Ruby 的開發(fā)者。

學習這些語言,你可以深入了解 Python 對并發(fā)和并行的支持,包括原生協(xié)程、基于生成器的協(xié)程、concurrent.futures 和 asyncio 標準庫模塊、第三方網(wǎng)絡(luò)服務(wù)開發(fā)框架(如 twisted 和 Tornado)、Django 中引入的 channel 概念、GUI 框架中的事件處理循環(huán)。Python進階

漸變類型:TypeScript

在 Python 3.5 中出現(xiàn)的一個比較有爭議的特性是新引入的 typing 模塊,它為 Python 生態(tài)帶來了一個支持漸變類型的標準詞典。

Python貓注:Gradual typing 是 Jeremy Siek 和 Walid Taha 在 2006 年提出的理論,允許程序中同時出現(xiàn)動態(tài)類型與靜態(tài)類型。國內(nèi)有人將其翻譯為“漸進類型”、“漸近類型”、“漸進定型”、“動靜混合類型”等等,但我覺得并不夠好。漸變類型也許是我的首創(chuàng),借鑒自 Photoshop 的漸變顏色,表達出從動態(tài)類型到靜態(tài)類型的過渡(或者說交融共處的)特點?!皾u變”一詞有打破界限分明的狀態(tài)(如大小、遠近、明暗),從而達到中和狀態(tài)的含義。

對于那些主要從 C、C++ 和 Java 等語言中接觸靜態(tài)類型的人來說,這似乎是一個令人吃驚的糟糕特性(因此引發(fā)了爭議)。

微軟的 TypeScript 為 Javascript 程序提供了漸變類型,因此它能更好地解釋這個概念。TypeScript 代碼會被編譯成 JavaScript 代碼(然后就不包含運行時類型檢查),流行的 JavaScript 庫的 TypeScript 注解會維護在專用的 DefinitelyTyped 倉中。

正如 Chris Neugebauer 在澳大利亞 PyCon 演講 中指出的,這很像是 Python 與 typeshed 類型提示庫、以及像 mypy 這種類型推斷和分析工具之間的關(guān)系。

在本質(zhì)上,TypeScript 和 Python 中的類型提示都是編寫特定種類的測試的方式,要么使用單獨的文件(就像普通測試一樣),要么嵌入在代碼體中(就像靜態(tài)類型語言中的類型聲明一樣)。對于這兩種情況,你都要運行一個單獨的命令,來檢查其余代碼是否與已添加的類型斷言一致(對于 TypeScript,這是在編譯成 JavaScript 時隱式地發(fā)生的;對于 Python 的類型提示,這是一個完全可選的靜態(tài)分析任務(wù))。

動態(tài)元編程:Hy、Ruby

C、C++、C# 和 Java 等語言的學習者在接觸 Python 時,經(jīng)常感到不安的一個特性是“代碼即數(shù)據(jù)”(code is data):函數(shù)和類之類的東西是運行時對象,可以像其它對象一樣被操縱。

Hy 是一種 Lisp 方言,可以同時在 CPython VM 和 PyPy VM 上運行。Lisp 及其方言將“代碼即數(shù)據(jù)”的概念推到了極致,因為 Lisp 代碼由嵌套列表組成,這些列表描述了要執(zhí)行的操作(這門語言的名稱本身就代表列表處理器“LISt Processor”)。Lisp 風格語言的強大之處在于,它讓你非常容易編寫出自己的領(lǐng)域特定代碼。Lisp 風格語言的最大缺點是,它讓你非常容易編寫出自己的領(lǐng)域特定代碼,但這可能導致每個人寫的代碼變得難以閱讀。

Ruby 語言在許多方面與 Python 相似,但對于 Python 中“支持但不鼓勵”的動態(tài)元編程特性,Ruby 社區(qū)則相對開放。這包括在已有類定義中添加新的方法,以及使用閉包來實現(xiàn)語言的核心結(jié)構(gòu),例如迭代。(Python貓注:關(guān)于兩種語言中迭代結(jié)構(gòu)的實現(xiàn)對比,可閱讀 這篇文章

學習這些語言,可以讓你深入了解 Python 自己的動態(tài)元編程特性,包括函數(shù)和類裝飾器、猴子補丁、unittest.mock 標準庫、以及像 wrapt 這樣的第三方對象代理模塊。(我不知道學習哪種語言可以深入了解 Python 的元類系統(tǒng),如果有人在這方面有任何建議,請在評論中告知我。Python 的元類驅(qū)動著很多特性,例如核心的類型系統(tǒng)、抽象基類、枚舉類型和漸變類型表達式的運行時求值。)

務(wù)實問題解決:Lua、PHP、Perl

主流的編程語言并不是孤立存在的——它們作為一個更大的生態(tài)系統(tǒng)的一部分而存在,這個生態(tài)系統(tǒng)由發(fā)行者(企業(yè)和社區(qū)組織)、終端用戶、框架開發(fā)者、工具開發(fā)者、教育工作者等等組成。

Lua 是一種流行的編程語言,作為一種腳本引擎嵌入到大型程序中。標志性的例子是它被魔獸世界游戲用來編寫客戶端插件,它也被嵌入到了許多 Linux 發(fā)行版所使用的 RPM 組件中。與 CPython 相比,Lua 運行時的大小通常只有 CPython 的十分之一,而且由于較弱的自省能力,它更容易與程序的其它部分以及服務(wù)器的操作系統(tǒng)隔離開來。Lua 社區(qū)對 Python 生態(tài)的一個顯著貢獻是 LuaJIT FFI(Foreign Function Interface 外來函數(shù)接口),它被 CPython 和 PyPy 采用,作為支持 JIT 的 cffi 接口庫的基礎(chǔ)。

PHP 是另一種流行的編程語言,作為 Linux-Apache-MySQL-PHP LAMP 技術(shù)棧中的“P”而崛起,因為它專注于生成 HTML 頁面,并且在早期的虛擬專用服務(wù)器(Virtual Private Server,簡稱 VPS) 提供商中廣泛使用。盡管其設(shè)計上有諸多的概念性缺陷讓人感到絕望,但它如今是幾個極其流行的開源 Web 服務(wù)的基礎(chǔ),包括 Drupal 內(nèi)容管理系統(tǒng)、Wordpress 博客引擎和維基百科的 MediaWiki 引擎。PHP 還支撐著一些重要的服務(wù),比如 Ushahidi 平臺,它是一個開源的社會化新聞發(fā)布社區(qū)。

像 PHP 一樣,Perl 也是基于 Linux 而崛起。但跟 PHP 專門作為 Web 開發(fā)平臺不同,Perl 是系統(tǒng)管理員的工具,在基于文本的 Linux 操作系統(tǒng)中,它使用正則表達式將命令的輸出轉(zhuǎn)成字符串,并進行操作。當 sh、awk 和 sed 都無法勝任某些任務(wù)時,Perl 出現(xiàn)并派上了用場。

學習這些語言,在編程語言設(shè)計方面,不大可能獲得什么漂亮審美或者優(yōu)雅概念。學習它們,最可能的是了解編程語言在現(xiàn)實中是如何被分發(fā)和采用的,以及這些在多大程度上取決于偶然的機會、歷史意外事件、以及發(fā)行商在系統(tǒng)中默認集成而降低了使用門檻,而不是取決于語言本身固有的能力。

特別是,它可以提供對以下項目的重要性的洞察:CKAN、OpenStack NFV、Blender、SciPy、OpenMDAO、PyGMO、PyCUDA、樹莓派基金會和 Python 被大量商業(yè)組織采用,以保護它們在 Python 生態(tài)中不斷的投入。

編程思維:Scratch、Logo

我經(jīng)常跟函數(shù)式編程以及面向?qū)ο缶幊痰膿碜o者們討論,他們聲稱這類語言就像過程式語言一樣易于學習。

如果我們談?wù)摰氖峭ㄟ^嵌入式編程(例如機器人)進行教學,在軟件中建模的對象都有現(xiàn)實世界的對應(yīng)物,比如學生們可以觸摸的傳感器、馬達和繼電器,那么,那我會認為 OOP 的人有一定的道理。

但是對于其他人,我現(xiàn)在有一個標準的挑戰(zhàn):拿起一本烹飪書,把其中一個食譜翻譯成你認為是容易學習的編程語言,然后找一個能理解烹飪書中語言的學生,讓其按照翻譯好的食譜操作。其實,他們不需要真正地操作下去——只需做一個思想實驗,就足以意識到他們聲稱的“很容易學”是假設(shè)了多少先驗知識。(我很期待看到學術(shù)研究人員在現(xiàn)實中做這種研究——我真的很希望看到結(jié)果)

另一種解決這個問題的方法是去學習那些實際上被用來教孩子們編程思維的語言。

其中最受歡迎的是 Scratch,它使用了拖放編程界面,讓學生們操縱一個獨立的圖形環(huán)境,它里面的電子圖形可以移動,并響應(yīng)環(huán)境中的事件。像 Scratch 這樣的圖形環(huán)境就相當于我們用來教孩子閱讀和書寫的圖畫書。

使用特殊的教育語言來操作圖形環(huán)境的想法并不新鮮,最早的例子之一是 1960 年代發(fā)明的 Logo 環(huán)境。在 Logo 中(以及類似的環(huán)境,如 Python 的 turtle 模塊),你主要打交道的是一個“烏龜(turtle)”,你可以通過繪制線條來指導它移動和修改環(huán)境。這樣的話,命令序列、重復和狀態(tài)(例如,“起筆”、“落筆”)可以基于人們的自然直覺來使用(“想象你是那只烏龜,如果你右轉(zhuǎn) 90 度會發(fā)生什么?”)

回顧并重新學習這些語言,有助于有經(jīng)驗的程序員放下固化的觀念:它們所用的概念可以提醒我們,這些概念是我們?nèi)缃裾J為理所當然的,但初學者們需要先學習。當這樣做的時候,我們能夠更好地與學生和其他初學者們相處,因為我們更有可能打開邏輯的枷鎖,也不會再忽略那些有必要的學習步驟。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多