国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

幫你提升Python的27種編程語言

2019-11-14 16:56:12
字體:
供稿:網(wǎng)友

以下為正文:

作為全球最流行的編程語言聯(lián)合設(shè)計(jì)者之一,我經(jīng)??吹降囊环N令人沮喪的行為(在Python社區(qū)和其它社區(qū)都有),就是那些有影響力的人試圖把“缺失”的恐懼感灌輸給其它開源社區(qū),將其當(dāng)作對(duì)社區(qū)貢獻(xiàn)的源動(dòng)力。(我偶爾會(huì)對(duì)自己的這種不當(dāng)行為感到內(nèi)疚,當(dāng)別人落入同樣的陷阱時(shí)我也就更容易察覺到)。

雖然借鑒其他編程語言社區(qū)的經(jīng)驗(yàn)是一件好事,但以恐懼為基礎(chǔ)的方法來激勵(lì)行動(dòng)存在嚴(yán)重的問題,因?yàn)樗鼘⒅鷿q社區(qū)成員為爭取貢獻(xiàn)者的關(guān)注而將其它社區(qū)的成員視為敵人,而不是當(dāng)做潛在的盟友去迎接更大的挑戰(zhàn),共同推動(dòng)頂尖軟件技術(shù)的進(jìn)步。這也相當(dāng)于宣告不歡迎那些青睞其它編程語言的人們來到這個(gè)社區(qū),這是一個(gè)把他們和他們的同伴視為“惡敵”的社區(qū)。

事實(shí)上,我們希望有豐富多樣的跨平臺(tái)開源編程語言可供選擇,因?yàn)槌绦蛟O(shè)計(jì)語言是最重要的思維工具——它們首先讓我們能夠明確地傳遞表達(dá)自己的想法,以至于即使是計(jì)算機(jī)也能理解。如果有人發(fā)現(xiàn)一種編程語言既符合他們的思路,又能解決當(dāng)下的問題,真是太棒了,選了哪種(哪幾種)編程語言顯得無關(guān)緊要。

因此,我對(duì)Python社區(qū)有三點(diǎn)具體的要求,以及一條更泛化的建議。首先,是這三點(diǎn)具體要求:

  1. 當(dāng)我們覺得有必要用部落的本性來激發(fā)動(dòng)力時(shí),我們應(yīng)該避免使用部落的恐懼,而是力求引起部落自豪感。若把恐懼作為動(dòng)力,如這樣措辭“如果不解決X問題,我們將會(huì)流失一部分開發(fā)者,他們就會(huì)轉(zhuǎn)向使用Y編程語言”,那么我們就是刻意地在那些向大眾無私分享代碼的貢獻(xiàn)者之間傳播負(fù)能量。如果是利用部落自豪感,措辭則會(huì)是“現(xiàn)在完全不清楚如何用Python解決X問題。如果我們?yōu)g覽Y語言的生態(tài)圈,會(huì)發(fā)現(xiàn)他們有一種完美的方法可以解決X問題,我們也能借鑒此方法用Python提供同樣完美的用戶體驗(yàn)”。積極贊揚(yáng)肯定了我們自己的努力成果,而非詆毀別人的工作,它能夠促進(jìn)Python社區(qū)內(nèi)持續(xù)學(xué)習(xí)的文化,同時(shí)也鼓勵(lì)改善與其它社區(qū)的促進(jìn)合作關(guān)系。
  2. 克制對(duì)其它開源編程語言社區(qū)的輕蔑態(tài)度,尤其是如果那些社區(qū)協(xié)助人們自己解決了問題,而不是讓人們等著商業(yè)軟件開發(fā)商來解決。世界上許多關(guān)鍵問題的解決過程都無利可圖(因?yàn)楸粏栴}所困擾的個(gè)人并不富裕,也無權(quán)決定科研經(jīng)費(fèi)的去向),因此我們應(yīng)該鼓勵(lì)和稱贊那些加緊努力去解決問題的人們,不管我們對(duì)他們選用的技術(shù)有何看法。
  3. 當(dāng)我們得知某個(gè)人第一次學(xué)習(xí)編程,而且他們選擇了一種我們個(gè)人不喜歡的編程語言,我們無論如何都應(yīng)該支持他們的選擇。他們比我們更清楚什么適合他們的思維,所以適合我們的語言并不一定也適合他們。如果他們開始對(duì)最初選擇的語言感到沮喪,甚至到了打消他們學(xué)習(xí)編程的積極性的程度,這時(shí)才應(yīng)該給他們推薦其它語言。這個(gè)建議也適用于我們這些參與提高糟糕的網(wǎng)絡(luò)安全狀態(tài)的人們:我們使用內(nèi)在不安全的語言來解決問題的方法是通過提高操作系統(tǒng)的沙盒能力,逐步消除障礙,并采用內(nèi)部安全性更好的語言,提高現(xiàn)有語言的默認(rèn)行為,而不是與新手爭論為什么他們選擇的語言從應(yīng)用安全的角度而言是糟糕的選擇,使得他們一頭霧水。(如果有人正在使用新手開發(fā)的未經(jīng)審核的軟件來處理安全敏感任務(wù),那么問題不是出在軟件開發(fā)者身上,而是在于使用者對(duì)該軟件的來源和安全性沒有進(jìn)行盡職的調(diào)查。)

我的建議主要針對(duì)那些即將遭遇Python核心程序集的限制以及因此打算探索更多Python自身的“思維工具”的人們。

作為Python核心開發(fā)的一部分,我們的工作包括觀察自己使用過的編程語言,找出其中令人欣賞的特性,看看是否有辦法將其引入Python,使Python代碼既易讀也易寫。這也意味著學(xué)習(xí)另一種專注于特定風(fēng)格的軟件開發(fā)編程語言,能夠幫助人們?cè)赑ython環(huán)境下更好地理解同樣的編程風(fēng)格。

為了在這方面有所幫助,我在下面羅列了一些可能的探索領(lǐng)域,以及其它一些編程語言也許能對(duì)這些領(lǐng)域提供額外的見解。我盡可能地把鏈接指向維基百科頁面,而不是直接指向相關(guān)內(nèi)容的主頁面,因?yàn)榫S基百科往往提供一些有趣的歷史背景,若是作為學(xué)習(xí)實(shí)踐而不是立即進(jìn)行實(shí)際應(yīng)用時(shí),花時(shí)間探索一番背后的歷史是值得的。

盡管我個(gè)人確實(shí)了解這其中的許多編程語言(并且在開發(fā)產(chǎn)品過程中已經(jīng)用過幾種),完整的推薦表還是額外添加了一部分我間接了解(往往是通過閱讀教程和設(shè)計(jì)文檔,或是和我信任的朋友交流這門語言的優(yōu)勢和弱勢)的編程語言。

有很多其它編程語言 本應(yīng)該也出現(xiàn)在這份列表中,然而只是根據(jù)我的個(gè)人興趣隨機(jī)挑選出了一部分(比如,我主要的興趣點(diǎn)在于linux、Android和Windows生態(tài)系統(tǒng),所以我放棄了小眾但仍有市場的以Apple為中心的Objective-C和Swift語言,而且我也不熟悉如 PRocessing 之類的art-focused環(huán)境,猜不出它們能讓Python開發(fā)者學(xué)到什么)。若不僅僅想知道編程語言教給開發(fā)者的有什么想,而是要一份更完整的列表,IEEE Spectrum每年的編程語言 年度熱門排行榜 值得你一看。

過程式編程:C, Rust, Python

Python的默認(rèn)執(zhí)行模式是過程式的:我們從主模塊的頂部開始,依次執(zhí)行各條命令。下文所述的Python對(duì)其它所有數(shù)據(jù)和計(jì)算建模方法的支持都是在過程式基礎(chǔ)上搭建的。

C語言 仍舊是底層過程式編程無法撼動(dòng)的標(biāo)尺。它是Python解釋器的核心實(shí)現(xiàn)語言,也是Linux操作系統(tǒng)內(nèi)核的實(shí)現(xiàn)語言。作為一名軟件開發(fā)者,學(xué)習(xí)C語言是開始深入學(xué)習(xí)執(zhí)行軟件應(yīng)用的底層硬件的最好方法之一——C語言常被稱為是“可移植的匯編語言”,而且C語言編譯器也是首先為任何新CPU結(jié)構(gòu)交叉編譯的幾款應(yīng)用之一。

Rust語言 恰好相反,它是Mozilla開發(fā)的一種相對(duì)較新的編程語言。把它列在此是因?yàn)镽ust的目標(biāo)是吸取所有我們從工業(yè)界已經(jīng)得到的關(guān)于C語言弊端的教訓(xùn),設(shè)計(jì)一種能和C語言庫交互操作的新語言,提供底層系統(tǒng)編程語言對(duì)硬件相同精確的控制能力,但是它采用一種不同的編譯時(shí)方法實(shí)現(xiàn)數(shù)據(jù)建模和內(nèi)存管理,從而結(jié)構(gòu)性地避免了許多C語言的常見缺陷(諸如緩存區(qū)溢出,重復(fù)釋放指針錯(cuò)誤,空指針獲取和線程同步問題)。我是一名通過實(shí)踐訓(xùn)練成長起來的嵌入式系統(tǒng)工程師,Rust是我所見過的第一種新語言,它似乎最有可能衍生拓展到所有細(xì)枝末節(jié)以取代目前所有的C語言和自定義匯編代碼。

Cython  也是一種底層的默認(rèn)過程式語言,但是不像一般的通用語言,如C和Rust,Cython主要是為編寫CPython擴(kuò)展模塊而設(shè)計(jì)。為了支持這一目標(biāo),Cython被設(shè)計(jì)成Python的超集,允許程序員自由選擇何時(shí)使用純Python語法來體現(xiàn)代碼的靈活性,何時(shí)又用Cython的語法擴(kuò)展來編寫代碼,使其擁有與傳統(tǒng)C語言一致的速度和內(nèi)存使用效率。

學(xué)習(xí)上述語言中的一門能夠深入理解內(nèi)存管理、算法效率、二進(jìn)制接口兼容性、軟件便攜性,以及如何將源代碼轉(zhuǎn)化為能夠允許的系統(tǒng)的實(shí)踐經(jīng)驗(yàn)。

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

在編程的時(shí)候,我們做的一件重要事情就是對(duì)現(xiàn)實(shí)世界的狀態(tài)建模,目前流行的解決方法之一是提供面向?qū)ο缶幊痰谋镜鼗Z法支持:結(jié)構(gòu)化地組織數(shù)據(jù)結(jié)構(gòu),以及將處理這些數(shù)據(jù)結(jié)構(gòu)的方法封裝成類。

Python本身經(jīng)過巧妙地設(shè)計(jì),使得我們不需先學(xué)會(huì)定義類就能直接使用其面向?qū)ο蟮奶匦?。并不是每種編程語言都支持這一方法——在這一小節(jié)列出的編程語言,就需要在使用它們之前先學(xué)習(xí)面向?qū)ο蟮木幊獭?/p>

隨著九十年代中后期Sun Microsystems的大力市場推廣, Java 成為許多學(xué)校計(jì)算機(jī)科學(xué)專業(yè)入門學(xué)習(xí)的默認(rèn)語言。盡管現(xiàn)在它的地位在許多教育場所已經(jīng)被Python所取代,它仍舊是商業(yè)應(yīng)用開發(fā)的最流行語言之一。有大量的其它語言是需要在JVM(Java虛擬機(jī))的環(huán)境下運(yùn)行,包括Python的Jython實(shí)現(xiàn)。Android系統(tǒng)的Dalvik和ART環(huán)境是基于Java編程API的再實(shí)現(xiàn)。

C# 和Java在許多方面都相似,當(dāng)Sun和Microsoft無法理清Microsoft的 J++ 商業(yè)化差別而宣告失敗時(shí),C#以替代產(chǎn)品的身份面世。與Java一樣,C#也是商業(yè)應(yīng)用開發(fā)的流行軟件之一,也有許多其它語言依附于共享的 .NET CRL (Common Language Runtime),包括Python的IronPython實(shí)現(xiàn)(原始的IronPython 1.0 版本的核心部件被提取用于創(chuàng)建語言中立者.NET動(dòng)態(tài)語言運(yùn)行時(shí))。在很長的一段時(shí)間里,.NET和跨平臺(tái)開源重實(shí)現(xiàn)的工具 mono 一樣,都是Windows特有的專利技術(shù),但在2015年上半年Microsoft將.NET轉(zhuǎn)向了 開源生態(tài)系統(tǒng)的策略 。

與這個(gè)列表里的大部分語言不同,我并不推薦把 Eiffel語言 作為日常使用的語言。相反,我推薦它的原因是它的學(xué)習(xí)過程教會(huì)了我無窮無盡的面向?qū)ο蟮膬?yōu)秀設(shè)計(jì),它以“正確無誤”為應(yīng)用設(shè)計(jì)目標(biāo)。(Eiffel的學(xué)習(xí)過程也讓我明白了為何事實(shí)上“正確無誤”并不是大多數(shù)軟件開發(fā)的設(shè)計(jì)目標(biāo),因?yàn)榇_保無誤的軟件真的不能很好處理模棱兩可的情況,若是你暫時(shí)真的不知道相關(guān)約束條件且需要給自己留有足夠的回旋余地以便后續(xù)迭代開發(fā)時(shí),確保無誤的軟件也完全不適合這種情況)。

學(xué)習(xí)以上一種語言使你能夠深入了解繼承模型、合同設(shè)計(jì)、類不變性、前置條件、后置條件、協(xié)方差、逆變性、方法解析順序、泛型編程,以及其它同樣適用于Python類型系統(tǒng)的概念。也有許多標(biāo)準(zhǔn)庫和第三方框架使用這種“可見的面向?qū)ο?rdquo;設(shè)計(jì)風(fēng)格,如單元測試和日志模塊,還有Django Web框架的基于類的視圖。

面向?qū)ο蟮腃語言衍生:C++, D

使用CPython運(yùn)行的方式之一是以“C with objects”的編程環(huán)境——在其核心,CPython是采用C的面向?qū)ο缶幊虂韺?shí)現(xiàn)的,通過定義C語言的struct來存放數(shù)據(jù),而后把struct的實(shí)例作為函數(shù)的第一個(gè)參數(shù)傳入并處理該數(shù)據(jù)(這些就是CPython的C語言API中無處不在的PyObject*指針)。這種設(shè)計(jì)模式是故意在Python層面鏡像,將顯式的self和cls參數(shù)轉(zhuǎn)為實(shí)例方法和類方法。

C++語言 旨在保留與C語言的完整兼容性,同時(shí)加入更高級(jí)別的特性,如對(duì)原生面向?qū)ο缶幊痰闹С趾突?a >模板的元編程。它的冗余和復(fù)雜性已是臭名昭著(雖然2011版語言標(biāo)準(zhǔn)更新解決了許多糟糕的問題),但它也是很多環(huán)境下的備選開發(fā)語言,包括3D建模圖像引擎和跨平臺(tái)應(yīng)用開發(fā)框架Qt。

D語言 也很有趣,它與C++的關(guān)系就如同Rust與C的關(guān)系:因?yàn)镈語言的目的是保持C++最理想的特性,同時(shí)也避免許多問題(如缺少內(nèi)存安全)。與Rust不同,D語言不是從零開始設(shè)計(jì)的一門新語言——而是C++的親密衍生物,并且它并不像C++那樣是C語言的一個(gè)超集,它卻又遵循設(shè)計(jì)原則,任何屬于C和D語言公共子集的代碼必須在兩種語言中有相同的行為方式。

學(xué)習(xí)以上一種語言能夠洞察將高級(jí)語言的特性與底層C語言運(yùn)行模型融合的復(fù)雜之處。學(xué)習(xí)C++對(duì)于用Python操作現(xiàn)有C++編寫的庫和工具也很有幫助。

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

面向數(shù)組編程的設(shè)計(jì)目標(biāo)是支持?jǐn)?shù)值編程模型:那些基于矩陣的運(yùn)算和其它相關(guān)的數(shù)值計(jì)算。

盡管Python的標(biāo)準(zhǔn)庫并不直接支持這項(xiàng)功能,面向數(shù)組的編程確實(shí)是在語言設(shè)計(jì)之時(shí)被納入考慮的,增加了大量的語法和語義特點(diǎn),使得第三方庫 Numpy 和類似的面向數(shù)組工具受益頗多。

在很多情況下, Scientific Python  被當(dāng)做是MATLAB商業(yè)軟件的備選項(xiàng),后者被廣泛用于科學(xué)和工程上的建模、仿真以及數(shù)值數(shù)據(jù)分析。 GNU Octave 是語法上兼容Matlab代碼的開源替代產(chǎn)品,它允許人們比較和對(duì)比兩種面向數(shù)組的編程方式。

Julia語言 是另一款相對(duì)較新的語言,它重點(diǎn)專注于面向數(shù)組的編程和基于類型的函數(shù)重載。

學(xué)習(xí)上述語言中的一門能夠?qū)cientific Python的功能有充分的掌握,提供了探索硬件層面并行計(jì)算的機(jī)會(huì)(如借助OpenCLojure和Nvidia的CUDA等技術(shù))和分布式數(shù)據(jù)處理的的能力(如利用Apache Spark 和為Python定制的 Blaze 等技術(shù))。

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

隨著訪問大數(shù)據(jù)集需求的增長,對(duì)分析這些大數(shù)據(jù)的免費(fèi)工具的需求也隨之增長。其中一種工具就是R語言 ,它主要針對(duì)數(shù)據(jù)的統(tǒng)計(jì)分析和可視化。

學(xué)習(xí)R語言就像是深入了解Scientific Python的統(tǒng)計(jì)分析能力,尤其是數(shù)據(jù)處理函數(shù)庫 pandas 和統(tǒng)計(jì)可視化庫 seaborn 

計(jì)算管道模型:Haskell、Scala、Clojure、F#

面向?qū)ο蟮臄?shù)據(jù)模型和面向數(shù)組的數(shù)據(jù)處理著眼于在靜態(tài)環(huán)境下構(gòu)建數(shù)據(jù)模型,或是以帶有標(biāo)簽屬性數(shù)據(jù)集合的形式,或是包含結(jié)構(gòu)化數(shù)據(jù)數(shù)組的形式。

相反,函數(shù)式編程語言強(qiáng)調(diào)動(dòng)態(tài)地構(gòu)建數(shù)據(jù)模型,通常是以計(jì)算流的形式。學(xué)習(xí)函數(shù)式編程的基礎(chǔ)對(duì)數(shù)據(jù)轉(zhuǎn)換操作的結(jié)構(gòu)改善大有裨益,即使是應(yīng)用在過程式、面向?qū)ο蠡蚴敲嫦驍?shù)組的應(yīng)用上也有效。

Haskell 語言是一款函數(shù)式編程語言,它對(duì)Python的設(shè)計(jì)有著顯著的影響,最著名的就是來自Python 2.0中關(guān)于 list comprehensions 的介紹。

Scala 語言是一款JVM上的函數(shù)式(有爭議)編程語言,與Java、Python和R一起,是Apache Spark數(shù)據(jù)分析平臺(tái)上所使用的四種主要編程語言。盡管是按照鼓勵(lì)用函數(shù)式編程方式來設(shè)計(jì),Scala的語法、數(shù)據(jù)模型、執(zhí)行模型的設(shè)計(jì)都是為了盡可能減小現(xiàn)在的Java程序員的學(xué)習(xí)成本(因此也就存在爭議—— Scala更應(yīng)該算是一種有強(qiáng)大函數(shù)式編程支持的面向?qū)ο缶幊陶Z言)。

Clojure 是另一款JVM上的函數(shù)式編程語言,它算是 Lisp 的一種變種。它能夠在此列表中贏得一席之地歸因于它是Python的 toolz 函數(shù)式編程工具箱的靈感來源。

F# 語言 我自己并不熟悉,但作為 .NET CRL推崇的函數(shù)式編程語言似乎也值得提一筆。

學(xué)習(xí)這些語言中的一門能夠深入了解Python自身的計(jì)算管道模型工具,包括容器,生成器,生成器表達(dá)式,以及functools和itertools的標(biāo)準(zhǔn)庫模塊,和 toolz 等第三方Python工具包。

事件驅(qū)動(dòng)型編程:Javascript, Go, Erlang, Elixir

計(jì)算管道是處理數(shù)據(jù)轉(zhuǎn)換和分析問題的一種出色方法,但很多問題需要應(yīng)用能提供持續(xù)的服務(wù),以等待事件的發(fā)生,然后處理那些事件。在這類服務(wù)中,為了同時(shí)對(duì)付多個(gè)用戶(或者至少是多個(gè)行為),能同時(shí)處理多個(gè)事件通常是基本要求。

Javascript 語言期初是為網(wǎng)頁瀏覽器設(shè)計(jì)的事件處理語言,允許網(wǎng)站開發(fā)者能在本地響應(yīng)客戶端的行為(例如鼠標(biāo)點(diǎn)擊和按鍵)和事件(例如頁面渲染完成)。它被所有現(xiàn)代瀏覽器所支持,并與HTML5 DOM一起,成為定義用戶界面展示和行為的標(biāo)準(zhǔn)。

Go 語言 是是Google為網(wǎng)頁瀏覽器設(shè)計(jì)的專用語言,用來創(chuàng)建高度可擴(kuò)展化網(wǎng)絡(luò)服務(wù),它也被證明是開發(fā)命令行應(yīng)用的強(qiáng)大語言。從編程語言設(shè)計(jì)角度來看,Go語言最吸引人的方面是它在核心同步模型中采用了 通信順序過程 (Communicating Sequential Processes)的概念。

Erlang 語言是EriCSSon設(shè)計(jì)的專用語言,用于發(fā)明高可靠性的電話交換機(jī)和類似器件,也是廣為使用的消息管理器 RabbitMQ 的開發(fā)語言。Erlang使用 參與者模式 (Actor model)作為其核心并發(fā)原語,線程間的通信只能靠傳遞消息,而不允許它們直接共享數(shù)據(jù)。盡管我自己從未用Erlang語言寫過程序,我的第一份全職工作就用到了(以及開發(fā))一個(gè)前Ericsson工程師寫的C++版Actor-based并發(fā)框架,并且基于德州儀器的輕量級(jí) DSP/BIOS 環(huán)境(現(xiàn)為TI-RTOS)下的TSK(任務(wù))和MBX(郵箱),我自己也開發(fā)了一套類似的框架。

Elixir語言 上榜的緣由是它是一款運(yùn)行在Erlang虛擬機(jī)上的語言,與Erlang一樣具有并發(fā)的特性,同時(shí)也額外提供了豐富的語言層面的特色來營造一個(gè)更便捷的環(huán)境,吸引更多的開發(fā)者從Python、Java或者Ruby等語言轉(zhuǎn)來投奔這里。

學(xué)習(xí)這些語言中的一門就如洞察Python本身的同步機(jī)制和并行化支持,包括原生協(xié)程、基于生成器的協(xié)程、concurrent.futures和asyncio的標(biāo)準(zhǔn)庫模塊,如 Twisted 和 Tornado 等第三方網(wǎng)絡(luò)服務(wù)開發(fā)框架,被引入Django的 channels 概念,以及GUI框架下的事件處理循環(huán)。

漸進(jìn)式類型:TypeScript

Python 3.5 引入最有爭議的特性之一就屬新的typing模塊,它將漸進(jìn)式類型支持(gradual typing support)的標(biāo)準(zhǔn)帶到了Python生態(tài)圈內(nèi)。

對(duì)于那些主要從C、C++和Java等語言接觸靜態(tài)類型的人們而言,這似乎是一個(gè)令人震驚的壞想法(因此遭受爭議)

Microsoft的 TypeScript 語言為JavaScript提供了可選的靜態(tài)類型,它是這個(gè)概念(gradual typing)更形象的解釋。TypeScript代碼編譯為JavaScript代碼(隨后不再做運(yùn)行時(shí)類型檢查),并且TypeScript對(duì)于流行的JavaScript庫的注釋都保存在專屬的 DefinitelyTyped 代碼庫中。

正如Chris Neugebauer在他的 澳洲PyCon演講 中指出的那樣,這很像是Python 與類型提示庫typeshed 以及類似 mypy 那樣的類型推導(dǎo)和分析工具之間的關(guān)系。

從本質(zhì)上看,TypeScript和Python中的類型提示都屬于編寫特定測試用例的方法,不論是寫成獨(dú)立的文件(常規(guī)測試用例),還是嵌入代碼的主題之中(如靜態(tài)編程語言的類型聲明)。無論何種情況,你都運(yùn)行一個(gè)單獨(dú)的命令來檢查剩余的代碼是否和類型聲明保持一致(對(duì)于TypeScript,這隱式地作為JavaScript編譯的一個(gè)部分,對(duì)于Python的類型提示,這則是可選的靜態(tài)分析任務(wù))。

動(dòng)態(tài)源程序:Hy, Ruby

從C、C++、C#和Java之類語言轉(zhuǎn)來的人們往往會(huì)對(duì)Python的一種特性感到不安,就是“代碼即數(shù)據(jù)”:事實(shí)上,函數(shù)和類都是運(yùn)行時(shí)對(duì)象,能像其它對(duì)象一樣被操作。

Hy語言 是Lisp的一種變種,運(yùn)行在CPython虛擬機(jī)和PyPy虛擬機(jī)上。Lisp的變種語言將“代碼即數(shù)據(jù)”的概念發(fā)揮到了極致,因?yàn)長isp代碼自身也是由描述要執(zhí)行操作的嵌套列表組成(其名字就源自”LISt Processor”)。List風(fēng)格語言的強(qiáng)大之處在于它們使你寫自己的領(lǐng)域特定語言(DSL)變得異常容易。而最大的弱點(diǎn)在于由于寫自己的領(lǐng)域特定語言變得非常容易,有時(shí)候閱讀別人的代碼將會(huì)非常吃力。

Ruby語言 是一門與Python在許多方面都相似的語言,它的社區(qū)在使用動(dòng)態(tài)元編程方面更加開放,相對(duì)而言Python社區(qū)則是“支持,但不鼓勵(lì)”。這包括重新定義類添加額外的方法,以及使用閉包實(shí)現(xiàn)類似迭代的核心語言結(jié)構(gòu)。

學(xué)習(xí)以上一門語言將對(duì)Python自身的動(dòng)態(tài)元編程支持有更深的理解,包括函數(shù)和類的修飾,拼湊代碼來修改邏輯( monkeypatching ),unittest.mock標(biāo)準(zhǔn)庫模塊和諸如 wrapt 的第三方對(duì)象代理模塊。(我不清楚學(xué)習(xí)哪一門語言有助于了解Python的元類(metaclass)系統(tǒng),若是有人在這方面有任何建議,歡迎在評(píng)論區(qū)留言。元類支持的特性包括核心類型、抽象基類、枚舉類型和漸進(jìn)式表達(dá)式的運(yùn)行時(shí)執(zhí)行。)

實(shí)際問題解決:Lua, php, Perl

普遍流行的編程語言并不是獨(dú)立地存在——它們屬于更大生態(tài)系統(tǒng)的一部分,其中包括再分配者(redistributors,商業(yè)和社區(qū)都有)、終端用戶、框架開發(fā)者、工具開發(fā)者、教育工作者等等。

Lua語言 是一門流行的編程語言,常用做腳本引擎嵌入在大型應(yīng)用中。典型的例子包括它是編寫魔獸爭霸游戲客戶端插件的語言,被嵌入到很多Linux發(fā)行版所使用的RPM工具中。相比起CPython,Lua的運(yùn)行時(shí)大小只有十分之一,而且它的弱內(nèi)?。╥ntrospection)能力通常使它更易于與應(yīng)用的剩余部分和主機(jī)操作系統(tǒng)隔離。Lua社區(qū)對(duì)Python生態(tài)圈的一項(xiàng)突出貢獻(xiàn)就是CPython和PyPy采用LuaJit FFI (Foreign Function Interface)作為其JIT友好的 cffi 接口庫的基礎(chǔ)。

PHP語言 是另一門流行的編程語言,由于它專攻生成HTML頁面,且被早期的虛擬專用服務(wù)器托管服務(wù)提供商廣泛支持,其首字母“P”是 LAMP stack(Linux-Apache-MySQL-PHP)中的“P”繼而廣為人知。因?yàn)槠湓谠O(shè)計(jì)方面諸多令人絕望的概念性缺陷,它被視作是目前多款開源web服務(wù)的基石,包括內(nèi)容管理系統(tǒng)Drupal,博客引擎Wordpress, 以及為維基百科服務(wù)的MediaWiki引擎。PHP也支撐許多重要服務(wù),比如眾包社區(qū)(crowdsourced community)所使用的分布式事件報(bào)告平臺(tái) Ushahidi 

與PHP一樣, Perl語言 也是在Linux的基礎(chǔ)上流行開來的。但和PHP不同的是,Perl并沒有發(fā)展成網(wǎng)絡(luò)開發(fā)的專用平臺(tái),而是因系統(tǒng)管理員工具而出名,不僅能使用正則表達(dá)式處理字符串,還能處理Linux操作系統(tǒng)命令的輸出內(nèi)容。當(dāng)sh、awk和sed已經(jīng)無法再勝任時(shí),Perl則擔(dān)負(fù)起重任。

學(xué)習(xí)上述一門語言似乎并不有助于洞察美學(xué)上美觀、概念上簡練的程序語言設(shè)計(jì)??赡艿膸椭谟诶斫饩幊陶Z言如何在實(shí)際工作中被使用,以及使用再分布器又會(huì)有有多少偶然機(jī)會(huì)、歷史巧合的成分,而不是語言本身繼承而來的能力。

尤其是,它讓我們明白一些項(xiàng)目的意義,如 CKAN 、 OpenStack NFV 、 Blender 、 SciPy 、OpenMDAO 、 PyGMO 、 PyCUDA 、 Raspberry Pi Foundation 和 大量商業(yè)組織的Python項(xiàng)目 ,后者確保Python生態(tài)圈能獲得持續(xù)的慈善投資。

計(jì)算式思維:Scratch, Logo

最后,我經(jīng)常會(huì)參與函數(shù)式編程和面向?qū)ο缶幊讨鲝堈叩挠懻摚麄兟暦Q這些語言和過程式編程一樣容易學(xué)習(xí)。

當(dāng)我們談?wù)撏ㄟ^具體實(shí)例計(jì)算(如機(jī)器人)的教學(xué)時(shí),我贊同面向?qū)ο缶幊痰娜怂值挠^點(diǎn),因?yàn)檐浖薪5膶?duì)象在實(shí)際生活中有學(xué)生們能感觸到的對(duì)應(yīng)模塊,如傳感器、電機(jī)和繼電器。

對(duì)于其它人而言,我現(xiàn)在有一項(xiàng)挑戰(zhàn):拿起一本食譜,用你認(rèn)為易學(xué)的編程語言翻譯其中一個(gè)菜譜,然后讓一名能掌握原語言的學(xué)生照著翻譯后的菜譜做。大多數(shù)時(shí)候,人們并不真的需要按照上述去做——只需要在大腦中假象一次思維實(shí)驗(yàn)就足以讓他們意識(shí)到想掌握這“易學(xué)”的語言需要多少預(yù)備知識(shí)。(我真心期待學(xué)術(shù)研究員真的能進(jìn)行這個(gè)實(shí)驗(yàn)——并且發(fā)自內(nèi)心地想得到答案。)

然而解決這個(gè)問題的另一種途徑是去學(xué)習(xí)真正用來教育孩子們計(jì)算式思維的語言。

其中一種最流行的莫過于 Scratch 語言,它提供拖拽的編程接口讓學(xué)生們操作一個(gè)獨(dú)立的圖形化環(huán)境,其中有精靈來回漂浮,并響應(yīng)學(xué)生們的操作。諸如Scratch的圖形化環(huán)境類似于我們幫助孩子們閱讀和書寫的連環(huán)畫冊(cè)。

使用定制的教學(xué)語言來操作圖形化環(huán)境的想法并不算新穎,早在1960年代 Logo 環(huán)境就是當(dāng)時(shí)早期的經(jīng)典之一。

在Logo里(以及類似的環(huán)境比如Python的turtle模塊),你主要的交互對(duì)象就是一只“海龜”,可以讓它來回移動(dòng)或是畫線條改變它的環(huán)境。諸如命令序列(command sequence)、重復(fù)(repetition)和狀態(tài)(state,如收起畫筆、放下畫筆)的概念就以一種建立在人們自然直觀的思維方式被引入。(“設(shè)想你就是那只海龜,如果你向右轉(zhuǎn)90度將會(huì)發(fā)生什么呢?”)

作為一名經(jīng)驗(yàn)豐富的程序員,回過頭再重新學(xué)習(xí)上述一門編程語言則是獲取新感想的最有效方式:這些語言所涵蓋的概念提醒著我們,這都是些我們現(xiàn)在看來理所當(dāng)然的概念,但是初學(xué)者卻需要在某個(gè)階段學(xué)習(xí)它們。當(dāng)我們這么做的時(shí)候,我們與學(xué)生以及其他的初學(xué)者的溝通合作將會(huì)更加有效率,因?yàn)槲覀兏菀谆叵肫鹫麄€(gè)邏輯鏈條,包括那些我們之前認(rèn)為理所當(dāng)然而省略的思維步驟。

全能程序員交流QQ群290551701,群內(nèi)程序員都是來自,百度、阿里、京東、小米、去哪兒、餓了嗎、藍(lán)港等高級(jí)程序員 ,擁有豐富的經(jīng)驗(yàn)。加入我們,直線溝通技術(shù)大牛,最佳的學(xué)習(xí)環(huán)境,了解業(yè)內(nèi)的一手的資訊。如果你想結(jié)實(shí)大牛,那 就加入進(jìn)來,讓大牛帶你超神!


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 茌平县| 颍上县| 沙河市| 新乡市| 盐津县| 辰溪县| 六安市| 永州市| 永善县| 开鲁县| 东平县| 岳阳市| 绵竹市| 延边| 红原县| 恩平市| 东乡族自治县| 阳城县| 黎川县| 富宁县| 诏安县| 佳木斯市| 曲麻莱县| 西峡县| 浮山县| 岳池县| 泸溪县| 维西| 峨山| 翁牛特旗| 磐石市| 淳化县| 峨眉山市| 阿拉善盟| 荣成市| 金阳县| 清远市| 平昌县| 新河县| 根河市| 白城市|