偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

為什么我們需要更好的編程語(yǔ)言?

開(kāi)發(fā) 后端
每一種新語(yǔ)言的誕生所帶來(lái)的創(chuàng)新,都能造福我們每一個(gè)人。但是有時(shí)也有不利的一面。有些人可能寫(xiě)了一些非常有用的開(kāi)源JavaScript庫(kù),但是從事Python的開(kāi)發(fā)者卻完全沒(méi)法用。他們不得不自己寫(xiě)一個(gè)Python版本的函數(shù)庫(kù),或者用JavaScript重寫(xiě)所有代碼。再想想當(dāng)前有多少種語(yǔ)言和框架。

[[231044]]

我一直在告訴別人:“編程非常了不起。”在你有任何想法的時(shí)候,都可以編寫(xiě)軟件,然后愿望就實(shí)現(xiàn)了。這很真實(shí)。與建立物理的東西不同,首先你需要建立整個(gè)工廠,而軟件的擴(kuò)張相對(duì)非常容易。你可以找到所有已經(jīng)編譯好的組件,而且是免費(fèi)的,拿來(lái)就可以用。建立好一段代碼后,就可以重復(fù)使用無(wú)數(shù)次,而無(wú)需花錢。聽(tīng)起來(lái)很厲害的樣子。

但有時(shí)候不是這樣的。編程帶給人的驚喜只是暫時(shí)的。在建立了很多代碼以后,在寫(xiě)代碼的過(guò)程中你會(huì)不斷遇到讓人迷惑的錯(cuò)誤。一旦你習(xí)慣了特定語(yǔ)言和框架的模式后,一旦你需要第二種天性去掌握所選語(yǔ)言中非自然的語(yǔ)法時(shí),編程的偉大之處就不復(fù)存在了。

更別提我們有無(wú)數(shù)種不同的編程語(yǔ)言。每當(dāng)開(kāi)發(fā)人員面對(duì)特殊語(yǔ)言的語(yǔ)法而深感沮喪時(shí),他們都會(huì)想“為什么我們不能創(chuàng)建一種新的語(yǔ)言改正這個(gè)問(wèn)題呢?”有些人還真的這么做了,很幸運(yùn)的是自然選擇已經(jīng)淘汰了很多很差的語(yǔ)言(有時(shí)也有意外,比如至今PHP還存在)。一旦一門新的語(yǔ)言開(kāi)始在一群開(kāi)發(fā)者中流行起來(lái),那么恭喜你 ,現(xiàn)在又出現(xiàn)了一個(gè)新的開(kāi)發(fā)者社區(qū),他們互相合作,努力讓這門特殊的語(yǔ)言發(fā)展壯大。

每一種新語(yǔ)言的誕生所帶來(lái)的創(chuàng)新,都能造福我們每一個(gè)人。但是有時(shí)也有不利的一面。有些人可能寫(xiě)了一些非常有用的開(kāi)源JavaScript庫(kù),但是從事Python的開(kāi)發(fā)者卻完全沒(méi)法用。他們不得不自己寫(xiě)一個(gè)Python版本的函數(shù)庫(kù),或者用JavaScript重寫(xiě)所有代碼。再想想當(dāng)前有多少種語(yǔ)言和框架。如果你不覺(jué)得這很荒謬的話,那只能說(shuō)明或許你在軟件開(kāi)發(fā)這一行太長(zhǎng)時(shí)間,已經(jīng)習(xí)以為常了。

語(yǔ)言都包含些什么?

各種編程語(yǔ)言都在以下三個(gè)方面上有著很大的不同:語(yǔ)法、語(yǔ)義和標(biāo)準(zhǔn)庫(kù)。

沒(méi)錯(cuò),我知道,我過(guò)于簡(jiǎn)化它們了,但是聽(tīng)我給你解釋。

1. 語(yǔ)法

如果不遵循語(yǔ)法,那么你會(huì)在編輯器中看到各種彎彎曲曲的紅線,而且你的代碼也無(wú)法通過(guò)編譯器或解釋器。

JavaScript使用大括號(hào),布爾型使用小寫(xiě)的true和false,用//表示行注釋。

 

  1. function doSomething() { 
  2.   a = true
  3.   if (a) { 
  4.     ... // Do something. 
  5.   } 

Python用縮進(jìn),布爾型用首字母大寫(xiě)的True和False表示,用#表示行注釋。

 

  1. def doSomething(): 
  2.   a = True 
  3.   if a: 
  4.     ... # Do something. 

Haskell又有完全不同的語(yǔ)法:

 

  1. doSomething :: IO () 
  2. doSomething = do 
  3.   let a = True 
  4.   if a 
  5.     then ... -- Do something. 
  6.     else return () 

2.語(yǔ)義

所有編程語(yǔ)言都有大多數(shù)相同的特征:變量賦值、數(shù)字相加、字符串操作、調(diào)用函數(shù)、等等。

然而,每種語(yǔ)言都有特殊的思想,以特定的方式運(yùn)行??梢詫⑺鼈儎澐殖刹煌哪J?命令式、面向?qū)ο?、函?shù)式),但是即便是兩個(gè)相同模式的編程語(yǔ)言在細(xì)節(jié)上也是完全不同的。

在“聲明類”,“調(diào)用函數(shù)”,或“定義參數(shù)的類型”時(shí),你定義了程序的語(yǔ)義。有些語(yǔ)言遵循這樣一套規(guī)則,而其他的遵循別的規(guī)則。比如:C++中聲明的類可以延伸到多個(gè)類。當(dāng)你使用“+”將數(shù)字和字符串加到一起的時(shí)候,根據(jù)語(yǔ)言的語(yǔ)義會(huì)得出不同的結(jié)果。一些編程語(yǔ)言會(huì)因?yàn)轭愋筒黄ヅ涠鴮?dǎo)致編譯失敗,但是有些編程語(yǔ)言會(huì)自動(dòng)將數(shù)字轉(zhuǎn)換成十進(jìn)制的字符串。

語(yǔ)法與語(yǔ)義的關(guān)系就相當(dāng)于用單詞(語(yǔ)法)來(lái)表達(dá)想法(語(yǔ)義)。你可以通過(guò)語(yǔ)言的語(yǔ)法來(lái)表達(dá)語(yǔ)義。

3.標(biāo)準(zhǔn)庫(kù)

***,每種語(yǔ)言都有各自的軟件包,我們稱之為“標(biāo)準(zhǔn)庫(kù)”。

在Python中,你可以調(diào)用如下函數(shù):

  • print():在控制臺(tái)輸出信息
  • len():返回?cái)?shù)組的長(zhǎng)度
  • 以及各種實(shí)用的模塊,例如:json,threading,等等
  • 在JavaScript中,你可以使用console.log()代替print(),可以訪問(wèn)Object、Array等類。

標(biāo)準(zhǔn)庫(kù)是一門語(yǔ)言中重要的組成部分。它可以為語(yǔ)言帶來(lái)活力,沒(méi)有標(biāo)準(zhǔn)庫(kù),你無(wú)法簡(jiǎn)單地做出任何東西。

很諷刺的是,并沒(méi)有“標(biāo)準(zhǔn)的標(biāo)準(zhǔn)庫(kù)”。每個(gè)標(biāo)準(zhǔn)庫(kù)基本上都不同于其他庫(kù):一些庫(kù)只提供***限度的方法,而有些庫(kù)則提供非常廣泛的函數(shù),所以開(kāi)發(fā)人員基本上不需要依賴任何第三方庫(kù)。

基本的想法

以上我們介紹了一門語(yǔ)言的構(gòu)成,接下來(lái)我有一個(gè)基本的想法:我們是否可以找到一種方法清晰地分割語(yǔ)法、語(yǔ)義和標(biāo)準(zhǔn)庫(kù)呢?我們又如何實(shí)現(xiàn)這一想法呢?

***步:只有程序員關(guān)心語(yǔ)法

我想解決的***個(gè)問(wèn)題就是語(yǔ)法。編譯器和解釋器擁有更加有效的方式表現(xiàn)代碼,我們稱之為抽象語(yǔ)法樹(shù)。我們用代碼描述的內(nèi)容最終可以用如下抽象語(yǔ)法樹(shù)表示:

 

為什么我們需要更好的編程語(yǔ)言?

圖:歐幾里得算法的抽象語(yǔ)法樹(shù)

如果仔細(xì)觀察,你會(huì)發(fā)現(xiàn)上述語(yǔ)法樹(shù)可能來(lái)自多個(gè)語(yǔ)言。是Python?是JavaScript?還是C++?這都無(wú)所謂:所有這些語(yǔ)言都擁有同一個(gè)語(yǔ)法樹(shù)。

當(dāng)然,現(xiàn)實(shí)的例子會(huì)更加復(fù)雜。這就是為什么我們用文本寫(xiě)代碼的原因:更加緊湊,更加易于書(shū)寫(xiě),還有更加易于閱讀(有人可能有不同的看法)。從編程誕生的***天,我們采用的就是這種方法,很少有人對(duì)此質(zhì)疑。

對(duì)于一個(gè)更加現(xiàn)實(shí)的例子來(lái)說(shuō),抽象語(yǔ)法樹(shù)會(huì)描述所選語(yǔ)言的語(yǔ)義(例如:類的定義)。但是擁有類似語(yǔ)義的語(yǔ)言之間還是可以共享同一個(gè)抽象語(yǔ)法樹(shù),并可以擴(kuò)展到一定范圍。這非常實(shí)用,因?yàn)槟憧梢宰詣?dòng)轉(zhuǎn)化部分代碼。

所以,我們可以把語(yǔ)法想象成抽象語(yǔ)法樹(shù)之上的人類思維。代碼可能并不會(huì)以文本的形式存儲(chǔ)在任何地方,僅在文本編輯器內(nèi)。如果你想在特殊的語(yǔ)言上使用不同的語(yǔ)法,也完全可以。這不會(huì)影響到別人。

我其實(shí)有點(diǎn)驚訝怎么沒(méi)有一種工具可以將代碼從一種語(yǔ)言轉(zhuǎn)換成另一種語(yǔ)言,這完全可行啊。我猜肯定有人試過(guò),但是放棄了,因?yàn)槿绻粚⒄麄€(gè)標(biāo)準(zhǔn)庫(kù)轉(zhuǎn)換過(guò)去的話是沒(méi)有實(shí)用性的。很明顯,我也在做這方面的嘗試。

第二步. 將標(biāo)準(zhǔn)庫(kù)抽象成API

API是一個(gè)非常高明的概念。每個(gè)軟件都可以通過(guò)API與其他軟件溝通。移動(dòng)端的應(yīng)用可以通過(guò)API與服務(wù)器交流。服務(wù)器可以通過(guò)API與數(shù)據(jù)庫(kù)交流。每個(gè)人都可以通過(guò)API與他人對(duì)話。這是一件很酷的事情。

為什么我要在這里討論API?因?yàn)檫@正是我們所需要的。API是語(yǔ)言的媒介。它們是一套語(yǔ)義,可以描述一個(gè)特殊代碼模塊對(duì)外提供的功能。無(wú)論是函數(shù)庫(kù),HTTP服務(wù)器,或是別的。

聲明API的方式多種多樣。可以是NPM上的JavaScript模塊,并在README文件內(nèi)提供API文檔。也可以是代碼中明確聲明的API,比如TypeScript模塊。也有可能并沒(méi)有API的聲明,也沒(méi)有清晰的文檔。

但是重要的是:API聲明了代碼模塊的”對(duì)外接口“,你可以用其他語(yǔ)言重寫(xiě)模塊內(nèi)部的代碼,但API不會(huì)發(fā)生改變。這就是API的魅力所在。雖然編程語(yǔ)言一團(tuán)糟,但是API很酷。

前面我們提到了標(biāo)準(zhǔn)庫(kù),并說(shuō)了各個(gè)語(yǔ)言都擁有完全不同的標(biāo)準(zhǔn)庫(kù)。如果我們能想個(gè)辦法將標(biāo)準(zhǔn)庫(kù)抽象出來(lái),做成干凈利落的API,那么我們就可以解決這個(gè)問(wèn)題。雖然在語(yǔ)義上,調(diào)用print(“Hello”)與Java調(diào)用System.out.println(“Hello”)不同,但是其實(shí)它們可以是同一個(gè)API。

我們有兩種方法可以解決這個(gè)問(wèn)題。要么我們讓大家都不要再使用標(biāo)準(zhǔn)庫(kù)了,轉(zhuǎn)而使用我們的“API層”?;蛘呶覀兛梢宰層?jì)算機(jī)自動(dòng)推斷你使用的代碼。我并不看好“說(shuō)服大家改變他們的方式”,所以我會(huì)選擇后一種方法。

我們不用為編程語(yǔ)言的標(biāo)準(zhǔn)庫(kù)中的每個(gè)函數(shù)都提供API。一般我們只可能用到標(biāo)準(zhǔn)庫(kù)中的幾個(gè)函數(shù)。我們可以自動(dòng)將這些代碼從一種語(yǔ)言轉(zhuǎn)換到另一種語(yǔ)言。然后,我們只需要每個(gè)開(kāi)發(fā)都用這些API替換具體的標(biāo)準(zhǔn)庫(kù)的調(diào)用。不用擔(dān)心,計(jì)算機(jī)依然需要你,至少現(xiàn)在需要。

第三步:把所有東西都做成API

現(xiàn)在我們有了干凈的代碼模塊定義的純粹的語(yǔ)義,并將與標(biāo)準(zhǔn)庫(kù)的交互抽象成了API。

下一步做什么?創(chuàng)建API。

現(xiàn)今的代碼庫(kù)有多個(gè)文件構(gòu)成,彼此之間通過(guò)“import語(yǔ)句”互相引用。這對(duì)于我們來(lái)說(shuō)很便利,但是這也意味著我們需要在腦海中勾畫(huà)代碼庫(kù)的結(jié)構(gòu)。任何一個(gè)地方發(fā)生小的變化,都可能在不經(jīng)意期間給別的地方帶來(lái)破壞性的影響,尤其是如果我們沒(méi)有做好自動(dòng)測(cè)試的話。而且,代碼庫(kù)會(huì)不斷增長(zhǎng),而編譯的時(shí)間會(huì)逐漸加長(zhǎng)。

也許有更好的方法解決這個(gè)問(wèn)題。比如模塊化就是個(gè)好辦法。

我之前寫(xiě)過(guò)關(guān)于模塊化的文章(點(diǎn)擊這里查看:https://medium.com/@fwouts/the-zenc-master-plan-c693bf3b265e),基本上來(lái)說(shuō):每段獨(dú)立的代碼都應(yīng)該抽象成API。我稱之為模塊。你無(wú)需在意一個(gè)具體的模塊使用什么語(yǔ)言編寫(xiě)的。在寫(xiě)模塊的時(shí)候,你不用導(dǎo)入這些文件。實(shí)際上,這時(shí)文件已不復(fù)存在。你可以直接使用API,它們會(huì)自動(dòng)加載這些功能。

模塊有什么好處?

  1. 可以鼓勵(lì)大家考慮設(shè)計(jì):首先你需要設(shè)計(jì)API
  2. 可以降低認(rèn)知的開(kāi)銷:你僅需要“填空”
  3. 簡(jiǎn)化測(cè)試:你只需測(cè)試API,并可以模擬所有的依賴性
  4. 世界會(huì)變得更加美好:沒(méi)有了語(yǔ)言之間的壁壘,沒(méi)有了巨大的代碼庫(kù);程序員更加快樂(lè),客戶更加快樂(lè)

第四步:盡情享受

我不確定第三步之后會(huì)發(fā)生什么,但是我覺(jué)得所有人都會(huì)很滿意。

責(zé)任編輯:未麗燕 來(lái)源: 程序師
相關(guān)推薦

2022-12-12 07:30:59

編程語(yǔ)言架構(gòu)

2014-07-02 09:56:33

2014-11-19 10:05:26

編程

2012-04-11 09:19:08

Haskell編程

2023-02-10 08:58:46

2022-12-01 14:43:56

物聯(lián)網(wǎng)智慧城市

2020-04-06 14:45:22

云計(jì)算邊緣計(jì)算網(wǎng)絡(luò)

2025-06-24 02:00:00

5G-A運(yùn)營(yíng)商基站

2018-09-14 18:00:29

無(wú)損網(wǎng)絡(luò)

2023-09-05 09:49:03

2022-08-26 08:00:19

企業(yè)架構(gòu)IT

2019-08-05 08:42:37

物聯(lián)網(wǎng)IOT技術(shù)

2016-01-20 09:54:51

微服務(wù)架構(gòu)設(shè)計(jì)SOA

2015-08-03 10:40:45

動(dòng)效設(shè)計(jì)優(yōu)勢(shì)

2021-05-24 11:30:49

智能建筑IOT物聯(lián)網(wǎng)

2015-11-11 13:35:15

2023-01-11 16:22:07

2010-11-03 09:22:00

C語(yǔ)言

2016-09-27 21:25:08

Go語(yǔ)言Ken Thompso

2022-02-11 11:17:24

物聯(lián)網(wǎng)安全物聯(lián)網(wǎng)IOT
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)