編譯原理第2講——高階程式設計語言概述
常用的高階程式設計語言
程式語言的定義
語法
程式本質上是一定字符集上的字串 語法:一組規則,用它可以形成和產生一個合式(well-formed)的程式
詞法規則:單詞符號的形成規則
- 單詞符號是語言中具有獨立意義的最基本結構。
- 一般包括:常數、識別符號、基本字、算符、界符等。
- 描述工具:有限自動機。
語法規則:語法單位的形成規則
- 語法單位通常包括:表示式、語句、分程式、過程、函式、程式等
- 描述工具:上下文無關文法
E ----> i 一個算數表示式可以用識別符號構成 E ----> E+E 一個算數表示式可以由兩個子表示式通過加號連線而成 E ----> E*E 一個算數表示式可以有兩個子表示式通過星號 ‘*’ 連線構成
這裡將*唸作星號,表示是一個語法概念,念成乘號就變成了語義概念
E ----> (E) 一個算數表示式加上括號還是算數表示式
- 語法規則和詞法規則定義了程式的形式結構
- 定義語法單位的意義屬於語義問題
語義
語義:一組規則,用它可以定義一個程式的意義 描述方法
- 自然語言描述:二義性、隱藏錯誤和不完整性
- 形式描述
程式語言成分的邏輯和實現意義
抽象的邏輯意義 數學意義 計算機實現的意義 具體實現
高階程式設計語言的一般特性
高階語言的分類
- 強制式語言/過程式語言
- 應用式語言
- 基於規則的語言
- 面嚮物件語言
程式結構
FORTRAN
- 一個程式由一個主程式段和若干輔程式段組成
- 輔程式段可以是子程式、函式段或資料塊
- 每個程式段由一系列的說明語句和執行語句組成,各段可以獨立辨析
- 模組結構,沒有巢狀和遞迴
- 各程式段相對獨立,命名
PASCAL
- 程式本身可以看成是一個作業系統呼叫的過程,過程可以巢狀和遞迴
- 一個PASCAL過程
- 同一個識別符號在不同過程中代表不同的名字
- 作用域:一個名字能被使用的區域範圍
最近巢狀原則 一個在子程式B1中說明的名字X只在B1中有效(區域性於B1)
如果B2是B1的一個內層子程式且B2中隊識別符號X沒有新的說明,則原來的名字X在B2中仍然有效 如果對B2對X重新作了說明,那麼B2對X的任何引用都是指重新定義的X
JAVA
- 面向物件的高階語言
資料結構與操作
資料型別通常包括三要素
- 用於區別這種型別資料物件的屬性
- 這種型別的資料物件可以具有的值
- 可以用於這種資料物件的操作
初等資料型別
資料型別
- 整型、實型、複數、雙精度
- 運算:+ - * /
邏輯型別
- true false
- 布林型別
字元型別:符號處理
指標型別
陣列
邏輯上,陣列是由同一型別資料組成的某種n維矩形機構,沿著每一維的距離,稱為下標。
編譯時能否確定其存貯空間的大小分為可變/不可變陣列。
存放方式
- 按行存放:C\PASCAL
- 按列存放:FORTRAN
陣列元素地址計算
設A為n維陣列,按行存放,每個元素寬度為w
- lowi為第i維下界
- upi為第i維上界
- ni為第i維可取值的個數(ni=upi-lowi+1)
- base為A的第一個元素相對地址
元素A[I1,I2,…IK]相對地址公式 其中con為固定部分
內情向量
登記維數、各維的上下限,首地址,以及陣列元素的型別等資訊
記錄
由已知型別的資料組合在一起的一種結構 記錄或者結構的元素,也叫做域(field)
record{
char name[20];
integer age;
bool married;
}cards[1000]
訪問:複合名 儲存:連續存放 域的地址計算:相對於記錄結構七點的相對數OFFSET
字元、表格、棧
字串:符號處理、公式處理 表格:本質上是一種記錄結構 線性表:一組順序話的記錄結構 棧:一種線性表,後進先出
抽象資料型別(Abstract Data Type)
抽象資料型別由資料集合、及其相關的操作組成,這些操作有明確的定義,而且定義不依賴於具體的實現。
一個抽象資料型別包括
- 資料物件集合
- 作用於這些資料物件的抽象運算的集合
- 這種型別物件的封裝,即除了使用型別中所定義的運算外,使用者不能對這些物件進行操作
程式設計語言對抽象資料型別的支援
- Ada通過程式包提供封裝機制來提供抽象支援
- 面嚮物件語言通過類提供支援
語句與控制結構
表示式
- 表示式由運算量(運算元,即資料引用或函式呼叫)和算符(運算子、操作符)組成。
- 形勢:中綴、字首、字尾
- 表示式形成規則
算符的優先次序
一般的規定
- PASCAL:左結合 A+B+C=(A+B)+C
- FORTRAN:對於滿足左右結合的算符可任取一種
代數性質
- 代數性質能引用到什麼程度視具體的語言而定
- 在數學上成立的代數性質在計算機上未必完全成立:A+B=B+A
語句
賦值語句:A:=B
- 名字的左值:該名字代表的儲存單元的地址
- 名字的右值:改名字代表的存貯單元的內容
控制語句
- 無條件轉移語句 goto L
- 條件語句 if then else
- 迴圈語句
- 過程呼叫語句
- 返回語句 return
語句的分類
- 執行語句:描述程式的動作
- 說明語句:定義各種不同資料型別的變數或運算,定義名字的性質
- 簡單句:不包含其它語句成分的基本句
- 複合句:句中有句的語句
識別符號與名字
識別符號
- 以字元開頭的,由字元數字組成的字串
名字
- 標識程式中的物件
- 由識別符號和資料物件繫結而成(binding)
名字的意義和屬性
- 值:單元中的內容
- 屬性:型別和作用域
名字的說明方式
- 由說明語句來明確規定的:int a、
- 隱含說明:FORTRAN
- 動態確定:走到那裡,是什麼,算什麼
名字的繫結(binding)可以發生在編譯過程或者執行過程中 靜態繫結:變數宣告、型別定義、函式的定義 動態繫結:多型性、虛擬函式