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

以下為譯文:

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

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

更別提我們有無數種不同的編程語言。每當開發人員面對特殊語言的語法而深感沮喪時,他們都會想“為什么我們不能創建一種新的語言改正這個問題呢?”有些人還真的這么做了,很幸運的是自然選擇已經淘汰了很多很差的語言(有時也有意外,比如至今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資訊
5
0
評論 共 6 條 請登錄后發表評論
6 樓 bzhao 2020-08-04 15:35
想法很好,現實很殘酷, 很明顯沒有辦法解決成就感的問題,
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
非常贊同,現在的語言太多了語法又差異太大增加無謂的學習成本很惡心

發表評論

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

相關推薦

  • 淺談各類編程語言之間的差異

    引 瀏覽各大編程相關的網站, 總是能看到有關于編程語言的爭論, 這些爭論使得想要學習編程的人變得疑惑。?總會讓人陷入到底什么是最好的編程語言, 我該學什么, 這樣的疑問中。 我曾經也陷入過這樣的疑惑中, 入行做“碼農”大概也有一年半的時間了, 借著2018的過去, 2019的開始, 嘗試總結一下這類問題, 給過去的疑問一個交代, 給新人一份細微幫助(但愿)。 機器碼編程(匯編語言) 匯編語言...

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

    -

  • 如何快速掌握所有編程語言

    附Java/C/C++/機器學習/算法與數據結構/前端/安卓/Python/程序員必讀書籍書單大全: 書單導航頁(點擊右側 極客俠棧 即可打開個人博客):極客俠棧 ①【Java】學習之路吐血整理技術書從入門到進階最全50+本(珍藏版): ②【算法數據結構+acm】從入門到進階吐血整理書單50+本(珍藏版): ③【數據庫】從入門到進階必讀18本技術書籍網盤吐血整理網盤(珍藏版): ④【Web前端...

  • 如何創造一門編程語言

    ? 編程語言,作為人與計算機溝通的橋梁,有著重要和深遠的意義。有過計算機編程經驗的人,多少學習或掌握過一到多種編程語言。計算機專業領域的編程語言成百上千種,主流的編程語言也有數十種之多。每種編程語言面向的領域和特性都不盡相同,不過歸根結底是為了解決人與計算機之間溝通的效率問題,提高計算機的生產力。想必有不少人對那些主流編程語言的創造者十分傾佩,也相信有不少人會好奇一門編程語言是如何誕生的。那么如...

  • 主流編程語言簡介

    計算機語言的種類非常的多,總的來說可以分成?機器語言,匯編語言,高級語言?三大類。 ???機器語言:是直接用二進制代碼指令表達的計算機語言,指令是用0和1組成的一串代碼,它們有一定的位數,并分成若干段,各段的編碼表示不同的含義,例如某臺計算機字長為16位,即有16個二進制數組成一條指令或其它信息。16個0和1可組成各種排列組合,通過線路變成電信號,讓計算機執行各種不同的操作。 (詳

  • Julia1.0編程語言淺析

    目前從網上得知Julia1.0這門語言是上升最熱的語言,那么分析一門語言為什么會在短時間會很火爆,首先我們需要查看官方文檔來理解基本特性:Julia 語言的官網:https://julialang.org/ Julia 語言項目地址:https://github.com/JuliaLang 通過閱讀官方文檔的方法和查閱網上資源來了解一門新技術是一種最快速的學習方法,當然如果作為研究人員可能要去...

  • 各種編程語言介紹(轉載)

    ??????? 在介紹編程語言之前,先說說開放源代碼的必要性。現在,在軟件生產領域存在巨大的智利浪費,大家把大量的精力用在編寫別人已經實現的 程序代碼上。看看,文本編輯器有多少,看看ftp程序有多少,看看字處理程序有多少,這些程序雖然有差別,但主要的功能都是一樣的。要實 現個性化的功能,在已有的軟件基礎上修改會節省多少時間呀!而每個程序各編一套,又浪費多少時間?如果,沒有這些重復的工作量,世界

  • 各類編程語言的主要用途

    匯編語言 更接近機器碼,特點是效率高,執行快,缺點是可讀性差,不易維護,優點是可以直接在芯片上編程 C語言 對第三方模塊的整合不如其他語言方便,適合底層,C語言是面向過程的,可直接操作硬件或者操作系統 C++ 是面向對象的,現在廣泛應用于各種開發 JAVA 在整合使用第三方模塊方面很優秀了,所以作為通用性語言被大規模使用 JavaScript 一種直譯式腳本語言,是一種動態類型、...

  • 怎樣學習一門編程語言

    選擇一門語言 確定你感興趣的領域 你可以開始學習任何編程語言(盡管其中一些被描述地比其他的更加“易學”),你得去問自己自己想用通過學習這門語言完成什么樣的工作。這將會幫助你確定你應該追求的編程方式并且提供一個良好的開始。 如果你想進入Web開發行業,那你將會有一堆語言需要去學習,這和開發計算機程序相反。移動App的開發需要比P...

  • 信息學奧林匹克競賽-編程語言

    主流編程語言簡介 ?計算機語言的種類非常的多,總的來說可以分成 機器語言,匯編語言,高級語言 三大類。 機器語言:是直接用二進制代碼指令表達的計算機語言,指令是用0和1組成的一串代碼,它們有一定的位數,并分成若干段,各段的編碼表示不同的含義,例如某臺計算機字長為16位,即有16個二進制數組成一條指令或其它信息。16個0和1可組成各種排列組合,通過線路變成電信號,讓計算機執行各種不同的操

  • 編程語言的種類簡介

    GO: ???Go語言是谷歌2009發布的第二款開源編程語言。Go語言專門針對多處理器系統應用程序的編程進行了優化,使用Go編譯的程序可以媲美C或C++代碼的速度,而且更加安全、支持并行進程。Go的目標是希望提升現有編程語言對程序庫等依賴性(dependency)的管理,這些軟件元素會被應用程序反復調用。由于存在并行編程模式,因此這一語言也被設計用來解決多處理器的任務。該語言設計為一款系統編程語

  • 編程語言

    推薦能貢獻力量的人捐贈維基百科...................................... 0.維基百科的定義: 編程語言(programming language),是用來定義計算機程序的形式語言。它是一種被標準化的交流技巧,用來向計算機發出指令。一種計算機語言讓程序員能夠準確地定義計算機所需要使用的數據,并精確地定...

  • 高級編程語言的發展歷程

    目錄   高級編程語言的發展歷程(一)創始紀   高級編程語言的發展歷程(二)虛擬機的前世今生   高級編程語言的發展歷程(三)FORTRAN 語言是怎么來的   高級編程語言的發展歷程(四)LISP 和 AI 的青梅竹馬 A   高級編程語言的發展歷程(五)LISP 和 AI 的青梅竹馬 B   高級編程語言的發展歷程(六)SCHEME 語言是怎么來的   高級編程語言的發展歷程(

  • 五大最適合學習AI開發的編程語言, 你喜歡的語言上榜了嗎?

    準備學習AI的你,知不知道選擇哪種編程語言合適呢?以下列舉的五種編程語言,被認為是最適合用來學習AI。大家可以參考一下。1. PYTHON第一名毫無疑問是 Python。盡管 Python 有些特性令人不爽(whitespace、Python 2.x 和 Python 3.x 之間的巨大差異、五種不同的包機制都在不同程度上有缺陷)但如果你正在從事 AI 工作,你幾乎肯定會在某些時候用到 Pytho...

  • Q# 微軟量子計算編程語言

    微軟量子開發工具包,分為windows版本和macOS和linux版本,下載頁面:https://www.microsoft.com/en-us/quantum/development-kit. Q#開發工具需要使用vs2017或者 vs code. 注意:vs2017需要安裝 .NET Core cross-platform development(.NET Core跨平臺工具集). 01

  • MySQL基礎入門視頻課程

    本課程從零開始,以通俗易懂的方式講解MySQL技術,手把手教你掌握每一個知識點。課程中使用的所有英文單詞都會逐一查詢并記錄,真正做到零基礎入門學習,適合初學者的教程! 課程內容包括: 1.MySQL簡介、安裝MySQL 2.查詢操作 3.聚合函數和分組統計 4.更新操作 5.表和庫的管理 6.約束 7.用戶和權限管理 8.事務處理 教學全程采用筆記+代碼案例的形式講解,通俗易懂!!!

  • Xshell6完美破解版,親測可用

    Xshell6破解版,親測可用,分享給大家。直接解壓即可使用

  • Java進階高手課-Java基礎編程提升

    課程聚焦Java基礎編程提升的核心知識點,以真實場景項目實戰為導向,循序漸進,深入淺出的了解Java基礎編程,講解Java這門使用廣泛的編程語言,助你能夠游刃有余地游走在這些技術之中。

  • Linux系統編程:入門篇視頻教程

    Linux系統編程視頻課程為《Linux系統編程》入門篇,主要針對零基礎的Linux開發學員科普Linux系統編程的概念以及需要掌握的各種技能,掌握Linux命令編寫、Linux學習路線并熟悉嵌入式設備編程的方法。為后續的Linux系統編程深入學習打下良好的基礎。

  • 手把手帶你學會Python

    當下最火的計算機語言,難道你還只停留知道的階段嗎?快跟著老司機一起起飛吧~ 零基礎開始學,只要跟著視頻一步一步來,多思考,多練習,我相信你會有質的飛越。 學習路上會很苦,也會很累。但是這些等你學會以后,會發現這些都是值得。 還在等什么?快來學習吧~

Global site tag (gtag.js) - Google Analytics 开心农场种蔬菜赚钱 好运彩彩票 网投玩极速赛车输死了 富深所配资 甘肃快3什么时候开始 买彩票技巧快乐十分 湖北体彩11选5中奖 陕西快乐10分口诀 北京pk10预测网站 辽宁11选5技巧一定牛 七乐彩专家预测 平潭股票配资 贵州快三0404001期开奖号码 股票买入卖出规则 吉林快3计划在线 内蒙古11选5最大遗漏 排列5开奖直播