第 7 章、高階語言 作者:陳鍾誠 旗標出版社.

Slides:



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

08 CSS 基本語法 8-1 CSS 的演進 8-2 CSS 樣式規則與選擇器 8-3 連結HTML 文件與CSS 樣式表
陳維魁 博士 儒林圖書公司 第九章 資料抽象化 陳維魁 博士 儒林圖書公司.
TQC+ JAVA全國教師研習會 PLWeb 程式設計練習平台 簡介.
Project 2 JMVC code tracing
Hadoop 單機設定與啟動 step 1. 設定登入免密碼 step 2. 安裝java step 3. 下載安裝Hadoop
Chapter 5 遞迴 資料結構導論 - C語言實作.
主題五 CPU Learning Lab.
程式語言的基礎 Input Output Program 世代 程式語言 第一世代 Machine language 第二世代
程式設計概論 1.1 程式設計概論 程式語言的演進 物件導向程式 程式開發流程 1.2 C++開發工具
第 8 章、編譯器 作者:陳鍾誠 旗標出版社.
第 9 章、虛擬機器 作者:陳鍾誠 旗標出版社.
Visual C++ introduction
簡易C++除錯技巧 長庚大學機械系
Chapter 1 Introduction.
C++Primer 3rd edition 中文版 Chap 5
101北一女中 資訊選手培訓營 妳不可不了解的指標 Nan.
语言及其文法.
授课老师:龚涛 信息科学与技术学院 2018年3月 教材: 《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
第一章 计算机语言的学科形态与发展历程   计算机语言在计算学科中占有特殊的地位,它是计算学科中最富有智慧的成果之一,它深刻地影响着计算学科各个领域的发展。不仅如此,计算机语言还是程序员与计算机交流的主要工具。因此,可以说如果不了解计算机语言,就谈不上对计算学科的真正了解。
C語言簡介 日期 : 2018/12/2.
類別(class) 類別class與物件object.
SQL Stored Procedure SQL 預存程序.
ASP.NET基本設計與操作 建國科技大學 資管系 饒瑞佶 2007年.
安裝JDK 安裝Eclipse Eclipse 中文化
Methods 靜宜大學資工系 蔡奇偉副教授 ©2011.
第 12 章、系統軟體實作 作者:陳鍾誠 旗標出版社.
雲端計算.
Java 程式設計 講師:FrankLin.
第 2 章、電腦的硬體結構 作者:陳鍾誠.
Fortran 程式語言 之 編與譯(二) 張基昇.
Chap3 Linked List 鏈結串列.
程式設計實習課(四) ----C 函數運用----
第一單元 建立java 程式.
VS.NET 2003 IDE.
網頁程式設計 本章投影片錄自HTML5、CSS3、RWD、jQuery Mobile跨裝網頁設計 陳惠貞 著 碁峰資訊股份有限公司出版
分支宣告與程式設計 黃聰明 國立臺灣師範大學數學系
選擇性結構 if-else… switch-case 重複性結構 while… do-while… for…
第 19 章 XML記憶體執行模式.
|07 函數.
陳維魁 博士 儒林圖書公司 第三章 變數與繫結 陳維魁 博士 儒林圖書公司.
CH05. 選擇敘述.
緩衝區溢位攻擊 學生:A 羅以豪 教授:梁明章
挑戰C++程式語言 ──第8章 進一步談字元與字串
程式語言 程式語言發展史 資料型態 程式指令 程序定義和使用.
第3 语言翻译问题 [学习目标]:学习和掌握语言的语法的基本概念和基本要素,理解翻译的步骤;学习和掌握BNF文法。
Class & Object 靜宜大學資工系 蔡奇偉副教授 ©2011.
流程控制:Switch-Case 94學年度第一學期‧資訊教育 東海大學物理系.
陣列與結構.
第九章 布林代數與邏輯設計.
北一女中 資訊選手培訓營 妳不可不了解的指標 Nan.
编译原理实践 1.课程说明及引论.
選擇性結構 if-else… switch-case 重複性結構 while… do-while… for…
1-1 二元一次式運算.
1757: Secret Chamber at Mount Rushmore
資料表示方法 資料儲存單位.
第1章、系統軟體 作者:陳鍾誠 旗標出版社.
MultiThread Introduction
查表法&電腦IO Port二進制轉七段顯示器
第 4 章、組譯器 作者:陳鍾誠 旗標出版社.
開發Java程式語言的工具 JDK.
ABAP Basic Concept (2) 運算子 控制式與迴圈 Subroutines Event Block
C语言基本语句 判断循环.
Chapter 4 Multi-Threads (多執行緒).
C語言程式設計 老師:謝孟諺 助教:楊斯竣.
Unix指令4-文字編輯與程式撰寫.
微 處 理 機 專 題 – 8051 C語言程式設計 主題:階乘計算
方法(Method) 函數.
ABAP Basic Concept (2) 運算子 控制式與迴圈 Subroutines Event Block
函数与导数 临猗中学 陶建厂.
Presentation transcript:

第 7 章、高階語言 作者:陳鍾誠 旗標出版社

第 7 章、高階語言 7.1 簡介 7.2 語法理論 7.3 語意理論 7.4 執行環境 7.5 實務案例:C 語言

7.1 簡介 高階語言的核心是「語法理論」 利用生成規則 (例如:BNF, EBNF 等) 描述程式的語法。 7.1 簡介 高階語言的核心是「語法理論」 利用生成規則 (例如:BNF, EBNF 等) 描述程式的語法。 根據生成規則撰寫剖析程式, 轉換成語法樹。 對語法樹進行『解譯』或『編譯』的動作。

編譯器 v.s. 直譯器 直譯器 編譯器 利用程式解讀該語法樹, 並根據節點類型執行對應的 動作, 這樣的程式就被稱為『直譯器』。 撰寫程式將語法樹轉換為組合語言 (或目的碼), 那麼, 這樣的程式就被稱為編譯器。

圖 7.1高階語言的歷史年表 Fortran Cobol Lisp PL/I Smalltalk Pascal Smalltalk 80 Prolog Scheme C C++ Java Python Eiffel Ada 83 Common Lisp Tcl ML SML Caml Haskell OCaml C# Perl Ruby 1954 1956 1958 1960 1962 1964 1966 1968 1970 1972 1974 1976 1978 1980 1982 1984 1986 1988 1990 1992 1994 1996 1998 2000 2002 2004 2006 Algol F#

7.2 語法理論 高階語言所使用的語法, 大致上分為兩個層次 詞彙層次 語句層次 RE 與 CFG 都可以使用『生成規則』描述 7.2 語法理論 高階語言所使用的語法, 大致上分為兩個層次 詞彙層次 使用 Regular Expression (簡稱 RE) 語句層次 使用 Context-Free Grammar (簡稱 CFG) RE 與 CFG 都可以使用『生成規則』描述

生成規則 生成規則 用途 由近代語言學之父的喬姆斯基 (Chomsky) 所提出 是生成語法 (Generative Grammar) 理論的基礎 用途 用來描述「自然語言」的語法,像是中文、英文等。

BNF (Backus–Naur Form) 規則 由 John Backus 與 Peter Naur 所提出的規則寫法 很適合用來描述程式語言的語法 BNF 與生成規則的關係 BNF 是為了描述「程式語言」而發展出來的。 生成語法是為了描述「自然語言」所發展出來的。 兩者幾乎是同一件事,都可以描述 RE 與 CFG,因 此後來多不進行區分。

BNF 語法的範例 簡易的範例 英語語法的範例

數學運算式的語法

具有歧義的語法範例 E '-' N '3' '1' '2' (a). 語意:(3 - 1) - 2 = 0 (b). 語意: 3 - (1 - 2) = 4 圖 7.5 運算式 3-1-2 可能產生兩顆語意不同的語法樹

歧義性的困擾 程式語言的語法是不能有歧義性的 否則,根據圖 7.5,程式編譯後有時 3-1-2 會計算出 0, 有時卻會算出 4 否則,根據圖 7.5,程式編譯後有時 3-1-2 會計算出 0, 有時卻會算出 4 這樣將導致程式設計師無法確定程式的執行結果, 而陷入混亂崩潰的狀況。

無歧義的數學運算式語法

圖 7.7 數學運算式 (1+2*3) 的語法樹 E T '+' F '*' N '2' '3' '1'

左遞迴的問題 問題描述 解決辦法 舉例而言,規則 E = T | E [+-] T 中就有左遞迴 將左遞迴的 BNF 語法改為 EBNF 語法,以消除左遞 迴

EBNF 說明 Pascal 語言的發明人 Nicklaus Wirth 延伸 BNF 成為 EBNF (Extended Backus–Naur Form) 方法 加入『迴圈語法』用以代表重覆出現的意思

將 BNF 改為 EBNF 以便消除左遞迴問題,讓遞迴下降法可以剖析 EBNF 語法。

本書所使用的語法符號 (1) 中括號 大括號 代表一群字的集合 範例: [a-zA-Z] 代表 所有的英文字母 單純用來括住一個範圍,並用星號、加號、問號代表 重複次數。 範例:E = T ([+-] T)* 代表 ([+-] T) 部分可重複數次 (零次以上)。

本書所使用的語法符號 (2) 星號 (…)* 加號 (…)+ 問號 (…)? 代表 (…) 部分重複比對, 其中的星號 * 代表出現「零次以上」 加號 (…)+ 其中的星號 * 代表出現「一次以上」 問號 (…)? 其中的星號 ? 代表出現「零次或一次」。

7.3 語意理論 說明 高階語言 語意理論所探討的是語法所代表的意義, 也就是某個語法應該如何被執行, 或者如何轉換成組合語言的問題。 7.3 語意理論 說明 語意理論所探討的是語法所代表的意義, 也就是某個語法應該如何被執行, 或者如何轉換成組合語言的問題。 高階語言 語法理論  語意理論  執行平台

結構化程式語言 說明 範例 目前的程式語言大多屬於結構化程式語言 使用 if、for、while 作為控制邏輯 C、C++、C#、 Java、Obj C、Python、Perl

結構化的語意 指定:a = 5; 運算:b+3*d; 循序: s1; s2; s3; s4; …. 分支:if (…) … else (…) 迴圈:for (…) { …} , while (…) { … } 函數:f() {…}, f();

結構化程式的構造方式

7.4 執行環境 直譯式執行環境 (本章解說) 編譯式執行環境 (下一章解說) 透過直譯器直接執行高階語言程式 7.4 執行環境 直譯式執行環境 (本章解說) 透過直譯器直接執行高階語言程式 編譯式執行環境 (下一章解說) 利用編譯器將高階語言轉換為可目的檔 目的檔可在下列兩種平台上執行 虛擬機器:像是 Java 編譯後就在 JVM 虛擬機上執行。 真實機器:像是 C 語言編譯後就變成機器碼,可直接載入記 憶體後在 CPU 上執行。

透過直譯器執行

結構化程式的直譯過程

直譯器的演算法 (1)

直譯器的演算法 (2)

直譯器的演算法 (3)

7.5 實務案例:C 語言 C 語言的語法及語意 C 語言的執行環境 基本單元、指定結構、運算結構、循序結構、分支結 構、迴圈結構、函數結構 程式段、資料段、BSS段 使用框架存取參數與區域變數

C 語言的語法及語意 基本單元 指定結構 運算結構 循序結構 分支結構 迴圈結構 函數結構 x, 35, "hello!", x[3], f(x), f(), rec.x, rec-x, x++, x– 指定結構 a=3*x 運算結構 a * 3 + b[5] 循序結構 i=1; x=f(3); t=a; a=b; b=t; 分支結構 if(a>b) x=a; else x=b; 迴圈結構 for (i=0; i<10; i++) sum += i; 函數結構 int max(x,y) { return x>y?x:y; } c = max(a,b);

語法:基本單元 範例 X 35 "hello!“ x[3] f(x) f() rec.x rec->x x++ x–

語法:指定結構 範例 a=3*x a = b = 3*x a = (x != y)

語法:運算結構 範例:a * 3 + b[5] additive_exp (a*3+b) : additive_exp (a*3) + mult_exp (b[5])

語法:循序結構 範例 i=1; x=f(3); t=a; a=b; b=t;

語法:分支結構 範例: if (a>b) x=a; else x=b; switch (c) { case ‘a’: x+=a; case ‘b’: x+=b; default: x+=c; }

語法:迴圈結構 範例 while (true) { …} do { … } while (! end) for (i=0; i<10; i++) { sum += i; }

語法:函數結構

函數結構的範例 語法 範例 static int f(n) int n; {return n*n; } function_def = decl_specs declarator decl_list compound_stat 範例 static int f(n) int n; {return n*n; } decl = static spec = int declarator = f(n) decl_list = int n; compound_stat = {return n*n; }

C 語言的執行環境 編譯式語言 目標:特定 CPU 的機器碼 C 語言編譯後的機器碼通常是與平台相關的, 是可以 直接被 CPU 執行的 2 進位碼, 因此速度非常的快, 這也是 C 語言的優點之一。

編譯與執行環境 編譯後 執行時 C 語言在執行時, 通常會編譯為目的檔或執行檔的形 式, 這個些檔案包含程式段、資料段、BSS 段等區域 在執行時還會多出堆疊 (Stack) 與堆積 (Heap) 等兩 個區段。

圖 7.17 C 語言的執行時的記憶體配置圖 (a) 程式開始時的記憶體分配情況 (b) 程式執行中的記憶體分配情況 程式段 .text 堆積段 (heap) 堆疊段 (stack) 資料段 .data 未初始化資料 .bss 使用中堆積區塊 已釋放區塊 (a) 程式開始時的記憶體分配情況 (b) 程式執行中的記憶體分配情況 使用中的堆疊

堆疊與堆積 堆疊段的用途: 堆積段的用途: 比較 儲存「區域變數」、 「參數」、 「返回點」 提供 malloc() 的空間,並在 free() 時回收。 比較 與堆積段的成長方向是相反的, 假如堆積由上往下成 長, 堆疊段的成長方向就會是由下往上。堆疊與堆積 兩段共用同一塊記憶體空間, 但是起始點與成長方向 完全相反。

C 語言如何存取堆疊中的區域變數 問題:必須支援遞回呼叫 因為在遞迴呼叫的過程中, 參數名稱與區域變數的名 稱雖然相同, 但是不同層次的遞迴所『看見的』變數 內容是不同的。

框架 一個函數的參數與區域變數所形成的堆疊區塊, 通 常稱之為框架 (Frame) 為了要存取這個框架, 我們可以設定一個框架暫存 器 (Frame Pointer, FP), 然後使用相對定址的方式 存取這些變數。 在 CPU0 中, 我們會習慣以 R11 作為框架暫存器, 因此我們也用 FP 稱呼 R11。

使用框架存取參數與區域變數 使用相對於框架暫存器的定址法 進入函數前設定好框架暫存器的內容

具有兩層函數呼叫的 C 語言程式

圖 7.18 函數呼叫時的堆疊與框架變化情形 … 框架指標 FP 區域變數 x 區域變數 y 參數 t (=x=1) +4 -4 -8 -4 -8 -12 FP SP y=f1(x) 返回地址 (LR) 保存的 FP 區域變數 b 參數 t (=x=1) (LR) +8 y=f1(x) 返回地址 參數 *p (=&t) b=f2(&t) 返回地址 (LR) 區域變數 r (c) 呼叫 b=f2(&t) 之後 (b) 呼叫 y=f1(x) 之後 (a) 呼叫 y=f1(x) 之前 +12

如何用組合語言存取堆疊中的區域變數? (main)

如何用組合語言存取堆疊中的區域變數? (f1)

如何用組合語言存取堆疊中的區域變數? (f2)

C 語言進入函數時的基本動作 1. 先保存連結暫存器 LR 的值, 以避免該函數再度呼叫子函數時, LR 的值會被覆蓋。 2. 接著再保存舊的框架暫存器 FP, 以便函數返回前可以恢復 FP。 3. 接著, 將框架暫存器更新為堆疊的頂端 (MOV FP, SP)。 4. 最後, 再分配好區域變數的空間之後, 前置段的工作就完成了。

C 語言進入函數時的基本動作 1. 先保存連結暫存器 LR 的值, 以避免該函數再度呼叫子函數時, LR 的值會被覆蓋。 2. 接著再保存舊的框架暫存器 FP, 以便函數返回前可以恢復 FP。 3. 接著, 將框架暫存器更新為堆疊的頂端 (MOV FP, SP)。 4. 最後, 再分配好區域變數的空間之後, 前置段的工作就完成了。

C 語言離開函數時的基本動作 1. 恢復堆疊指標 SP 2. 恢復框架指標 FP 3. 恢復連結暫存器 LR 4. 用 RET 返回呼叫點

結語 C 語言的語法及語意 C 語言的執行平台 基本單元、指定結構、運算結構、循序結構、分支結 構、迴圈結構、函數結構 直接編譯成目標 CPU 上的機器碼 目的檔:包含程式段、資料段、BSS段 執行時:增加堆疊段與堆積段

習題 7.1 請說明何謂 BNF 語法?何謂 EBNF 語法?並比較兩者的異同。 7.2 請將 BNF 語法 A = B | A '.' B 轉換為 EBNF 語法。 7.3 請寫出 C 語言當中 for 迴圈的 BNF 語法。 7.4 請說明何謂直譯器? 7.5 請說明何謂編譯器? 7.6 請比較直譯器與編譯器兩者的異同。 7.7 請說明何謂語法理論? 7.8 請說明何謂語意理論? 7.9 請說明何謂框架 ? 7.10 請舉例說明 C 語言如何利用框架暫存器存取參數與區域變數?