27 種語言
作為這個世界上最流行的編程語言之一的合作設(shè)計者,,我經(jīng)常遇到一種令人非常沮喪的行為( Python 社區(qū)和其它領(lǐng)域中都存在)就是社區(qū)中有影響力的人嘗試去在其它開源社區(qū)中灌輸對于”缺失“的恐懼感,并以此驅(qū)動別人對本社區(qū)做出貢獻(我自己偶爾也會做出這樣不當?shù)男袨?,當別人掉進這個陷阱時我也更容易覺察出來),。 雖然借鑒其他編程語言社區(qū)的經(jīng)驗是一件好事,但用基于恐懼的方法來推動行動有很大問題,,社區(qū)成員為了吸引代碼貢獻者的注意,,容易把其他社區(qū)的成員視為競爭對手,而不是作為潛在的盟友共同迎接挑戰(zhàn),,推動軟件開發(fā)技術(shù)的進步,。還會導(dǎo)致社區(qū)排斥那些喜歡其他編程語言的人,把他們當做敵人。 事實上,,我們希望有更豐富的跨平臺開源編程語言可供選擇,,編程語言是最重要的思維工具,可以把我們的想法轉(zhuǎn)換成計算機能理解的明確的條款,。如果人們發(fā)現(xiàn)了某種語言既適合他們的大腦又能直接解決問題,,這就很好了,不必關(guān)心他們到底選的是那種語言,。 因此我要給 Python 社區(qū)提三個具體的要求和一個更廣泛的建議,,首先說這些要求: 1.當我們想要激勵部落成員,提高社區(qū)吸引力時,,我們不應(yīng)該使用恐懼法,,相反我們應(yīng)該使用自豪法。當使用恐懼法激勵時,,比如說這樣的話:“如果我們不解決問題 X,,那么 Python 開發(fā)者將會減少,他們將會轉(zhuǎn)而去使用語言 Y”,,那么我們就在故意地向全世界自由貢獻代碼的人傳遞負能量,。但如果我們使用自豪法,說出來的話將是這樣的:“Python 中的問題 X 的確難以解決,,看看語言 Y 的社區(qū),,他們用一個極好的方法解決了這個問題,我們也可以在 Python 中嘗試這個解決方案,,以同樣優(yōu)雅的方式解決 Python 中的問題”,。積極地強調(diào)“以我們自己的努力為自豪”,有利于促進 Python 社區(qū)中不斷學(xué)習(xí)的文化,,還會不斷促進與其他社區(qū)關(guān)系的發(fā)展,。 2.克制對其他編程語言社區(qū)蔑視的態(tài)度,特別是對那些有大牛存在,,能自己解決遇到的問題,,不必等待商業(yè)軟件供應(yīng)商屈尊解決問題的社區(qū)。世界上的大多數(shù)重要的問題都不是利益驅(qū)動的問題(那些人想要解決問題,,不是為了謀取財富,,也沒有機構(gòu)出錢資助他們),所以我們應(yīng)該鼓勵和贊揚那些加緊嘗試解決問題的人,。不必管他們使用的是什么技術(shù),。 3.如果我們認識的人剛開始學(xué)習(xí)編程,即使他們所選的編程語言是我們自己所不喜歡的,。我們也要支持他們,,因為他們比我們清楚什么更適合他們的大腦,。所以對我們合適的語言不一定適合他們。如果他們開始對當初的選擇感到沮喪,,以至于完全打消了他們學(xué)習(xí)編程的積極性,,這時給他們推薦編程語言才更有意義。這個建議甚至也對我們當中做過改進網(wǎng)絡(luò)安全方面工作的人有用,,對于原本不安全的語言,,我們的解決方式是,通過改善操作系統(tǒng)中的沙盒功能,,漸進地破除這個語言選擇障礙,用原生系統(tǒng)的安全屬性,,改善了編程語言默認行為,,不應(yīng)該從應(yīng)用安全的角度評價編程語言的好壞,迷惑初學(xué)者,。(如果有人請編程新手寫了一個未經(jīng)審計的軟件,,卻部署為處理安全敏感的問題,這不是程序員的問題,,而應(yīng)該怪那個部署的人沒有盡職調(diào)查軟件的來源和安全屬性,。) 我更多的建議是針對人開始遭遇 Python 的核心程序集的境界,也因此開始探索更多的 Python 自身的“思維工具”,。 我們做 Python 核心開發(fā)過程的一部分事情是由于領(lǐng)會的特點具有在其他語言我們具有優(yōu)勢,,是否能夠用一種合適的方式讓 Python 代碼容易讀寫。這意味著學(xué)習(xí)別的程序語言能夠明確特定的風(fēng)格,,并且在 Python 中編程提高人對軟件開發(fā)的認識,。 為了有助于這樣的努力, 我已經(jīng)列出了下面可供探索的領(lǐng)域,,還有一些對這些領(lǐng)域可能提供額外見解的語言,。我盡可能的鏈接到 Wikipedia 頁面而不是直接轉(zhuǎn)向相關(guān)的首頁,因為維基百科經(jīng)常會給出一些有趣的歷史背景,,當選擇一門新的編程言作為一項學(xué)術(shù)型的練習(xí)而不是被立即用來實踐性使用的時候,,這些背景值得去探索。 然而就我個人而言,, 我熟悉許多的編程語言(并且已經(jīng)使用了其中的一些進行開發(fā)生產(chǎn)系統(tǒng)) ,。所有的推薦包括我間接了解的語言(或通過閱讀一些材料和設(shè)計文檔,又或者是從和我信任的朋友之間的交流中得知一門語言的優(yōu)勢和劣勢),。 本應(yīng)該有很多的與沿出現(xiàn)在名單之中,,但是對于列出來的這些特定的語言只是隨意的一些子集,它們從某些程度來講是基于我自己的興趣而選出來的(比如說:我主要的興趣點在于占支配地位的Linux,,Android 和 Windows生態(tài)系統(tǒng),,所以在這里我就忽略了封閉但是更加有利可圖的以 Apple 為中心的 Objective-C 和 Swift 編程語言,而且我對于專注于藝術(shù)環(huán)境的編程語言就不太了解,如Processing,,我甚至需要猜測從其中學(xué)到的東西怎么樣可以指導(dǎo)一個 Python 開發(fā)者),。對于一個更全面的編程語言名單而言需要考慮很多因素,除了考慮一個編程語言能夠指導(dǎo)你成為一個開發(fā)者外,,IEEE Spectrum 的一年一度關(guān)于編程語言流行度和增長的排名也非常值得了解一下,。 面向過程編程語言 C,Rust,,Cython Python 默認的運行模型是過程型的:我們從主模塊的頂部開始然后一句一句執(zhí)行,。所有的 Phthon 對于其他數(shù)據(jù)和計算模型的方法支持都是基于它是過程型的這一特性。 C 語言毫無疑問仍然是底層編程語言的統(tǒng)治者. 它是實現(xiàn) Python 解釋器的核心語言,,同樣也是實現(xiàn) Linux 操作系統(tǒng)內(nèi)核的核心語言,。作為軟件開發(fā)人員,學(xué)習(xí) C 語言是學(xué)習(xí)更多關(guān)于軟件所運行的底層硬件的最好起點 – C 語言經(jīng)常被描述為“可移植的匯編語言”,,通常使用 C 語言編譯器作為交叉編譯器,,為新的 CPU 體系結(jié)構(gòu)編譯出第一個應(yīng)用程序。 Rust,,相比之下, 是一個由 Mozilla 創(chuàng)建的比較新的語言,。它能夠進入這個名單的原因是,Rust 吸取了工業(yè)界已知的關(guān)于不能在 C 語言中做什么的教訓(xùn),,并且被設(shè)計成可以與 C 庫互操作的語言,,它對硬件的控制達到了和低級系統(tǒng)編程語言相同的精度,但它使用不同的編譯時方法進行數(shù)據(jù)建模和內(nèi)存管理,,在結(jié)構(gòu)上消除了許多常見的困擾 C 程序的的缺陷(比如緩存溢出,、重復(fù)釋放內(nèi)存錯誤、空指針訪問以及線程同步問題),。我是一名嵌入式系統(tǒng)工程師,,通過培訓(xùn)具備了最初的專業(yè)經(jīng)驗,我已經(jīng)看到,,當前被 C 語言和定制匯編代碼統(tǒng)治的各個領(lǐng)域很有可能會被 Rust 取代,。 Cython 也是一種默認的更底層的語言,但是與通用目標語言 C,,Rust 不同,,Cython 主要用于書寫 CPython 擴展模塊。Cython 被設(shè)計作為一個 Python 的超集,,讓程序員選擇何時支持純 Python 語法的靈活性,,當 Cython 語法支持的擴展使其可以生成的代碼相當于本地C代碼的速度和內(nèi)存效率。 學(xué)習(xí)這些語言之一是以實用的角度增強其對內(nèi)存管理,,算法效率,,二進制接口兼容性,,軟件可移植性,將源代碼轉(zhuǎn)換成運行系統(tǒng)的深刻理解,。 面向?qū)ο蟮臄?shù)據(jù)建模: Java, C#, Eiffel 編程中最主要的任務(wù)之一是為現(xiàn)實世界的狀態(tài)建模,,這方面最通常的方法是面向?qū)ο笳Z言所提供的那些原生的語法支持:把數(shù)據(jù)結(jié)構(gòu)、操作這些數(shù)據(jù)結(jié)構(gòu)的方法組合成類,。 Python原生設(shè)計上就可以直接使用面向?qū)ο蟮奶匦?,而不需要一上來先學(xué)習(xí)如何編寫自己的類。不是每種語言都才有這樣的方式 – 對于本節(jié)列出的這些語言,,學(xué)習(xí)面向?qū)ο蟮脑O(shè)計思想是使用這些語言的前提,。 得益于 Sun Microsystems 在 20 世紀 90 年代中后期對 Java 語言的市場推廣,Java 成了很多大專院校計算機科學(xué)入門課程的默認語言,。雖然現(xiàn)在在很多教育領(lǐng)域它正被 Python 淘汰,,但它在商業(yè)應(yīng)用程序開發(fā)領(lǐng)域仍然是一種最受歡迎的語言。有一系列其它語言針對公共的 JVM(Java 虛擬機)運行時的實現(xiàn),,包括 Python 的 Jython 實現(xiàn)。Android 系統(tǒng)的 Dalvik 和 ART 環(huán)境是基于 Java 編程 API 實現(xiàn)的,。 C# 在很多方面與 Java 相似,,在 Sun 和 Microsoft 解決關(guān)于 J++(微軟實現(xiàn)的 Java 語言)和標準 JAVA 不一致的問題失敗后,它是作為J++的替代語言出現(xiàn)的,。像 Java 一樣,,它也是一個受歡迎的商業(yè)應(yīng)用開發(fā)語言,有一系列其它語言針對共享 .NET CLR(公共語言運行庫)的實現(xiàn),,包括 Python 的 IronPython 實現(xiàn)(原始的 IronPython 1.0 中的核心組件被抽取出來創(chuàng)建 .NET 動態(tài)語言運行庫的中間層),。在很長的一段時間里,.NET是只能在 Windows 系統(tǒng)中使用的專有技術(shù),,有一個跨平臺的開源代碼 mono 重新實現(xiàn)了.NET,,但在 2015 年初,微軟宣布了 .NET 開源計劃,。 與列表里大多數(shù)語言不同,,我并不推薦在日常使用 Eiffel。它之所以在推薦列表里,,是因為這門語言有著大量優(yōu)良的面向?qū)ο笤O(shè)計思想,,包括以“正確可信”作為程序的設(shè)計目標。(同時,,Eiffel 也告訴我對于大多數(shù)的軟件開發(fā),,并沒有以“正確可信”為設(shè)計目標,這是因為正確可信的軟件確實無法妥善處理不確定的情況,。當很多相關(guān)約束還不清楚,,需要在不斷迭代的過程中去逐步完善的時候,,這種設(shè)計理念就完全不適合了) 學(xué)習(xí)這類編程語言,就需要去熟悉繼承模型,、契約設(shè)計,、類不變項、前置條件,、后置條件,、協(xié)變(covariance)、逆變(contravariance),、方法查找路徑,、泛型編程,以及其他各種在 Python 的類型系統(tǒng)上也支持的特性,。此外還有很多標準庫模塊和第三方框架,,會用到“顯示的面向?qū)ο蟆痹O(shè)計風(fēng)格,例如 unittest 和 loggingmodules,,以及 Django 框架里基于類的 view,。 面向?qū)ο蟮?C:C++, D 使用 CPython 的一種方式,是把它的內(nèi)核當做一種“包含對象的 C 語言”的編程環(huán)境 – CPython 是通過 C 語言的風(fēng)格去實現(xiàn)面向?qū)ο缶幊?,也就是?C 的結(jié)構(gòu)體描述數(shù)據(jù),,然后把結(jié)構(gòu)的實例指針作為第一個參數(shù)傳給那些數(shù)據(jù)處理函數(shù)(也就是 CPython的C 里面的 omnipresentPyObject* 指針)。這種設(shè)計模式被有意復(fù)制到 Python 里,,在實例方法和類方法需要顯示的指定 self 或者 cls 參數(shù),。 C++ 的目標是在源碼級完全兼容 C 語言,在此之上增加了一些高級特性,,例如原生的面向?qū)ο缶幊讨С趾突谀0宓脑绦蜷_發(fā),。C++ 的晦澀和復(fù)雜是臭名昭著的(即使 2011 年的語言標準的更新解決了大量最糟糕的問題),不過就算這樣,,C++ 仍然是很多場景下的選擇,,包括 3D 建模圖形引擎和跨平臺應(yīng)用開發(fā)框架,如 Qt,。 D 編程語言也很有趣,,因為它和 C++ 的關(guān)系很像 Rust 與 C 語言之間的關(guān)系:設(shè)計 D 語言的目的是,既要保留 C++ 的大部分優(yōu)點,,也要避免 C++ 中存在的很多缺陷(比如缺乏存儲安全性),。與 Rust 不同,D 語言不是一個從零開始設(shè)計的全新編程語言,,相反,,它是直接從 C++ 衍生出來的語言,盡管它不像 C++ 那樣是 C 語言的嚴格超集,,但它遵守一個設(shè)計原則,,任何落入 C 語言和 D 語言公共子集中的代碼,,在兩種語言中的行為必須相同。 學(xué)習(xí)這些語言有利于深刻理解把高級語言特征和底層 C 運行時模型相結(jié)合的復(fù)雜性,。學(xué)習(xí) C++ 也有助于使用 Python 操作已有的用 C++ 編寫的庫和工具包,。 面向數(shù)組的數(shù)據(jù)處理: MATLAB/Octave, Julia 面向數(shù)組的編程用于數(shù)值編程模型:基于矩陣代數(shù)和相關(guān)的數(shù)值方法。 雖然 Python 的標準庫并沒有直接支持,,不過在語言設(shè)計上已經(jīng)做了考慮,,一系列語法和語義上的功能支持,有助于第三方庫 NumPy 以及類似的面向數(shù)組的工具,。 在很多情況下,,Python科學(xué)計算 軟件系列都被當做專用的 MATLAB 編程環(huán)境的替代者,被廣泛用于科學(xué)和工程上的建模,、仿真和數(shù)值分析,。開源項目 GNU Octave 的目標是在語法上與MATLAB代碼兼容,讓人可以比較面向?qū)ο缶幊痰倪@兩種方式,。 Julia 是另一個相對較新的語言, 它的主要特點是支持面向數(shù)組編程和基于類型的函數(shù)重載. 學(xué)習(xí)一種這樣的語言有助于深入理解 Python 科學(xué)計算工具包的威力,,同時,學(xué)習(xí)這樣的語言有助于研究如何利用 OpenCL 和 Nvidia 的 CUDA 等類似的技術(shù)實現(xiàn)硬件級并發(fā)執(zhí)行,,也有助于研究如何使用 Apache Spark 和 Blaze 等數(shù)據(jù)處理框架實現(xiàn)分布式數(shù)據(jù)處理,。 統(tǒng)計數(shù)據(jù)分析語言: R 由于有越來越多的大數(shù)據(jù)集需要處理。因此需要一種免費的能處理這樣的數(shù)據(jù)集的分析工具,,編程語言 R 就是一種這樣的工具,它特別注重統(tǒng)計數(shù)據(jù)分析和可視化,。 學(xué)習(xí) R 語言有助于深入理解 Python 科學(xué)計算工具包的統(tǒng)計功能,,特別是其中的數(shù)據(jù)分析庫 pandas 和統(tǒng)計可視化庫 seaborn 。 計算管道建模語言:Haskell, Scala, Clojure, F# 面向?qū)ο髷?shù)據(jù)建模和面向數(shù)組數(shù)據(jù)建模主要用于對數(shù)據(jù)進行靜態(tài)建模,,有兩種建模方式,,一種是把數(shù)據(jù)保存在對象的各個屬性中,另一種是把結(jié)構(gòu)化的數(shù)據(jù)保存為數(shù)組,。 相比之下,,函數(shù)式編程語言更強調(diào)以計算流的形式對數(shù)據(jù)進行動態(tài)建模。只要學(xué)一下函數(shù)式編程基礎(chǔ),,就會顯著提高使用數(shù)據(jù)轉(zhuǎn)換操作對數(shù)據(jù)建模的能力,,這對于使用其他范式的編程語言(比如面向過程、面向?qū)ο?、面向?shù)組的編程語言)開發(fā)應(yīng)用程序也是有幫助的,。 Haskell 是一個函數(shù)式編程語言,對 Python 的設(shè)計產(chǎn)生過重大的影響, 最明顯的就是 Python 2.0 引入的列表解析,。 Scala 毫無疑問是基于JVM的函數(shù)式編程語言,,與Java, Python和R一樣,,是Apache Spark數(shù)據(jù)分析平臺的四門主要編程語言之一。在設(shè)計上支持函數(shù)式編程方式的同時,,Scala的語法,、數(shù)據(jù)模型和執(zhí)行模型在設(shè)計上盡量避免為原有的Java程序員帶了太大的障礙(從這個角度上看,Scala更恰當?shù)姆诸悜?yīng)該是有著強函數(shù)式語言支持的面向?qū)ο蟮木幊陶Z言),。 Clojure是另一門基于JVM的函數(shù)式編程語言,,被看作是Lisp的一個變種。它在我們的清單中具有一席之地,,是因為它為Python的函數(shù)式編程工具箱toolz的實現(xiàn)帶來靈感,。 我自己對F# 并不熟悉,不過由于它是 .NET CLR 推薦的語言,,所以還是值得關(guān)注的,。 學(xué)習(xí)這些編程語言,有助于了解 Python 自身的計算管道建模工具,,包括容器推導(dǎo)表達式,、生成器、生成器表達式,、functools 和 itertools 標準庫模塊,,和第三方函數(shù)式 Python 工具如 toolz。 事件驅(qū)動編程語言:JavaScript, Go, Erlang, Elixir 計算管道是處理數(shù)據(jù)轉(zhuǎn)換和分析問題的一種很好的方法,,不過很多問題需要程序以持久的方式運行,,等待事件發(fā)生,然后處理這些事件,。對這類服務(wù),,通常可以并發(fā)的處理多個事件,,來實現(xiàn)同時為多個用戶(或者至少多個行為)提供服務(wù),。 JavaScript 最初是為瀏覽器開發(fā)的事件處理編程語言,可以讓 web 開發(fā)人員處理客戶端本地的用戶行為(例如鼠標移動和按鍵)和事件(例如頁面渲染結(jié)束),。所有現(xiàn)代的瀏覽器都支持 JavaScript,,與 HTML5 的 DOM 一起,已經(jīng)成為用戶界面的外觀和行為事實上的標準,。 Go 是Google設(shè)計出來的,,設(shè)計這個語言的目的是為了創(chuàng)建高度可擴展的網(wǎng)絡(luò)服務(wù),Go語言非常適合開發(fā)命令行程序,。從設(shè)計編程語言的角度看,,最引人注目的是Go語言在它的核心并發(fā)模型中使用了“順序通信過程(Communicating Sequential Processes)”這一概念。 Erlang 是愛立信設(shè)計出來的,,設(shè)計這個語言的目的是為了制造高度可靠的電話交換機以及類似的設(shè)備,,著名的開源框架RabbitMQ的消息服務(wù)器就是用Erlang實現(xiàn)的,。Erlang使用Actor模型實現(xiàn)了核心并發(fā)原語,不允許不同線程直接共享數(shù)據(jù),,線程間的通信只能靠傳遞消息,。盡管我自己從來沒有使用過Erlang語言, 但我的第一份工作涉及到了一個基于Actor模型開發(fā)的并發(fā)框架,它是一個前愛立信工程師用C++開發(fā)的,,我自己也基于TSK(任務(wù))和MBX(郵箱)原語開發(fā)過這樣的框架,,是在德州儀器的輕量級DSP/BIOS運行時(現(xiàn)在叫TI-TROS)中實現(xiàn)的。 Elixir 能夠出現(xiàn)在這個名單中的理由是,,雖然它運行在Erlang虛擬機中,,與編程語言Erlang具有相同的并發(fā)語義,但它也包含了一系列額外的語言級特征,,提供了更全面的開發(fā)環(huán)境,,更容易吸引從其他編程語言(比如Python、Java或Ruby)轉(zhuǎn)過來的開發(fā)者,。 學(xué)習(xí)一種這樣的語言有助于深入理解Python本身是如何支持并發(fā)和并行的,,包括原生協(xié)程、基于生成器的協(xié)程,、concurrent.futures和asyncio標準庫模塊,、第三方網(wǎng)絡(luò)服務(wù)開發(fā)框架(比如Twisted和Tornado)、Django中新引入的channels概念和GUI 框架中的事件處理循環(huán),。 動靜混合類型: TypeScript Python 3.5 引入的特性里,,最有爭議的一項是新的類型模塊,為 Python 體系加上了混合類型的支持,。 對于那些接觸過的靜態(tài)類型編程語言主要是 C, C++ 和 Java 的開發(fā)者來說,,這簡直就是一個及其可怕的想法。 Microsoft 的 TypeScript 為 JavaScript 應(yīng)用提供動靜混合類型支持,,讓你對這個概念會有好一些的看法。TypeScript 代碼會編譯成 JavaScript 代碼(編譯后不包含任何運行時類型檢查),,主流的JavaScript 庫的 TypeScript 注釋(annotations)在DefinitelyTyped代碼庫里可以找到,。 正如 Chris Neugebauer 在澳大利亞 PyCon 大會的報告上指出的那樣,這很像是 Python 與類型提示庫 typeshed 以及類似 mypy 那樣的類型推導(dǎo)和分析工具之間的關(guān)系,。 本質(zhì)上,,TypeScript 和 Python 的類型提示都是實現(xiàn)特定測試程序的方式,不管是獨立文件(常規(guī)的測試程序),,還是內(nèi)嵌在主代碼里(類似靜態(tài)編程語言的類型聲明),。不管哪種情況,你都可以運行單獨的命令檢查剩余的代碼是否符合已知的類型約束(對于 JavaScript 和 TypeScript,,在編譯階段會隱式的去完成,,對于 Python 的類型提示,,則是可選的靜態(tài)分析任務(wù))。 動態(tài)元程序設(shè)計: Hy,,Ruby 像 C,、C++、C#,、Java 這樣的編程語言給 Python 帶來的一個有點讓人不安特性是“代碼即數(shù)據(jù)”:類似函數(shù)和類都是運行時對象,,可以被其他對象操作。 Hy 是一個 Lisp 的變種,,可以在 CPython 虛擬機和 PyPy 虛擬機上運行,。Lisp 在“代碼即數(shù)據(jù)”上做到了極致,Lisp 代碼本身就是由描述需要實現(xiàn)的操作的嵌套的列表組成的(這門語言的名字就源自”LISt Processor”),。Lisp 風(fēng)格的語言,,最強大的一點是它們可以很輕松的實現(xiàn)自己的領(lǐng)域特定語言(DSL),不過這有時候也為閱讀其他人的代碼帶來困難,。 Ruby 在很多方面都與 Python 很類似,,但是作為更為開放的社區(qū),Ruby 更接受動態(tài)元程序設(shè)計,,而對于 Python,,這方面只是“支持,但不鼓勵”,。這方面的功能包括重定義類加入一些方法,,用閉包實現(xiàn)語言核心結(jié)構(gòu)如迭代器。 學(xué)習(xí)這些語言可以幫助深入了解 Python 自身的動態(tài)元程序設(shè)計的支持,,包括函數(shù)和類裝飾,、monkeypatching(動態(tài)修改代碼)、unittest.mock 標準庫模塊以及第三方對象代理模塊入如wrapt(我還沒找到什么編程語言有助于了解 Python 的元類(metaclass),,如果有人有好的建議,,可以在評論里告訴我。元類的高級特性包括核心類型,、抽象基類,、枚舉類型和混合類型(動態(tài)類型和靜態(tài)類型混合)表達式的運行時執(zhí)行)。 實用主義者:Lua, PHP, Perl 流行的編程語言通常并不是孤立的 —— 他們屬于龐大的生態(tài)系統(tǒng)的一部分(商業(yè)和社區(qū)都是這樣),,此外還有終端用戶,、框架開發(fā)者、工具開發(fā)者,、教育人員等等,。 Lua是一門流行的編程語言,主要作為腳本引擎內(nèi)嵌于大型的程序里。值得一提的例子有,,為魔獸爭霸游戲客戶端編寫的插件,,在很多 Linux 發(fā)行版存在的 RPM 工具也內(nèi)置了 Ruby。與 CPython 相比,,Lua 運行時大小只有其十分之一,,并且它的弱反省(weaker introspection)的能力也能讓它更容易獨立于應(yīng)用程序的其他部分和宿主操作系統(tǒng),。一個值得提到的來自 Lua 社區(qū)對 Python 生態(tài)系統(tǒng)的貢獻是,,CPython 和 PyPy 采用 LuaJit FFI(Foreign Function Interface)作為其 JIT 友好的 cffi 接口庫的基礎(chǔ)。 PHP 是另一個受歡迎的編程語言,,由于PHP擅長生成HTML頁面,,被早期的虛擬服務(wù)器主機提供商廣泛使用,因此它作為 LAMP stack(Linux-Apache-MySQL-PHP)的組成部分被廣為人知,。盡管PHP在設(shè)計中存在很多令人苦惱的概念上的缺陷,,它仍然成了很多著名的開源web 服務(wù)的基礎(chǔ),包括Drupal內(nèi)容管理系統(tǒng),、WordPress博客引擎和支撐Wikipedia的MediaWiki引擎,。PHP也能支撐很多重要的服務(wù),比如眾包社區(qū)所使用的分布式事件報告平臺 Ushahidi,。 和PHP一樣,,Perl 也是Linux系統(tǒng)上的一個受歡迎的語言,與PHP不同,,Perl不是作為網(wǎng)站開發(fā)平臺被人熟知的,,它更常見的用途是作為系統(tǒng)管理員管理系統(tǒng)的工具,它既能使用正則表達式處理字符串又能處理基于文本的Linux操作系統(tǒng)命令的輸出結(jié)果,。只使用Perl就能處理所有的任務(wù),,不需要再使用Whensh、awk和sed等工具了,。 學(xué)習(xí)其中的一門語言并不能提供任何好的見解在審美上漂亮或者在理念上簡潔的程序語言設(shè)計,。可能的結(jié)果是在實踐中提供一些編程語言的結(jié)構(gòu)和采納的知識,,以及了解關(guān)于偶然的機會,、歷史的積累和降低入門門檻(通過重新分配使缺省變得可能)所起到的作用,這些都強于語言本身固有的能力,。 特別是,它可以提供一些見解關(guān)于 CKAN,、OpenStack NFV,、Blender、SciPy、OpenMDAO,、PyGMO,、PyCUDA、 Raspberry Pi Foundation 和 Python 的項目意義,,通過廣泛的商業(yè)組織,,確保 Python 生態(tài)系統(tǒng)的機構(gòu)投資持續(xù)進行。 數(shù)值計算的思想:Scratch,,Logo 最后想說的是,,我常常陷入這樣的討論,即結(jié)構(gòu)化編程和面向?qū)ο蟪珜?dǎo)者的爭論,。后者自稱面向?qū)ο缶幊陶Z言和結(jié)構(gòu)化編程語言一樣易學(xué),。 當我們談?wù)摰氖峭ㄟ^具體的數(shù)值實驗來教學(xué)(機器人學(xué)),研究對象在仿真軟件中的模型有著直接現(xiàn)實世界的參照物時,,比如學(xué)生們可以接觸到傳感器,,發(fā)動機,繼電器等,。我認為支持面向?qū)ο蟮男』锇閭冇幸欢ǖ牡览怼?/p> 然而對于其他人來講,,我遇到的一個典型的挑戰(zhàn)是:拿起一本食譜,將其中一個菜譜轉(zhuǎn)換成你認為易學(xué)的面向?qū)ο缶幊陶Z言,,然后找到一個理解這門編程語言的學(xué)生,,沿著我的思路,來繼續(xù)轉(zhuǎn)換這個菜譜,。(我期待著看到學(xué)術(shù)研究人員真正踐行這樣的學(xué)習(xí)過程,,——我會發(fā)自內(nèi)心的為這樣的情況感到欣慰。)大多數(shù)的情況下,,小伙伴們不必遵循這樣的流程——僅僅需要在頭腦中進行思維的實驗就足以讓他們感受到要想學(xué)會這“易學(xué)的”編程語言需要多少預(yù)備知識,。 然而另外一個解決此問題的方法是學(xué)習(xí)那些用于教育小孩子數(shù)值計算的編程語言。 其中一種最流行的莫過于 Scrach,,它是一種讓學(xué)生利用拖動的方式來操作封閉的圖形化環(huán)境,,從而可以看到圖形化界面中相應(yīng)的移動和反應(yīng)的編程接口。像 Scrach 這樣的圖形化環(huán)境是一種類似于利用連環(huán)畫幫助孩子們逐步學(xué)習(xí)讀書認字的方式的程序設(shè)計方式,。 然而,,這種利用一種特殊教育目的編程語言來操作一個圖形化界面的想法并不新奇,隨著的早期最經(jīng)典環(huán)境之一的 Logo 環(huán)境在 2 0世紀 60 年代的創(chuàng)建(類似于 Python 自己的海龜模塊),,那時候,,你所接觸的主要的東西是一個“海龜”,你可以用命令它的移動來畫線,,從而改變圖形環(huán)境,。通過這種方式,,像命令行、迭代,、狀態(tài)(例如:向上劃,、向下劃)都以一種建立在人們的自然直觀的思維方式(想象一下,假如你是一只海龜,,如果向右旋轉(zhuǎn) 90 度將會發(fā)生什么,?)的基礎(chǔ)上來介紹。 回歸本源,,作為一名富有經(jīng)驗的程序員,,重新學(xué)習(xí)以上的任何一門編程語言是最有效的方式來忘掉所學(xué)(拋棄一些輪子):這些語言工具所涵蓋的概念幫助我們回想起那些我們曾經(jīng)認為理所當然的概念,但是需要以初學(xué)者的眼光重新學(xué)習(xí),。當我們這么做的時候,,因為我們更加愿意回想起整個的邏輯鏈條,包括那些我們之前認為理所當然而省略的思維步驟,,我們會更加有效地和學(xué)生以及其他的初學(xué)者一起工作,。 看完本文有收獲?請轉(zhuǎn)發(fā)分享給更多人 關(guān)注「Python開發(fā)者」,,提升Python技能
|
|