[心得]程式設計語言實踐之路第2版知識整理

tangchen2016發表於2016-10-30

前言

原書第4版已經與2015年聖誕節問世,我看的第2版是10年前的版本。裡面列舉的例子有點過時。第2版比第3版翻譯得更好一點。不過像現在通常稱為垃圾回收的,在譯本里叫物料回收,一碼事兒。另外,第4版已經從原來的13章經擴充為17章經了。
這本書討論程式語言的工作原理和技術,闡述程式語言的重要基礎概念。我特別推薦在學習具體程式設計以前學學這本書。當然要是之前再學一點編譯原理更完美。

乾貨

正規表示式和上下無關文法是語言的生成器,它們描述如何構造出合法的字元或者單詞的串。
掃描器和語法分析器是語言的識別器,確定一個給定的串是否合法。掃描器的作用是減少語法分析器必須處理資訊的量。

使用語法分析器分為自上而下(稱為LL或者預測性的)和自下而上(稱為LR或者移入歸約的)。

子程式是控制抽象,類是資料抽象。

一個屬性文法將一些屬性關聯到一個上下文無關文法或樹文法的各個符合,或者將一些屬性規則關聯於各個產生式。
嚴格地說,屬性文法只允許複製規則,和對語義的簡單呼叫。

雖然可以構造出分析屬性流和標註分析樹的自動化工具,但是大部分編譯器還是依靠動作例程。
在一遍編譯器裡,掃描,語法分析,語義分析,和程式碼生成,在對輸入的一次遍歷中交錯進行。

描述順序的機制分為7類:順序執行,選擇,迭代,過程抽象,遞迴,併發和非確定性。
順序就是按序
選擇是在兩個或多個控制流中選擇一個執行。
遞迴基於一個操作的更簡單例項來定義操作。
迭代則重複操作,利用操作的副作用。

在值模型中,變數就是命名的資料容器。在引用模型中,變數數對資料物件的引用。
重新整理表示式,以及找出公共子表示式或在一個非確定性結構中一旦發現可選擇,就不再對其它選擇繼續求值。

型別為許多操作提供隱含上下文,並限制可執行的操作集合。

一個型別系統包括:1.一種定義型別並將它們與特定的語言結構相關聯的機制。2.一束有關型別等價、型別想容和型別推理的規則。

型別等價性確定兩個名字或者值是否具有相同型別。
型別相容性確定某個型別的值能否用在“期望”另一型別的特定上下文中。
型別推理基於一個表示式的成分型別或者其外圍上下文,確定該表示式型別。

呼叫序列的工作是維護呼叫棧。
引數傳遞模型通過值引用,或者閉包實現。
Peter J. Landin 在1964年將術語閉包定義為一種包含環境成分和控制成分的實體。閉包是指可以包含自由(未繫結到特定物件)變數的程式碼塊;這些變數不是在這個程式碼塊內或者任何全域性上下文中定義的,而是在定義程式碼塊的環境中定義(區域性變數)。“閉包” 一詞來源於以下兩者的結合:要執行的程式碼塊(由於自由變數被包含在程式碼塊中,這些自由變數以及它們引用的物件沒有被釋放)和為自由變數提供繫結的計算環境(作用域)。

異常處理程式可以從深層巢狀的子程式呼叫中以一種結構良好的方式回退,協程使程式可以維護兩個或更多的執行環境並來回切換。

語義分析器把語法樹傳給中間程式碼生成器,中間程式碼生成器轉而把控制流圖傳給與機器無關的程式碼改進器。

程式語言設計有5個核心概念:命名,控制流,型別定義,子程式,物件。
OO設計的3概念:封裝,繼承和動態方法約束(型別)

lisp函式式語言基礎:lambda演算。
prolog邏輯式語言理論基礎,一階謂詞邏輯。

任何符合直觀理解的計算模型都具有相同的計算能力,這是Church猜想。church的計算模型稱為lambda演算,基於帶參表示式概念。

構造性證明:直接證明如何得到具有某種性質的數學物件。
非構造性證明:值證明某種物件必然存在。
程式可以看作是某個命題的構造性證明。

命令式程式通過迭代和修改變數
函式式程式通過引數代換到函式裡
邏輯式通過邏輯語句的歸結操作,由變數與項共同歸納。

表是大多數函式式和邏輯式語言裡最突出的特徵。

併發基本概念:通訊,同步,執行緒建立和管理。
建立執行緒的6種結構:co-begin,並行迴圈,加工時啟動,fork/join,隱式結婚搜和早回覆
共享儲存的忙等待機制常用的有自旋鎖和隔離欄
基於排程器實現的共享儲存有訊號量,管程和條件臨界區。
管程 (英語:Monitors,也稱為監視器) 是一種程式結構,結構內的多個子程式(物件或模組)形成的多個工作執行緒互斥訪問共享資源。這些共享資源一般是硬體裝置或一群變數。

訊息傳遞的4個問題:如何指名通訊對方,傳送訊息阻塞時間,顯式還是隱式接收,選擇接收訊息。
遠端呼叫send和顯式接收的組合稱為握手,遠端呼叫send和隱式接收稱為遠端過程呼叫RPC
pvm是並行虛擬機器,mpi是訊息傳遞介面。
MPI是一個跨語言的通訊協議,用於編寫平行計算機。支援點對點和廣播。MPI是一個資訊傳遞應用程式介面,包括協議和和語義說明,他們指明其如何在各種實現中發揮其特性。MPI的目標是高效能,大規模性,和可移植性。MPI在今天仍為高效能運算的主要模型。主要的MPI-1模型不包括共享記憶體概念,MPI-2只有有限的分佈共享記憶體概念。 但是MPI程式經常在共享記憶體的機器上執行。在MPI模型周邊設計程式比在NUMA架構下設計要好因為MPI鼓勵記憶體本地化。

從安全性和分散式網際網路應用角度考慮,Java將長期流行。

程式碼優化包含以下技術:
窺孔優化:區域性和全域性冗餘刪除,常量摺疊,常量傳播,複製傳播,公共子表示式消除
迴圈優化:不變數提升,歸納變數的強度削弱或刪除。展開的軟體流水線,為快取優化或者並行性的重複。
指令排程(依賴DAG)
暫存器分配(暫存器衝突圖)

靜態單賦值SSA形式有許多用途,包括通過值編號做全域性公共子表示式刪除。

許多全域性優化都使用了資料流分析,特別是用它識別可用表示式,活躍變數,計算到達定義,用於全域性的常量傳播,複製傳播,以及SSA形式轉換。

相關文章