架構 -- 程式語言
- 過程式就是按一條條命令的方式執行,而 機器語言 本身就是由一條條指令構成的,也是 過程式 的
- 過程式是 最為常見 的,每個程式語言都有過程式的影子,代表為Fortran、C/C++、JavaScript、Go
- 程序式程式設計中 最核心 的兩個概念: 結構體 (自定義型別)和 過程 (函式)
- 通過 結構體 對資料進行 組合 ,可以構建出 任意複雜的自定義資料結構
- 通過 過程 可以抽象出 任意複雜的自定義指令 ,複用之前的成果,簡化意圖的表達
函式式
- 函式式本質上是 對程序式程式設計的一種約束 ,最核心的主張是 變數不可變 , 函式儘可能沒有副作用
- 對於通用語言而言,所有函式都沒有副作用是不可能的,例如內部有IO行為的函式就有副作用
- 既然變數不可變,函式沒有副作用,那麼出錯的機會就會減少,程式碼質量也就變高,代表為Haskell、Erlang
- 大部分語言都比較 難以徹底實施 函式式的程式設計思想,但在思想上會有所借鑑
- 函數語言程式設計相對小眾,寫程式碼質量高,但 學習門檻高
面向物件
- 面向物件是在過程式的基礎上,引入了 物件 ( 類 )和 物件方法 ( 類成員函式 )
- 面向物件主張儘可能把方法(過程) 歸納到合適的物件 ( 類 )上,不主張全域性函式(過程),代表為Java、C#、C++、Go
- 面向物件的核心思想是引入 契約 ,基於 物件 的概念對程式碼的使用介面進行抽象和封裝,主要優點如下
- 清晰的使用介面 :某種型別的物件有哪些方法一目瞭然,不像程序式程式設計,資料結構和過程的關係非常鬆散
- 資訊封裝 :面向物件不主張繞過物件的使用介面侵入到物件的內部實現細節
- 面向物件還有一個至關重要的概念是 介面 ,通過介面可以 優雅 地實現 多型 ,多型的概念如下
- 物件和物件方法是 強關聯 的,可以引入介面來 抽象不同物件的行為
- 這樣不同物件就可以用 相同的程式碼 來實現類似的複雜行為
- 多數面嚮物件語言還會引入 繼承 的概念,雖然繼承帶來了編碼上的便捷性,但也帶來了不必要的負擔
- 何時使用 組合 ?何時使用 繼承 ?Go給出了最完美的答案: 放棄繼承,全面強化組合
- 繼承屬於 過度設計 ,會產生複雜的物件繼承樹
面向連線
- 不同的程式設計正規化 並不互斥 ,某些程式語言會有 明確的程式設計正規化主張 ,如Java是純正的面嚮物件語言,反對全域性過程
- 某些程式語言主張自己是 多正規化 的,典型代表是C++,但C++太複雜,以至於讓人 誤以為 多正規化會大大增加了語言的複雜度
- Go是多正規化更好的例子,Go本身並沒有聲稱自己是多正規化的,但實際上 Go保留了每種程式設計正規化的精華部分
- Go沒有聲稱自己是多正規化的,而是認為自己是一門 面向連線 的語言
- 面向連線即 樸素的組合思想 ,研究連線就是研究人和人的組合,程式碼和程式碼的組合
- 面向物件創造性地把 契約 的重要性提到了非常重要的高度,但 並不是只有物件需要契約 , 語言設計的方方面面都需要契約
- 程式碼規範約束了人的行為,是人與人的連線契約
- 訊息傳遞約束了程序(這裡的程序是抽象的,Go中叫goroutine)的行為,是程序與程序的連線契約
- 訊息傳遞是 多核背景 下流行起來的程式設計思想
- 核心主張:儘可能用 訊息傳遞來取代共享記憶體 ,從而儘可能 避免顯式地鎖 ,降低程式設計負擔
- Go不只是提供 語言內建 的訊息傳遞機制,同時它的訊息傳遞是 型別安全 的,大大較低犯錯機會
工程化能力
- 包(package):程式碼的釋出單元
- 版本(version):包的依賴管理
- 文件生成(doc)
- 單元測試(test)
執行器行為
- 編譯的目標檔案是可執行程式,代表為Fortran、C/C++、Go
- 生成跨平臺的虛擬機器位元組碼,有獨立的執行器(虛擬機器)執行位元組碼,代表為Java、Erlang
- 直接解釋執行,代表為JavaScript
- 純解釋執行的語言已經不多了,大多數語言也只是看起來直接執行
- 內部還是會基於位元組碼的虛擬機器,目的是為了提高效能
語言對架構的影響
- 淡紫色是 硬體層次的依賴 ,是程式工作的 物理基礎 ,淺綠色是 軟體層次的依賴 ,是程式工作的 生態環境
- 桔色是 庫或原始碼層次的依賴 ,是 程式本身的組成部分 ,細分為兩部分:業務無關的框架和基礎庫,業務架構
- 業務架構與語言無關 ,但語言的選擇對業務架構的決策會有深遠的影響,主要體現在兩方面: 開發效率 和 維護成本
轉載請註明出處:http://zhongmingmao.me/2019/04/26/architecture-programming-language/
訪問原文「架構 -- 程式語言」獲取最佳閱讀體驗並參與討論