閱讀更多
毫無疑問,不同的編程語言間存在著很多差異性。那么對于這種差異性開發者應如何解決?本文就來一探究竟。

以下為譯文:

我一直在告訴別人:“編程非常了不起。”在你有任何想法的時候,都可以編寫軟件,然后愿望就實現了。這很真實。與建立物理的東西不同,首先你需要建立整個工廠,而軟件的擴張相對非常容易。你可以找到所有已經編譯好的組件,而且是免費的,拿來就可以用。建立好一段代碼后,就可以重復使用無數次,而無需花錢。聽起來很厲害的樣子。

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

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

每一種新語言的誕生所帶來的創新,都能造福我們每一個人。但是有時也有不利的一面。有些人可能寫了一些非常有用的開源JavaScript庫,但是從事Python的開發者卻完全沒法用。他們不得不自己寫一個Python版本的函數庫,或者用JavaScript重寫所有代碼。再想想當前有多少種語言和框架。如果你不覺得這很荒謬的話,那只能說明或許你在軟件開發這一行太長時間,已經習以為常了。

語言都包含些什么?

各種編程語言都在以下三個方面上有著很大的不同:語法、語義和標準庫。

沒錯,我知道,我過于簡化它們了,但是聽我給你解釋。

1. 語法

如果不遵循語法,那么你會在編輯器中看到各種彎彎曲曲的紅線,而且你的代碼也無法通過編譯器或解釋器。

JavaScript使用大括號,布爾型使用小寫的true和false,用//表示行注釋。
function doSomething() {
  a = true;
  if (a) {
    ... // Do something.
  }
}

Python用縮進,布爾型用首字母大寫的True和False表示,用#表示行注釋。
def doSomething():
  a = True
  if a:
    ... # Do something.

Haskell又有完全不同的語法:
doSomething :: IO ()
doSomething = do
  let a = True
  if a
    then ... -- Do something.
    else return ()

2.語義

所有編程語言都有大多數相同的特征:變量賦值、數字相加、字符串操作、調用函數、等等。

然而,每種語言都有特殊的思想,以特定的方式運行。可以將它們劃分成不同的模式(命令式、面向對象、函數式),但是即便是兩個相同模式的編程語言在細節上也是完全不同的。

在“聲明類”,“調用函數”,或“定義參數的類型”時,你定義了程序的語義。有些語言遵循這樣一套規則,而其他的遵循別的規則。比如:C++中聲明的類可以延伸到多個類。當你使用“+”將數字和字符串加到一起的時候,根據語言的語義會得出不同的結果。一些編程語言會因為類型不匹配而導致編譯失敗,但是有些編程語言會自動將數字轉換成十進制的字符串。

語法與語義的關系就相當于用單詞(語法)來表達想法(語義)。你可以通過語言的語法來表達語義。

3.標準庫

最后,每種語言都有各自的軟件包,我們稱之為“標準庫”。

在Python中,你可以調用如下函數:
  • print():在控制臺輸出信息
  • len():返回數組的長度
  • 以及各種實用的模塊,例如:json,threading,等等
在JavaScript中,你可以使用console.log()代替print(),可以訪問Object、Array等類。

標準庫是一門語言中重要的組成部分。它可以為語言帶來活力,沒有標準庫,你無法簡單地做出任何東西。

很諷刺的是,并沒有“標準的標準庫”。每個標準庫基本上都不同于其他庫:一些庫只提供最低限度的方法,而有些庫則提供非常廣泛的函數,所以開發人員基本上不需要依賴任何第三方庫。

基本的想法

以上我們介紹了一門語言的構成,接下來我有一個基本的想法:我們是否可以找到一種方法清晰地分割語法、語義和標準庫呢?我們又如何實現這一想法呢?

第一步:只有程序員關心語法

我想解決的第一個問題就是語法。編譯器和解釋器擁有更加有效的方式表現代碼,我們稱之為抽象語法樹。我們用代碼描述的內容最終可以用如下抽象語法樹表示:

圖:歐幾里得算法的抽象語法樹

如果仔細觀察,你會發現上述語法樹可能來自多個語言。是Python?是JavaScript?還是C++?這都無所謂:所有這些語言都擁有同一個語法樹。

當然,現實的例子會更加復雜。這就是為什么我們用文本寫代碼的原因:更加緊湊,更加易于書寫,還有更加易于閱讀(有人可能有不同的看法)。從編程誕生的第一天,我們采用的就是這種方法,很少有人對此質疑。

對于一個更加現實的例子來說,抽象語法樹會描述所選語言的語義(例如:類的定義)。但是擁有類似語義的語言之間還是可以共享同一個抽象語法樹,并可以擴展到一定范圍。這非常實用,因為你可以自動轉化部分代碼。

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

我其實有點驚訝怎么沒有一種工具可以將代碼從一種語言轉換成另一種語言,這完全可行啊。我猜肯定有人試過,但是放棄了,因為如果不將整個標準庫轉換過去的話是沒有實用性的。很明顯,我也在做這方面的嘗試。

第二步. 將標準庫抽象成API

API是一個非常高明的概念。每個軟件都可以通過API與其他軟件溝通。移動端的應用可以通過API與服務器交流。服務器可以通過API與數據庫交流。每個人都可以通過API與他人對話。這是一件很酷的事情。

為什么我要在這里討論API?因為這正是我們所需要的。API是語言的媒介。它們是一套語義,可以描述一個特殊代碼模塊對外提供的功能。無論是函數庫,HTTP服務器,或是別的。

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

但是重要的是:API聲明了代碼模塊的”對外接口“,你可以用其他語言重寫模塊內部的代碼,但API不會發生改變。這就是API的魅力所在。雖然編程語言一團糟,但是API很酷。

前面我們提到了標準庫,并說了各個語言都擁有完全不同的標準庫。如果我們能想個辦法將標準庫抽象出來,做成干凈利落的API,那么我們就可以解決這個問題。雖然在語義上,調用print("Hello")與Java調用System.out.println("Hello")不同,但是其實它們可以是同一個API。

我們有兩種方法可以解決這個問題。要么我們讓大家都不要再使用標準庫了,轉而使用我們的“API層”。或者我們可以讓計算機自動推斷你使用的代碼。我并不看好“說服大家改變他們的方式”,所以我會選擇后一種方法。

我們不用為編程語言的標準庫中的每個函數都提供API。一般我們只可能用到標準庫中的幾個函數。我們可以自動將這些代碼從一種語言轉換到另一種語言。然后,我們只需要每個開發都用這些API替換具體的標準庫的調用。不用擔心,計算機依然需要你,至少現在需要。

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

現在我們有了干凈的代碼模塊定義的純粹的語義,并將與標準庫的交互抽象成了API。

下一步做什么?創建API。

現今的代碼庫有多個文件構成,彼此之間通過“import語句”互相引用。這對于我們來說很便利,但是這也意味著我們需要在腦海中勾畫代碼庫的結構。任何一個地方發生小的變化,都可能在不經意期間給別的地方帶來破壞性的影響,尤其是如果我們沒有做好自動測試的話。而且,代碼庫會不斷增長,而編譯的時間會逐漸加長。

也許有更好的方法解決這個問題。比如模塊化就是個好辦法。

我之前寫過關于模塊化的文章(點擊這里查看:https://medium.com/@fwouts/the-zenc-master-plan-c693bf3b265e),基本上來說:每段獨立的代碼都應該抽象成API。我稱之為模塊。你無需在意一個具體的模塊使用什么語言編寫的。在寫模塊的時候,你不用導入這些文件。實際上,這時文件已不復存在。你可以直接使用API,它們會自動加載這些功能。

模塊有什么好處?
  • 可以鼓勵大家考慮設計:首先你需要設計API
  • 可以降低認知的開銷:你僅需要“填空”
  • 簡化測試:你只需測試API,并可以模擬所有的依賴性
  • 世界會變得更加美好:沒有了語言之間的壁壘,沒有了巨大的代碼庫;程序員更加快樂,客戶更加快樂
第四步:盡情享受

我不確定第三步之后會發生什么,但是我覺得所有人都會很滿意。
  • 大小: 341.7 KB
  • 大小: 91.3 KB
來自: CSDN資訊
4
0
評論 共 5 條 請登錄后發表評論
5 樓 xingqi1058 2019-08-22 15:27
xingqi1058 寫道
xingqi1058 寫道
ss

說的很好
4 樓 xingqi1058 2019-08-22 15:27
xingqi1058 寫道
ss
3 樓 xingqi1058 2019-08-22 15:27
2 樓 xingqi1058 2019-08-22 15:22
[img] [/img]
1 樓 aa87963014 2018-07-24 09:42
非常贊同,現在的語言太多了語法又差異太大增加無謂的學習成本很惡心

發表評論

您還沒有登錄,請您登錄后再發表評論

相關推薦

  • 怎樣解決編程語言之間差異性問題?(轉載)

    -

  • 01 Java編程基礎

    1. Java語言概述 java語言的特性:①面向對象性 ②健壯性 ③跨平臺性(write once ,run anywhere)—JVM 河床好比操作底層,jdk好比是河水,java應用程序好比是船。 JVM (Java Virtual Machine) : 解決了不同操作系統之間的差異; JRE (Java Runtime Environment) : 包括java虛擬機 + 解釋器; JDK...

  • 大學四年自學走來,這些私藏的實用工具/學習網站我貢獻出來了

    大學四年,看課本是不可能一直看課本的了,對于學習,特別是自學,善于搜索網上的一些資源來輔助,還是非常有必要的,下面我就把這幾年私藏的各種資源,網站貢獻出來給你們。主要有:電子書搜索、實用工具、在線視頻學習網站、非視頻學習網站、軟件下載、面試/求職必備網站。 注意:文中提到的所有資源,文末我都給你整理好了,你們只管拿去,如果覺得不錯,轉發、分享就是最大的支持了。 一、電子書搜索 對于大部分程序員...

  • 【JSON解析】淺談JSONObject的使用

    簡介 在程序開發過程中,在參數傳遞,函數返回值等方面,越來越多的使用JSON。JSON(JavaScript Object Notation)是一種輕量級的數據交換格式,同時也易于機器解析和生成、易于理解、閱讀和撰寫,而且Json采用完全獨立于語言的文本格式,這使得Json成為理想的數據交換語言。 JSON建構于兩種結構: “名稱/值”對的集合(A Collection of name/va...

  • 程序員請照顧好自己,周末病魔差點一套帶走我。

    程序員在一個周末的時間,得了重病,差點當場去世,還好及時挽救回來了。

  • 卸載 x 雷某度!GitHub 標星 1.5w+,從此我只用這款全能高速下載工具!

    作者 | Rocky0429 來源 | Python空間 大家好,我是 Rocky0429,一個喜歡在網上收集各種資源的蒟蒻… 網上資源眼花繚亂,下載的方式也同樣千奇百怪,比如 BT 下載,磁力鏈接,網盤資源等等等等,下個資源可真不容易,不一樣的方式要用不同的下載軟件,因此某比較有名的 x 雷和某度網盤成了我經常使用的工具。 作為一個沒有錢的窮鬼,某度網盤幾十 kb 的下載速度讓我...

  • 只因接了一個電話,程序員被騙 30 萬!

    今天想給大家說一個剛剛發生在我身邊的一起真實的詐騙經歷,我的朋友因此被騙走30萬。注:為了保護當事人隱私,部分情節進行了修改。1平安夜突來的電話開始以為就像普通的詐騙一樣,想辦法讓你把錢...

  • 我一個37歲的程序員朋友

    周末了,人一旦沒有點事情干,心里就瞎想,而且跟幾個老男人坐在一起,更容易瞎想,我自己現在也是 30 歲了,也是無時無刻在擔心自己的職業生涯,擔心丟掉工作沒有收入,擔心身體機能下降,擔心突...

  • python自動下載圖片

    近日閑來無事,總有一種無形的力量縈繞在朕身邊,讓朕精神渙散,昏昏欲睡。 可是,像朕這么有職業操守的社畜怎么能在上班期間睡瞌睡呢,我不禁陷入了沉思。。。。 突然旁邊的IOS同事問:‘嘿,兄弟,我發現一個網站的圖片很有意思啊,能不能幫我保存下來提升我的開發靈感?’ 作為一個堅強的社畜怎么能說自己不行呢,當時朕就不假思索的答應:‘oh, It’s simple. Wait for me for a ...

  • 一名大專同學的四個問題

    【前言】   收到一封來信,趕上各種事情拖了幾日,利用今天要放下工作的時機,做個回復。   2020年到了,就以這一封信,作為開年標志吧。 【正文】   您好,我是一名現在有很多困惑的大二學生。有一些問題想要向您請教。   先說一下我的基本情況,高考失利,不想復讀,來到廣州一所大專讀計算機應用技術專業。學校是偏藝術類的,計算機專業沒有實驗室更不用說工作室了。而且學校的學風也不好。但我很想在計算機領...

  • 復習一周,京東+百度一面,不小心都拿了Offer

    京東和百度一面都問了啥,面試官百般刁難,可惜我全會。

  • Java 14 都快來了,為什么還有這么多人固守Java 8?

    從Java 9開始,Java版本的發布就讓人眼花繚亂了。每隔6個月,都會冒出一個新版本出來,Java 10 , Java 11, Java 12, Java 13, 到2020年3月份,...

  • 達摩院十大科技趨勢發布:2020 非同小可!

    【CSDN編者按】1月2日,阿里巴巴發布《達摩院2020十大科技趨勢》,十大科技趨勢分別是:人工智能從感知智能向認知智能演進;計算存儲一體化突破AI算力瓶頸;工業互聯網的超融合;機器間大規模協作成為可能;模塊化降低芯片設計門檻;規模化生產級區塊鏈應用將走入大眾;量子計算進入攻堅期;新材料推動半導體器件革新;保護數據隱私的AI技術將加速落地;云成為IT技術創新的中心 。 新的畫卷,正在徐徐展開。...

  • 輕松搭建基于 SpringBoot + Vue 的 Web 商城應用

    首先介紹下在本文出現的幾個比較重要的概念: 函數計算(Function Compute): 函數計算是一個事件驅動的服務,通過函數計算,用戶無需管理服務器等運行情況,只需編寫代碼并上傳。函數計算準備計算資源,并以彈性伸縮的方式運行用戶代碼,而用戶只需根據實際代碼運行所消耗的資源進行付費。Fun: Fun 是一個用于支持 Serverless 應用部署的工具,能幫助您便捷地管理函數計算、API ...

  • 講真,這兩個IDE插件,可以讓你寫出質量杠杠的代碼

    周末躺在床上看《拯救大兵瑞恩》 周末在閑逛的時候,發現了兩個優秀的 IDE 插件,據說可以提高代碼的質量,我就安裝了一下,試了試以后發現,確實很不錯,就推薦給大家。 01、Alibaba Java 代碼規范插件 《阿里巴巴 Java 開發手冊》,相信大家都不會感到陌生,其 IDEA 插件的下載次數據說達到了 80 萬次,我今天又貢獻了一次。嘿嘿。 該項目的插件地址: https://github....

  • Python+OpenCV實時圖像處理

    目錄 1、導入庫文件 2、設計GUI 3、調用攝像頭 4、實時圖像處理 4.1、閾值二值化 4.2、邊緣檢測 4.3、輪廓檢測 4.4、高斯濾波 4.5、色彩轉換 4.6、調節對比度 5、退出系統 初學OpenCV圖像處理的小伙伴肯定對什么高斯函數、濾波處理、閾值二值化等特性非常頭疼,這里給各位分享一個小項目,可通過攝像頭實時動態查看各類圖像處理的特點,也可對各位調參、測試...

  • 2020年一線城市程序員工資大調查

    人才需求 一線城市共發布崗位38115個,招聘120827人。 其中 beijing 22805 guangzhou 25081 shanghai 39614 shenzhen 33327 工資分布 2020年中國一線城市程序員的平均工資為16285元,工資中位數為14583元,其中95%的人的工資位于5000到20000元之間。 和往年數據比較: yea...

  • 為什么猝死的都是程序員,基本上不見產品經理猝死呢?

    相信大家時不時聽到程序員猝死的消息,但是基本上聽不到產品經理猝死的消息,這是為什么呢? 我們先百度搜一下:程序員猝死,出現將近700多萬條搜索結果: 搜索一下:產品經理猝死,只有400萬條的搜索結果,從搜索結果數量上來看,程序員猝死的搜索結果就比產品經理猝死的搜索結果高了一倍,而且從下圖可以看到,首頁里面的五條搜索結果,其實只有兩條才是符合條件。 所以程序員猝死的概率真的比產品經理大,并不是錯...

  • 害怕面試被問HashMap?這一篇就搞定了!

    聲明:本文以jdk1.8為主! 搞定HashMap 作為一個Java從業者,面試的時候肯定會被問到過HashMap,因為對于HashMap來說,可以說是Java集合中的精髓了,如果你覺得自己對它掌握的還不夠好,我想今天這篇文章會非常適合你,至少,看了今天這篇文章,以后不怕面試被問HashMap了 其實在我學習HashMap的過程中,我個人覺得HashMap還是挺復雜的,如果真的想把它搞得明明白...

  • 畢業5年,我問遍了身邊的大佬,總結了他們的學習方法

    我問了身邊10個大佬,總結了他們的學習方法,原來成功都是有跡可循的。

Global site tag (gtag.js) - Google Analytics 开心农场种蔬菜赚钱 摇钱树捕鱼游戏手机版 血战麻将规则如何算倍 投36元每天赚200是真的吗 新赛季中超开赛时间 网上棋牌怎么样 一个号码中特论坛 经典麻将安卓单机版 车联网1431传销 大圣归来游戏下载手机版 四人打麻将免费 网赚是什么 股票在线开户 湖南幸运赛车开奖视频直播 捕鱼大师 波克棋牌官方下载完 特马是啥意思