第 12 章、系統軟體實作 作者:陳鍾誠 旗標出版社.

Slides:



Advertisements
Similar presentations
第一單元 建立java 程式.
Advertisements

Introduction to C Programming
計算機程式語言實習課.
陳維魁 博士 儒林圖書公司 第九章 資料抽象化 陳維魁 博士 儒林圖書公司.
TQC+ JAVA全國教師研習會 PLWeb 程式設計練習平台 簡介.
Chapter 5 遞迴 資料結構導論 - C語言實作.
主題五 CPU Learning Lab.
程式語言的基礎 Input Output Program 世代 程式語言 第一世代 Machine language 第二世代
程式設計概論 1.1 程式設計概論 程式語言的演進 物件導向程式 程式開發流程 1.2 C++開發工具
第 8 章、編譯器 作者:陳鍾誠 旗標出版社.
第5章 編譯器.
第 9 章、虛擬機器 作者:陳鍾誠 旗標出版社.
資料結構設計與C++程式應用 Fundamentals of Data Structures and Their Applications Using C++ 第3章 佇列 資料結構設計與C++程式應用.
第八章 利用SELECT查詢資料.
ANDROID 中的 3D 繪圖 作者:陳鍾誠.
使用VHDL設計—4位元加法器 通訊一甲 B 楊穎穆.
使用VHDL設計—4位元位移器 通訊一甲 B 楊穎穆.
C語言簡介 日期 : 2018/12/2.
類別(class) 類別class與物件object.
ASP.NET基本設計與操作 建國科技大學 資管系 饒瑞佶 2007年.
安裝JDK 安裝Eclipse Eclipse 中文化
2017 Operating Systems 作業系統實習 助教:陳主恩、林欣穎 實驗室:720A.
Unit 04 虛擬機器建構實驗 M. S. Jian Department of Computer Science and Information Engineering National Formosa University Yunlin, Taiwan, ROC.
第 8 章 Combinational Logic Applications
第二章 SPSS的使用 2.1 啟動SPSS系統 2.2 結束SPSS系統 2.3 資料分析之相關檔案 2.4 如何使用SPSS軟體.
雲端計算.
Java 程式設計 講師:FrankLin.
第 2 章、電腦的硬體結構 作者:陳鍾誠.
Fortran 程式語言 之 編與譯(二) 張基昇.
JAVA 程式設計與資料結構 第四章 陣列、字串與數學物件.
Chap3 Linked List 鏈結串列.
第一單元 建立java 程式.
VS.NET 2003 IDE.
網頁程式設計 本章投影片錄自HTML5、CSS3、RWD、jQuery Mobile跨裝網頁設計 陳惠貞 著 碁峰資訊股份有限公司出版
INDEX 資訊學科種子教師研習 課程說明 教學活動計畫.
資料結構 優點 缺點 1 陣列 (Array) 沒有額外變量 (例head, next,...) 運作/操作較簡單 更新資料時,若要保持順序,需要移動較大量資料 靜態結構Static (宣告時已決定了陣列元素多少,不能在程式執行期間增減元素) 2 隊列Queue (FIFO) 容易更新 加入enqueue:
第 19 章 XML記憶體執行模式.
網路安全管理報告 緩衝區溢位攻擊 學生:吳忠祐 指導教授:梁明章.
使用VHDL設計 七段顯示器 通訊工程系 一年甲班 姓名 : 蘇建宇 學號 : B
第1章 背景.
CH05. 選擇敘述.
挑戰C++程式語言 ──第8章 進一步談字元與字串
基本IO.
Class & Object 靜宜大學資工系 蔡奇偉副教授 ©2011.
C qsort.
MicroSim pspice.
MiRanda Java Interface v1.0的使用方法
函數應用(二)與自定函數.
陣列與結構.
教育部特殊教育通報網 學生異動、接收操作說明.
使用VHDL設計-8x3編碼電路 通訊一甲 B 楊穎穆.
2018 Operating Systems 作業系統實習 助教:林欣穎 實驗室:720A.
資料表示方法 資料儲存單位.
第1章、系統軟體 作者:陳鍾誠 旗標出版社.
期末報告第一題 通訊四甲 B 湯智瑋.
資料結構與C++程式設計進階 期末考 講師:林業峻 CSIE, NTU 7/ 15, 2010.
第四章 陣列、指標與參考 4-1 物件陣列 4-2 使用物件指標 4-3 this指標 4-4 new 與 delete
第 4 章、組譯器 作者:陳鍾誠 旗標出版社.
開發Java程式語言的工具 JDK.
ABAP Basic Concept (2) 運算子 控制式與迴圈 Subroutines Event Block
使用VHDL設計-七段顯示 通訊一甲 B 楊穎穆.
Chapter 4 Multi-Threads (多執行緒).
C語言程式設計 老師:謝孟諺 助教:楊斯竣.
Unix指令4-文字編輯與程式撰寫.
Develop and Build Drives by Visual C++ IDE
JUDGE GIRL 使用介紹 & 常見問題 TAs :
Memory Management 日期 : 2019/11/21.
ABAP Basic Concept (2) 運算子 控制式與迴圈 Subroutines Event Block
InputStreamReader Console Scanner
資料結構 Data Structure (資管二)
Presentation transcript:

第 12 章、系統軟體實作 作者:陳鍾誠 旗標出版社

第 12 章、系統軟體實作 12.1 簡介 12.2 組譯器實作 12.3 虛擬機實作 12.4 剖析器實作 12.5 編譯器實作 12.1 簡介 12.2 組譯器實作 12.3 虛擬機實作 12.4 剖析器實作 12.5 編譯器實作 12.6 整合測試

12.1 簡介 C 語言實作 目的 動態陣列 + 雜湊表格 (12.1 節) 組譯器 (12.2 節) 虛擬機器 (12.3 節) 12.1 簡介 C 語言實作 動態陣列 + 雜湊表格 (12.1 節) 組譯器 (12.2 節) 虛擬機器 (12.3 節) 剖析器 (12.4 節) 編譯器 (12.5 節) 目的 展示系統軟體的實作方法與技巧 讓讀者熟悉系統軟體的原理 培養開發系統軟體的能力 以實作印證理論, 以理論支持實作

實作程式列表

動態陣列 實作目的 標準 C 語言函式庫當中缺乏一些基本資料結構的相 關函數, 因此我們必須先設計出這些資料結構, 像是 動態陣列 (Array)、雜湊表 (Hash Table) 等 以便在後續的組譯器、虛擬機、剖析器與編譯器中, 可以很容易的利用這些結構存放像符號表、指令表、 詞彙串列、剖析樹等資料。

動態陣列的資料結構與函數

動態陣列新增 – ArrayAdd()

動態陣列的使用

動態陣列的測試結果

動態陣列的列舉 - ArrayEach()

雜湊表 實作目的 標準 C 語言函式庫當中缺乏一些基本資料結構的相 關函數, 因此我們必須先設計出這些資料結構, 像是 動態陣列 (Array)、雜湊表 (Hash Table) 等 以便在後續的組譯器、虛擬機、剖析器與編譯器中, 可以很容易的利用這些結構存放像符號表、指令表、 詞彙串列、剖析樹等資料。

雜湊表的資料結構與函數

雜湊函數的實作 將字串 key 中的每個位元組相加後, 對雜湊表的大小取 餘數後的結果 這個方法雖然不是很好的雜湊函數,但是簡單卻足夠 了。

雜湊表:取得對應鍵值的元素 - HashTableGet(table, key)

雜湊表:放入鍵值與元素 - HashTablePut(table, key, data)

12.2 組譯器實作 撰寫一個簡單的 CPU0 組譯器 – as0 印證組譯器的理論 學習組譯器的實作方式 使用方式 12.2 組譯器實作 撰寫一個簡單的 CPU0 組譯器 – as0 印證組譯器的理論 學習組譯器的實作方式 使用方式 as0 <asmFile> <objFile>

組譯範例:as0 ArraySum.asm0 ArraySum.obj0

組譯器的資料結構

組譯器的函數

組譯器的主要函數 – assemble(asmFile, objFile)

組譯器的第一階段 (計算符號位址)

計算指令大小 – AsmCodeSize()

組譯器的第2階段

指令轉機器碼 (J 型指令)

指令轉機器碼 (A 型指令)

資料轉二進位碼

12.3 虛擬機實作 當我們用 as0 組譯出了目的碼之後, 這個目的碼仍 然無法被執行 12.3 虛擬機實作 當我們用 as0 組譯出了目的碼之後, 這個目的碼仍 然無法被執行 這是因為筆者所使用的處理器並不是 CPU0, 而是 Intel 的 IA32 CPU 為核心的電腦。 為了讓讀者能執行 CPU0 的目的碼, 筆者只好繼續 撰寫一個虛擬機器 vm0 以便讓讀者執行 as0 所組譯出的目的碼, 本節將描 述 vm0 的使用方式與設計原理。

虛擬機的執行 vm0 ArraySum.obj0

執行後的傾印

虛擬機的資料結構與函數

虛擬機的最上層函數 – runObjFile(objFile)

虛擬機使用的位元操作函數

定義暫存器別名

虛擬機的主要函數 – Cpu0Run()

Cpu0Run() - 指令擷取階段

Cpu0Run() – 解碼階段

Cpu0Run() – 執行階段 (載入指令)

Cpu0Run() – 執行階段 (運算指令)

Cpu0Run() – 執行階段 (跳躍指令)

Cpu0Run() – 執行階段 (結尾)

虛擬機:傾印暫存器 - Cpu0Dump()

12.4 剖析器實作 C0 語言的剖析器 (Parser) 是編譯器與直譯器中的關鍵程式 作為 c0c 編譯器的語法剖析程式 12.4 剖析器實作 C0 語言的剖析器 (Parser) 是編譯器與直譯器中的關鍵程式 作為 c0c 編譯器的語法剖析程式 會呼叫詞彙掃描器 Scanner 取的詞彙

掃描器 詞彙掃描器 Scanner 是一個較為簡單的物件 用來取得下一個詞彙 (token) 提供剖析器呼叫使用

掃描器的使用方法

掃描器的資料結構

判斷詞彙的型態 – tokenToType(token)

掃描器的主要函數

剖析器 Parser.h 剖析器的資料結構與函數宣告 Parser.c 剖析器的程式實作

剖析器的資料結構與函數

剖析器的最上層函數 parse()

遞迴下降剖析法

剖析 for 迴圈語法

剖析器中的 next() 函數

剖析器中的 push(), pop() 函數

圖 12.1 遞迴下降剖析器的執行過程 … PROG BaseList BASE STMT 成 長 方 向 堆疊 (Stack) 圖 12.1 遞迴下降剖析器的執行過程 PROG BaseList BASE STMT 成 長 方 向 堆疊 (Stack) i : id = 0:number EXP ITEM FOR ( for …

12.5 編譯器實作 c0c 編譯器 執行方法 輸入:C0 語法的程式 輸出:CPU0 的組合語言 12.5 編譯器實作 c0c 編譯器 輸入:C0 語法的程式 輸出:CPU0 的組合語言 執行方法 c0c <c0File> <asmFile>

編譯的範例

編譯器的最上層函數 範例 12.24 的 compile(cFile, asmFile) 剖析器:parse(cText) 程式產生器: generate(parser->tree, asmFile)

程式碼產生器的最上層函數

程式碼產生器的資料結構與函數

程式碼產生器 GenCode() – 開頭

GenCode() – 處理 FOR

GenCode() – 處理 STMT

GenCode() – 處理 COND

GenCode() – 處理 EXP

GenCode() – 結尾

輸出中間碼 P-Code

P-Code 轉為組合語言 (前半段)

P-Code 轉為組合語言 (後半段)

輸出組合語言

12.6 整合測試 單一主程式, 以條件編譯的方式 方法是利用 C 語言的巨集編譯指令 12.6 整合測試 單一主程式, 以條件編譯的方式 編譯出 test, c0c, as0, vm0 等四個執行檔 方法是利用 C 語言的巨集編譯指令 #if … #elif…#endif

整個系統的主程式 (前半段)

整個系統的主程式 (後半段)

專案建置檔 makefile (第1部分)

專案建置檔 makefile (第2部分)

專案建置檔 makefile (第3部分)

建置執行過程 (1)

執行:編譯器 (剖析)

執行:編譯器 (中間碼產生)

執行:編譯器 (產生組合語言)

執行:組譯器 (第1階段:計算符號位址)

執行:組譯器 (第2階段:指令轉機器碼)

執行:組譯器 (輸出:目的碼)

執行:虛擬機

結語 系統軟體實作 本章以 C 語言實作了 動態陣列 雜湊表 編譯器 c0c test.c0 test.asm0 組譯器 as0 test.asm0 test.obj0 虛擬機 vm0 test.obj0

習題 12.1 請撰寫一個 C0 語言的程式 fib.c0, 可以利用 for 迴圈的方式算出費氏序列 中的 f(10) 的值, 費氏序列的規則為 f(n) = f(n-1)+f(n-2), 而且 f(0) = 1, f(1)=1。 12.2 請利用 c0c 編譯器, 將 fib.c0 編譯為組合語言 fib.asm0。 12.3 請利用 as0 組譯器, 將 fib.asm0 組譯為目的檔 fib.obj0。 12.4 請利用 vm0 虛擬機, 執行 fib.obj0, 並檢查看看 f(10) 的結果是否正確。 12.5 請為 C0 語言加上 if 條件的規則為 IF = ‘if’ ‘(’ COND ‘)’ BLOCK (‘ elseif’ BLOCK)* (else BLOCK)?, 然後修改本章的剖析器程式, 加入可以處理該規則的 程式。 12.6 繼續前一題, 請修改本章的程式碼產生器程式, 以產生上述的 if 規則之程 式。