[心得]程式設計語言實踐之路第2版知識整理
前言
原書第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形式轉換。
相關文章
- Java函數語言程式設計知識分享!Java函數程式設計
- 軟體設計師:程式設計語言基礎知識程式設計
- GO語言泛型程式設計實踐Go泛型程式設計
- 函數語言程式設計最佳實踐函數程式設計
- 第七章——程式設計語言基礎知識程式設計
- 函數語言程式設計入門實踐(一)函數程式設計
- 知無涯,行者之路莫言終(我的程式設計之路)程式設計
- 微控制器C語言程式設計實踐pdfC語言程式設計
- 函數語言程式設計入門實踐 —— Compose/Pipe函數程式設計
- 「Golang成長之路」函數語言程式設計Golang函數程式設計
- C語言開發入門與程式設計實踐pdfC語言程式設計
- [程式設計]UML語言:理論之光與實踐之惑程式設計
- 「Golang成長之路」函數語言程式設計篇Golang函數程式設計
- 那些主流程式語言的知識,C語言(Ⅰ)C語言
- Python語言程式設計 (第11期) 測驗8: 程式設計方法學Python程式設計
- 高階語言程式設計第2次作業程式設計
- 高階程式設計語言第2次作業程式設計
- 高階程式語言設計第5次作業
- 程式設計師必知的程式語言編年史程式設計師
- 《微信小程式開發 入門與實踐》知識點整理微信小程式
- python3入門與實踐(六):函數語言程式設計Python函數程式設計
- C++高階語言程式設計案例與實踐輔導pdfC++程式設計
- R語言程式設計藝術 第2章 向量(上)R語言程式設計
- ‘程式語言‘ ’程式設計工具’程式設計
- 程式語言設計,程式設計哲學程式設計
- Java 函數語言程式設計(一)初識篇Java函數程式設計
- 重識Java8函數語言程式設計Java函數程式設計
- 程式設計心得程式設計
- 《Python程式設計:從入門到實踐》 筆記(一)基礎知識Python程式設計筆記
- C語言陣列知識體系整理大學霸IT達人C語言陣列
- 程式設計基礎知識程式設計
- PLC程式設計—基本知識C程式程式設計
- C語言程式設計-實驗報告4C語言程式設計
- c語言程式設計——實驗報告一C語言程式設計
- # c語言程式設計——實驗報告一C語言程式設計
- c語言程式設計--實驗報告一C語言程式設計
- C語言程式設計—實驗報告四C語言程式設計
- c語言程式設計——實驗報告二C語言程式設計
- c語言程式設計——實驗報告六C語言程式設計