1.4k likes | 1.56k Views
計算機概論. 第三章 程式語言. 陳維魁 / 陳邦治 旗標出版社. 本章重點. 程式語言是由一組系統化的符號所構成之集合 使用程式語言的目的則是利用這些符號來表達某種機器解決特定問題的步驟 程式語言設計的目標則是為了達到簡潔 (simplicity) 的要求 學習程式語言的主要目的 可增進對程式語言的瞭解 可改進設計程式之架構 增進程式執行之效率 可選擇適用的語言 較易學習與設計新的語言. 程式語言的分類 近代常見程式語言簡介 物件導向程式語言 高階語言處理器 程式語言的資料型態 變數的定義 繫結. 完全計算與捷徑計算 變數引用規則
E N D
計算機概論 第三章 程式語言 陳維魁/陳邦治 旗標出版社
本章重點 • 程式語言是由一組系統化的符號所構成之集合 • 使用程式語言的目的則是利用這些符號來表達某種機器解決特定問題的步驟 • 程式語言設計的目標則是為了達到簡潔(simplicity)的要求 • 學習程式語言的主要目的 • 可增進對程式語言的瞭解 • 可改進設計程式之架構 • 增進程式執行之效率 • 可選擇適用的語言 • 較易學習與設計新的語言
程式語言的分類 近代常見程式語言簡介 物件導向程式語言 高階語言處理器 程式語言的資料型態 變數的定義 繫結 完全計算與捷徑計算 變數引用規則 程式設計基本觀念 程式設計基本結構 副程式與參數傳遞的處理方式 動態連結函式庫 大綱 3 3
程式語言的分類 • 程式語言依照出現的先後次序共可分成五代 • 機器語言(machine language) • 組合語言(assembly language) • 高階語言(high level language) • 極高階語言 • 自然語言(nature language)
機器語言 • 機器語言的指令與資料均由二進碼所組成,因此利用機器語言所寫成的程式段不需經由語言處理器的處理便可直接在機器上執行 • 機器語言最難學習,不易使用 • 機器相關性(machine dependence)高
組合語言 • 組合語言的指令稱為助憶碼(mnemonic code) • 機器指令(machine operation) • 虛擬指令(pseudo operation) • 利用組合語言所寫成的程式段必需經由組譯程式(assembler)的處理才可在機器上執行 • 機器語言與組合語言合稱為低階語言 • 若將組合語言與機器語言做一比較,組合語言的可讀性較佳,較容易學習,但是程式執行的效率則較差
高階語言 • 高階語言又稱為程序導向語言(procedure oriented language) • 利用高階語言寫成的程式碼必須經過編譯程式(compiler)或直譯程式(interpreter)處理過後方可執行 • 如Pascal、C、C++、Basic,Fortran與Cobol
極高階語言 • 極高階語言又稱為問題導向語言(problem oriented language) • 如SQL (Structured Query Language)
自然語言 • 自然語言又稱為知識庫語言(knowledge based language) • 語法十分接近人類日常生活所用的語言,如英文、日文或中文
近代程式語言簡介 • Fortran • Cobol • Basic • Pascal • C/C++ • Java • Lisp 及Prolog
Fortran • Fortran (FORmula TRANslator language)是IBM的John Backus在1950年代中期所開發 • 第一個高階語言 • 主要是針對科學計算而設計 • 具固定格式(當時Fortran規定程式必須從第七行開始寫起) • 首創了輸出入格式化(I/O format)的觀念 • 允許「隱含性變數」(implicit variable),如變數的第一個字元為I,J,K,L,M,N時該變數可不經宣告即內定為整數型態
Cobol • Cobol(COmmon Business Oriental Language)發展於1960~1970年代 • 由美國防部贊助開發完成 • 主要用於商業資料處理 • 語法傾向自然語言 • 首創以雜訊字(noise word)觀念來編寫程式碼
Basic • Basic語言(Beginner‘s All-purpose Symbolic Instruction Code)在1960年代中期發展 • 當適合初學者使用的語言 • 語法結構簡單,操作也相當容易 • 交談式(interactive)的語言 • 利用直譯器(interpreter)來處理程式
Pascal • 1975年一個以數學家Blaise Pascal之名命名的程式語言Pascal誕生 • 採區塊結構(block structure)來寫作程式 • 首創集合(set)資料型態供程式設計師使用 • 最大的優勢是具備嚴謹的語法結構,讓使用者不容易犯錯,非常適合教學用途
C語言 • C語言是由貝爾實驗室於1970年代所發展出來 • 採區塊結構,具高可攜性,因此適合發展系統程式 • 利用C語言撰寫的程式相同字元的大小寫(如A及a)會被視為是不同的符號
C++語言 • C++是C語言的物件導向版程式開發工具 • C++ 語言是由 Bjarne Stroustrup 在貝爾實驗室中設計而得 • C++ 語言設計的主要目標是希望能實現物件導向程式設計的理想
Java • Java語言是由Sun Microsystems沿襲了C語言的語法並加入許多新的程式結構元素發展而成的物件導向程式語言 • Java語言為提昇程式的安全性,取消 • 指標(pointer)資料型態 • 多重繼承(multiple inheritance) • 運算子覆載(operator overloading)等功能 • Java語言允許其程式段能夠透過網路系統到另一個機器平台上執行
LISP • LISP(LISt Processing language)是由麻省理工學院於1950年代末期發展 • 利用S運算式(S expression)做為主要的資料結構 • 記憶體管理法採用垃圾收集法(garbage collection) • 採用「劍橋波蘭式」(Cambridge polish notation)作為算術運算式 • 一般被稱為人工智慧領域的低階語言
PROLOG • PROLOG是由Alan Colmeraure於1970年代初期發展出來 • 為邏輯式程式語言 • 一般被稱為人工智慧領域的高階語言 • 日本發展的第五代電腦計劃採用Prolog為其語言 • Prolog為適用於處理符號和非數值運算之程式語言。
物件導向程式語言 • 物件導向程式語言(Object Oriented Programming Language;OOPL)是由「抽象資料型態」(abstract data type)與「資料抽象化」(data abstraction)的觀念發展而來 • 「抽象資料型態」是指資料型態可區分為實作(implementation)及使用者介面(user interface)二部分 • 而「資料抽象化」則是指將資料型態區分為實作與使用者介面的動作即稱為資料抽象化
物件導向程式語言三大特徵 • 資訊隱藏或稱為封裝(encapsulation) • 繼承(inheritance)能力 • 多面性(polymorphism)
封裝 • 封裝主要的目的就是期望能將不希望給外界知道的資訊,隱藏起來也就是達到「資訊隱藏」(information hidden)的目的 • 通常在寫作程式時可以利用將變數宣告為不同等級便可達到「資訊隱藏」的效果
繼承 • 繼承是指程式語言可利用已建立好的類別(class)來產生新的類別,依此方式產生的新類別將可繼承所有原來類別的特性並可依需要新增或刪除特定的功能 • 「繼承」是類別要完成擴充目的的基本要件 • C++ 語言允許 1對1,1對多,多對1的繼承方式 • JAVA語言僅允許允許1對1的繼承方式 • 若程式語言具備「繼承」能力則程式的可重用性將較高,較易擴充且較易維護
多面性 • 多面性代表具相同名稱的函式,但卻具有不同的功能 • 如C++語言允許右方程式段之寫法 • 右方程式段中有四個print函式,雖然函式的名稱都是print,但是因為參數的型態不同,因此會被視為是四個不同的函式
高階語言的處理器 • 高階語言的處理器主要的作用即是將利用高階語言寫成的程式段翻譯成機器可處理的碼 • 主要可分成編譯器(compiler)及直譯器(interpreter)二類 • 編譯器(也可稱為編譯程式)會對原始程式碼中的每一條敘述,按照先後順序均做一次之處理,並產生對應的目的碼 • 直譯器(也可稱為直譯程式)會對原始程式碼中的敘述,按照執行的先後順序做處理,並直接產生程式執行結果
編譯器處理方式 • 編譯器對左方程式的處理順序如下: • 第1行第2行第3行第4行第5行第6行第7行第8行第9行第10行第11行第12行
直譯器處理方式 • 直譯器對左方程式的處理順序如下: • 第4行第5行第6行第7行第8行第9行第10行第5行第6行第7行第8行第9行第10行第5行第11行第12行
資料型態 • 資料型態是指一群個體(object)以及作用在這群個體上的運算 • 常見的資料型態分類 • 基本資料型態(elementary data type) • 結構性資料型態 (structured data type)
基本資料型態 (1/3) • 基本資料型態是指不可再切割為更小單位的型態類別 • 數值 • 字元(character) • 布林值(boolean value) • 列舉式資料型態(enumerated data type) • 指標資料型態 (pointer data type)
基本資料型態(2/3) • 數值一般可分為整數與浮點數二種 • 浮點數代表具有小數位數之數值 • 字元會佔用一個位元組(byte)的記憶體空間 • 布林值有「真」(true)與「假」(false)二種 • 通常程式語言不允許布林值與數值混合使用 • 但C/C++語言卻允許布林值與數值混合使用,在C/C++語言中只要數值非0便會被視為「真」,若數值為0則視為是「假」 • BASIC語言以「-1」代表布林值「真」,「假」則為「0」。
基本資料型態(3/3) • 列舉式資料型態是指將需要的資料一一定義與列舉出來 • 假設旗標公司編輯部有5位主編,分別是Alice,Bob,Dick,Mark與Peter,C語言將此份資料定義成一列舉式資料型態之語法如下: enum Editor {Alice, Bob, Dick, Mark, Peter}; • 指標可以是記憶體位址或nil • 因為指標可以隨意存取記憶體空間中之內容,所以指標型態的彈性很大,但會使得程式的可靠度不佳、存取速度較慢及可能造成懸置引用(dangling reference)的問題 • Java語言並未提供指標型態供程式設計師使用
C語言指標的用法 • C語言使用「*」做為指標變數的「取值運算子」,「&」做為一般變數的「取址運算子」。 • 範例如下: int a,*b;
C語言的指標與陣列型態 • C語言的指標與陣列型態經常會被比較 • C語言的陣列的起始位址有二種不同的表示法,分別是: • 陣列名稱 • 陣列的第一個元素之位址 • 範例 int xxx[168]; xxx為陣列名稱,C語言陣列元素規定由0開始編號,所以本題陣列元素的編號由0~167,共168個元素。代表陣列的起始位址的表示法有以下二種:xxx及&xxx[0]
結構性資料型態 • 常見的結構性資料型態 • 字串(string) • 由字元(character)組成。例如,”book”、”computer”、”internet”均為字串 • 記錄(record) • 記錄是由固定數目,但型態可以不同的元素所組成 • 聯合(union)資料型態 • 同一個變數佔用的記憶體空間,在不同執行時間可由不同型態的值存放
結構性資料型態(cont.) • 常見的結構性資料型態 • 陣列(array) • 陣列由名稱、維度(dimension)、索引(index)及元素型態陣列等元件組成。陣列的主要有二項限制: • 元素必須存放在連續的記憶體空間。 • 元素的型態必須完全相同 • 集合(set): • 集合可表示沒有順序關係的資料,若程式語言提供集合資料型態則應提供聯集、交集及差集運算。 • 檔案(file): • 檔案是由相關的記錄所組成
型態強制轉換(coercion) • 型態強制轉換是指將某一型態的值強制轉換成為另一種型態之值 • 可分為二種不同作法 • 「寬化」(widening) • 將某一型態的值轉換為另一型態,而值不會改變者 • 「窄化」(narrowing) • 將某一型態的值轉換為另一型態,而值可能會改變者
多意(polymorphism) • 對同一個運算式中的運算子(operator)而言,若運算子會因為運算元(operand)的型態不同,而使得運算子具有不同的意義便稱為「多意」 • 下表為利用Basic語言舉出的一個「多意」的實例
範例 • 假設變數A的型態為整數,變數B的型態為浮點數,請問A+B運算式在實際處理時,對於資料型態的處理方式為何? 解: • 必須將A與B之型態一致化之後,才能進行運算,如浮點數轉為整數。通常若執行型態轉換動作,通常會以「寬化」動作為優先,因為「寬化」動作不會產生誤差,而「窄化」動作通常會產生誤差。所以本題的處理方式為「先將變數A的型態軟換成浮點數,再執行二個浮點數相加的動作」
型態檢驗 • 型態檢驗是指對運算式中的所有運算元做運算相容性檢驗,通常分為以下二種不同的作法: • 靜態型態檢驗(static type checking) • 執行前做型態檢驗動作,近代的程式語言多是採用本法。 • 動態型態檢驗(dynamic type checking) • 執行時做型態檢驗動作
變數的定義 • 變數是由四個元件所組成 • 名稱(name) • 屬性(attribute) • 引用(reference) • 值(value)
變數元件-- 「名稱」 • 「名稱」即指變數的名字 • 並非所有的變數都有名稱的,如指標變數(pointer variable)的名稱僅是引用(reference)該變數的方式,並非真正的名稱,此類變數稱為不具名變數(anonymous variable)
變數元件-- 「屬性」 • 「屬性」是指變數的型態 • 如整數、實數、字元、字串、布林值等