一、重定位php
彙編器產生的目標程序至少包含三個區,即文本區,數據區和bss區。文本區通常包括程序的代碼和常量,數據區一般存放全局變量等內容,bss區用於存放未初始化的變量或做爲公共變量存儲空間。在一個目標文件中,其text區從地址0開始,隨後是data區,再後面是bss區。而要運行程序,必須裝載到內存中,因此這些區的地址須要在內存中從新安排,也就是重定位。html
二、連接器和加載器git
連接器解決外部內存地址問題,而加載器把全部的可執行目標文件放到內存中執行。算法
三、 語法分析編程
爲一個給定的終結符號串構建一顆語法分析樹的過程稱爲對該符號串進行語法分析。語法分析的任務,即接受一個終結符號串做爲輸入,找出從文法的開始符號推導出這個串的方法。編程語言
四、根據運算符的結合性和優先級構建算法表達式的文法以下:函數
expe -> expr + term | expr - term | term學習
term -> term * factor | term / factor | factorui
factor -> digit | (expr) lua
digit -> 0 | 1 | 2 | 3 | 4 |5 | 6 | 7 | 8 | 9
五、PCT(Parrot Compiler Tools/Parrot Virtual Machine)
The PCT are a set of tools that people can use to quickly and easily implement new programming languages on the Parrot platform.
參考:http://en.wikibooks.org/wiki/Parrot_Virtual_Machine/Parrot_Compiler_Tools
學習:http://docs.parrot.org/parrot/latest/html/
六、靜態做用域和動態做用域的類比
動態規則處理時間的方式相似於靜態做用域處理空間的方式。緣由是靜態規則讓咱們尋找的聲明位於最內層的、包含變量使用位置的塊中,而動態規則讓咱們尋找的聲明位於最內層的、包含了變量使用時間的塊中(如C預處理器的宏擴展#define a (x+1))。
七、柯里化(Currying)
是把接受多個參數的函數變換成接受一個單一參數(最初函數的第一個參數)的函數,而且返回接受餘下的參數並且返回結果的新函數的技術。若是你固定某些參數,你將獲得接受餘下參數的一個函數。因此對於有兩個變量的函數,若是固定了,則獲得有一個變量的函數。
八、lambda演算(須查閱資料)
Lambda演算能夠被稱爲最小的通用程序設計語言。它包括一條變換規則(變量替換)和一條函數定義方式,Lambda演算之通用在於,任何一個可計算函數都能用這種形式來表達和求值。於是,它是等價於圖靈機的。看這裏http://zh.wikipedia.org/wiki/%CE%9B%E6%BC%94%E7%AE%97
九、求值策略(Evaluation strategy)
求值策略(Evaluation strategy)是肯定編程語言中表達式的求值的一組規則(一般肯定性的)。求值策略定義什麼時候和以何種次序求值給函數的實際參數,何時把它們代換入函數,和代換以何種形式發生。常用用來研究函數的形式系統λ演算來建模求值策略,這裏它們一般叫作歸約策略。求值策略分爲兩大基本類,嚴格的和非嚴格的,基於如何處理給函數的實際參數。一個語言能夠組合多種求值策略。詳見http://zh.wikipedia.org/wiki/%E6%B1%82%E5%80%BC%E7%AD%96%E7%95%A5
十、後綴表示
其轉換規則:1)若E爲一個變量或者常量,則E -> E;
2)若E是如同E1 op E2的表達式,則E -> E1 E2 op;
3)若E是形如 (E1)的被括起的表達式,則E -> E1.
其運算規則:從左到右掃描後綴串,發現第一個運算符後向左找到對應數目的運算份量,將該運算符與運算份量組合計算後的結果將替換原來的運算份量和運算符這一子串,接着繼續掃描過程直至再也不有運算符爲止。如9 5 2 + - 3 * => 9 7 - 3 * =>2 3 * => 6。
十一、簡單語法制導定義
將產生式體中各非終結符符號的翻譯結果按照它們在非終結符符號中的出現順序鏈接起來,並在其中穿插一些附加的串,從而獲得表明產生式頭部非終結字符的翻譯結果字符串的語法制導定義。 如:
產生式 語義規則(「||」是字符串鏈接運算符)
expr -> expr1 + term expr.t = expr1.t || term.t || '+'(其中‘+’是惟一的附加符號)
十二、與語法制導翻譯相關的兩個重要概念 -- 屬性與翻譯方案
屬性:表示與某個程序構造相關的任意的量。屬性有分綜合屬性和繼承屬性,綜合屬性能夠在自底向上遍歷語法樹時計算,而繼承屬性則在自頂向下遍歷語法樹時計算。屬性能夠以多種多樣的形式存在,如生成的代碼的指令數目、表達式的數據類型、某個構造生成的代碼中的第一條指令地址等都是屬性的例子。因爲咱們用文法符號來表示程序構造,因此咱們將屬性的概念從程序構造擴展到表示這些構造的文法符號上。
翻譯方案:翻譯方案是一種將程序片斷附加到一個文法的各個產生式上的表示法。當在語法分析過程當中使用一個產生式時,相應的程序片斷(即語義動做)就會執行。這些程序片斷的執行效果按照語法分析過程的順序組合起來,獲得的結果就是此次分析/綜合過程處理源程序獲得的翻譯結果。
語法制導翻譯方案和語法制導定義類似,只是顯式指定了語義規則的計算順序。(還沒有很好理解)
1三、前序遍歷和後序遍歷
前序遍歷和後序遍歷是深度優先遍歷的兩種重要的特例。在這兩種遍歷中,咱們都是從左到右遞歸地訪問每一個結點的子結點。而其區別在於:
前序遍歷:被要求的特定動做在咱們第一次訪問一個結點時被執行;
後序遍歷:被要求的特定動做在咱們最後一次訪問一個結點時被執行。