編譯原理(龍書)-- 引論筆記
語(yǔ)言處理機(jī)
-
編譯器
- 編譯器是一個(gè)程序镇防,可以閱讀某一種語(yǔ)言(源代碼)蹋辅,并將之翻譯成另一種等價(jià)的語(yǔ)言(目標(biāo)語(yǔ)言)編寫的程序
- 源程序 編譯器 目標(biāo)程序
-
解釋器
- 解釋器直接利用用戶提供的輸入執(zhí)行源程序中指定的操作(并不通過(guò)翻譯的方式生成目標(biāo)程序)
-
優(yōu)缺點(diǎn)
- 編譯器產(chǎn)生的機(jī)器語(yǔ)言目標(biāo)程序通常比一個(gè)解釋器快很多
- 解釋器的錯(cuò)誤診斷效果通常比編譯器更好,因?yàn)樗饌€(gè)語(yǔ)句執(zhí)行源程序
-
Java語(yǔ)言處理器
- 結(jié)合了編譯和解釋過(guò)程
- 源程序 編譯器 中間程序(字節(jié)碼)+ 輸入 虛擬機(jī) (解釋執(zhí)行) 輸出
- Java的即時(shí)編譯器:將字節(jié)碼翻譯成機(jī)器語(yǔ)言洪燥,再執(zhí)行程序(跳過(guò)解釋執(zhí)行過(guò)程)
-
語(yǔ)言處理系統(tǒng)
- 源程序 預(yù)處理器 經(jīng)過(guò)預(yù)處理的源程序 編譯器 目標(biāo)匯編程序 匯編器 可重定位機(jī)器代碼 + 庫(kù)文件、可重定位對(duì)象文件 鏈接器/加載器 目標(biāo)機(jī)器代碼
- 預(yù)處理器
- 將分割成多個(gè)文件的源程序聚合成一個(gè)獨(dú)立的文件
- 將宏轉(zhuǎn)換為源語(yǔ)言語(yǔ)句
- 鏈接器
- 大型程序通常需要分成多個(gè)部分進(jìn)行編譯蓝撇,可重定向的機(jī)器代碼有必要需要和其他可重定向?qū)ο笪募约皫?kù)文件鏈接到一起诚撵,形成真正在機(jī)器上運(yùn)行的代碼
- 解決:一個(gè)文件中的代碼指向另一個(gè)文件中的位置缭裆,鏈接器解決外部?jī)?nèi)存地址問(wèn)題
- 加載器
- 將所有的可執(zhí)行目標(biāo)文件放到內(nèi)存中執(zhí)行
編譯器的結(jié)構(gòu)
- 組成
- 前端:分析部分,檢查語(yǔ)法語(yǔ)義寿烟、生成符號(hào)表和中間表示
- 后端:綜合部分澈驼,根據(jù)符號(hào)表和中間表示中的信息構(gòu)建目標(biāo)程序
- 編譯步驟
- 字符流 詞法分析器 符號(hào)流 語(yǔ)法分析 語(yǔ)法樹 語(yǔ)義分析 語(yǔ)法樹 中間代碼生成器 中間表示形式 機(jī)器無(wú)關(guān)代碼優(yōu)化器 中間表示形式 代碼生成器 目標(biāo)機(jī)器語(yǔ)言 機(jī)器相關(guān)代碼優(yōu)化器 目標(biāo)機(jī)器語(yǔ)言
- 詞法分析(掃描)
- 讀入源程序字符流,將它們組織成有意義的詞素(lexeme)序列
<token-name(抽象符號(hào)),attribute-value(指向符號(hào)表中關(guān)于這個(gè)詞法單元的條目)>
- 例如:
position = initial + rate * 60
<id,1><=><id,2><+><id,3><*><60>
- 語(yǔ)法分析
- 使用由詞法分析器生成的各個(gè)詞法單元的第一個(gè)分量來(lái)創(chuàng)建樹型的中間表示
- 常用的表示方法:語(yǔ)法樹(樹中的每個(gè)內(nèi)結(jié)點(diǎn)表示運(yùn)算筛武,子節(jié)點(diǎn)表示該運(yùn)算的分量)
- 語(yǔ)義分析
- 使用語(yǔ)法樹和符號(hào)表中的信息來(lái)檢查源程序是否和語(yǔ)言定義的語(yǔ)義一致
- 收集類型信息缝其,并把這些信息存放在語(yǔ)法樹或符號(hào)表中
- 類型檢查
- 中間代碼生成
- 代碼優(yōu)化
- 代碼生成
- 符號(hào)表管理
- 記錄源程序中使用的變量的名字,并收集和每個(gè)名字的各種屬性有關(guān)的信息
- 這些屬性可以提供一個(gè)名字的存儲(chǔ)分配徘六、它的類型内边、作用域等信息
- 符號(hào)表數(shù)據(jù)結(jié)構(gòu)為每個(gè)變量名字創(chuàng)建了一個(gè)記錄條目
- 將多個(gè)步驟組合成趟
- 在特定的實(shí)現(xiàn)中,多個(gè)步驟可以組合成一趟(pass)
- 編譯器構(gòu)造工具
- 常用編譯器構(gòu)造工具
- 語(yǔ)法分析器的生成器
- 掃描器的生成器
- 語(yǔ)法制導(dǎo)的翻譯引擎
- 代碼生成器的生成器
- 數(shù)據(jù)流分析引擎
- 編譯器構(gòu)造工具集
- 常用編譯器構(gòu)造工具
程序設(shè)計(jì)語(yǔ)言
- 按代分類
- 機(jī)器語(yǔ)言(第一代)
- 匯編語(yǔ)言(第二代)
- 高級(jí)程序設(shè)計(jì)語(yǔ)言(第三代)
- 為特定應(yīng)用設(shè)計(jì)的語(yǔ)言(第四代硕噩,例如SQL)
- 基于邏輯和約束的語(yǔ)言(第五代假残,例如Prolog、OPS5)
- 按計(jì)算任務(wù)的完成方式分類
- 強(qiáng)制式:程序中指明如何完成一個(gè)計(jì)算任務(wù)
- 例如:C炉擅、C++辉懒、C#、Java
- 聲明式:程序中指明進(jìn)行哪些計(jì)算
- 例如:ML谍失、Haskell眶俩、Prolog
- 強(qiáng)制式:程序中指明如何完成一個(gè)計(jì)算任務(wù)
- 馮·諾依曼語(yǔ)言:指以馮·諾依曼計(jì)算機(jī)體系結(jié)構(gòu)為計(jì)算模型的程序語(yǔ)言
- 面向?qū)ο笳Z(yǔ)言:指用一組相互作用的對(duì)象組成程序的變成風(fēng)格
- 腳本語(yǔ)言:具有高層次運(yùn)算符的解釋型語(yǔ)言,通常被用于把多個(gè)計(jì)算過(guò)程“粘合”在一起