程式語言與程式設計

Download Report

Transcript 程式語言與程式設計

計算機概論
演算法與程式語言
李明山
演算法與程式語言
1
演算法設計
演算法(Algorithm)
 解決問題的方法
 以虛擬程式碼(Pseudo code)描述解題的
步驟與方法
 演算法必須具備的五大條件:輸入、輸
出、明確性、有限性和效率性。
 包括明確的輸出入資料和詳細且有限的
執行步驟
演算法與程式語言
2
示範題目:求兩整數之最大公約數(GCD)
Input LARGER,
SMALLER
Yes
SMALLER = 0 ?
No
REMAINDER =
LARGER Mod SMALLER
LARGER = SMALLER
SMALLER = REMAINDER
algorithm GCD
input larger, smaller
while smaller ≠ 0 do
remainder = larger mod smaller
larger = smaller
smaller = remainder
end while
output larger
end GCD
Output LARGER
Halt
演算法與程式語言
3
程式語言簡介
演算法與程式語言
4
程式(Program)
 一系列指令(instruction)或敘述(statement)
的組合
 為了解決某些問題或為了完成某些任務
而指揮電腦執行一系列工作的處理程序
與步驟
Dim i%, j%, k%, M%,
For i%=1 To 9
For j%=0 To 9
For k%=0 To
M% = i%
N% = i%
If M% =
Next k%
Next j%
Next i%
演算法與程式語言
5
N%
9
* 100 + j% * 10 + k%
^ 3 + j% ^ 3 + k% ^ 3
N% Then Print M%
電腦軟體(Software)
 泛指電腦中可以執行之所有程式
演算法與程式語言
6
軟體的分類
軟體依其使用的性質可區分為:
 系統軟體(System Software) - 維繫電腦正
常運作的軟體,如作業系統(Operating
System) MS-DOS, Windows, OS/2, UNIX,
VMS。
 應用軟體(Application Software) - 針對某
些特殊應用而設計的軟體,如文書處理
(Word Processing)軟體 Microsoft Word,
AmiPro。
演算法與程式語言
7
程式語言(Programming Language)
 人與電腦溝通的語言
 人能寫得來,電腦能認得來、做得來。
演算法與程式語言
8
程式語言的演進
 第一代程式語言:
機器語言(Machine Language)
 第二代程式語言:
組合語言(Assembly Language)
 第三代程式語言:
高階語言(High Level Language)
FORTRAN, COBOL, BASIC, PASCAL, C
演算法與程式語言
9
機器語言(Machine Language)
 由"0"與"1"等二進位數字所組成的語言。
 每一指令都是中央處理單元直接可以判讀
的語言。
演算法與程式語言
10
機器語言(Machine Language)
 機器語言的指令是由運算碼(Operation
Code)與運算元(Operand)合成。
運算碼
15 14 13 12 11 10 9
運算元
8
7
6
5
4
3
2
1
0
意謂各個指令基本上乃是“以〔運算元〕的資
料作〔運算碼〕的動作”。
演算法與程式語言
11
組合語言(Assembly Language)
 將機器語言的運算碼改成簡單易懂的符
號或文數字
演算法與程式語言
"1001"
"JMP"
"1111"
"HALT"
12
一台簡單的電腦
 將介紹的是虛擬的一台架構簡單的電腦,雖然
現實世界中不可能有這麼簡單的電腦存在,但
是它的基本結構與真實的電腦類似,用它來解
說電腦最深層的運作狀況,是非常能夠幫助我
們得到基本的概念。
 以下先逐一說明它的架構(系統設定與元件內
容),再以一段小程式的程式碼設計與執行過
程解說中央處理單元一步步處理的程序。
演算法與程式語言
13
一台簡單的電腦
 電腦處理單位─word
 執行一次處理程序運作的資料量(固定長度位元)
 設定為16位元
1 0 0 1 0 0 0 1 1 0 1 0 0 1 1 1
15 14 13 12 11 10
9
8
7
6
5
4
3
2
1
0
 為了記錄上便利性,通常我們會將二進位制的位元
值換成十六進位制表示法
演算法與程式語言
14
十六進位表示法
四位元值
十六進位表示法
0000
0001
0010
0011
0100
0101
0110
0111
1000
1001
1010
1011
1100
1101
1110
1111
0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
演算法與程式語言
 每四位數的二進位制位
元值(如”1010”)可對應
轉換成一位數的十六進
位制位元值(如”A”)。
 一個電腦處理單位(Word)
二進位制十六位數
(如”
1001 0001 1010 0111”)
可對應轉換成十六進位
制四位數(如”91A7”)
。
15
十六進位表示法
1
0
0
0
1
1
0
1
0
0
1
1
1
15 14 13 12 11 10
9
8
7
6
5
4
3
2
1
0
1
1
0
0
1
1
1
1
0
0
1
1
15 14 13 12 11 10
9
8
7
6
5
4
3
2
1
0
0
0
1
演算法與程式語言
1
0
0
1
16
91A7
ACF3
資料格式
 一個電腦處理單位(Word)可能用作整數數值的儲存,設
定其資料格式為第一個位元作為正負號,其餘15個位
元是大小值(絕對值)部分。
正負號
大小值
15 14 13 12 11 10
9
8
7
6
5
4
3
2
1
0
0000 0000 0000 0101
+5
1000 0000 0000 0101
-5
演算法與程式語言
17
指令格式
 一個電腦處理單位(Word)也可能用來代表指令,將16個位元區分成“
運算碼”4個位元與“運算元”12個位元兩部分。
運算碼
15 14 13 12 11 10 9
運算元
8
7
6
5
4
3
2
1
0
 運算碼(operation code)是電腦中央處理單元具有之各項功能指令的
代碼,使用4個位元,代碼總數最多只有16個(24) 。
 運算元可以說是運算碼的參數,依據個別指令的設定,這個參數可
能是主記憶體的位址編號,以對應欲處理之資料,也可能直接對
應為一個數值進行處理,有些運算碼可能不需要任何參數。(實際
的電腦可能有些運算碼不只一個參數,即運算元可能多個!)
演算法與程式語言
18
主記憶體架構
位址
0000 0000 0000
0000 0000 0001
0000 0000 0010
0000 0000 0011
0000 0000 0100
0000 0000 0101
0000 0000 0110
¡ E
¡ E
¡ E
1111 1111 1010
1111 1111 1011
1111 1111 1100
1111 1111 1101
1111 1111 1110
1111 1111 1111
演算法與程式語言
記憶體
=
=
=
=
=
=
=
=
=
=
=
=
=
000
001
002
003
004
005
006
¡ E
¡ E
¡ E
FFA
FFB
FFC
FFD
FFE
FFF
(16 bits)
¡ E
¡ E
¡ E
19
 主記憶體是暫存程式及
資料的地方,中央處理
單元在執行過程中,會
不斷地到主記憶體擷取
資料或將資料存入主記
憶體,每次都是存或取
一個Word,主記憶體
的儲存空間需要設定位
址編號,以下稱「記憶
體位址」 。
 搭配運算元大小為12
個位元,主記憶體的位
址編號即是以12個位
元作設定,意即主記憶
體最大容量是
4096(212)。
中央處理單元架構
 中央處理單元內部有三個元件:
累加器
15 14 13 12 11 10
9
8
7
6
5
4
3
2
1
0
Accumulator
狀態指示器
1
0
Condition Code Register
指令位址暫存器
(程式計數器)
11 10
9
8
演算法與程式語言
7
6
5
4
3
2
1
0
20
Instruction Address Register
(Program Counter, PC)
中央處理單元之元件

累加器(Accumulator)

擔任運算工作的元件,一個運算基本上需要兩個步驟完成:
1. 將運算元載入(Load)累加器
2. 與另一運算元執行運算(加、減、乘、除、數值比較)
運算結果置於累加器(數值比較則改變狀態指示器之值)
狀態指示器(Condition code register)


表示累加器進行數值比較結果的狀態
指令位址暫存器(Instruction address
register)



又稱程式計數器(Program counter)
將擷取之下一個指令之記憶體位址
演算法與程式語言
21
中央處理單元架構
狀態指示器
1
0
Condition Code Register
0
0
累加器之數值小於指定記憶體位址上之數值
0
1
累加器之數值等於指定記憶體位址上之數值
1
0
累加器之數值大於指定記憶體位址上之數值
演算法與程式語言
22
運算碼的設定
運算碼
0001
0010
0011
0100
0101
0110
0111
1000
1001
1010
1011
1100
1101
1110
1111
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
演算法與程式語言
助憶詞
LDA
STA
ADD
SUB
MUL
DIV
MOD
CMP
JMP
JLT
JEQ
JGT
IN
OUT
HALT
¸ ü
¤ J
Àx
¦ s
¥ [ª k
¹ B
º â
´ îª k
¹ B
º â
- ¼
ª k
¹ B
º â
° £
ª k
¹ B
º â
¾ l¼ Æ
¹ B
º â
¼Æ
- È
¤ ņ̃ û
¸ õ
Â÷
- È
¤ p̧ õ
Â÷
µ ¥
- Ȩ̀ õ
Â÷
- È
¤ j̧ õ
Â÷
¿ é¤ J
¿ é¥ X
² ×
µ ²
動作
ACCU ¡ öMM(LOC)
MM(LOC) ¡ öACCU
ACCU ¡ öACCU + MM(LOC)
ACCU ¡ öACCU - MM(LOC)
ACCU ¡ öACCU * MM(LOC)
ACCU ¡ öACCU / MM(LOC)
ACCU ¡ öACCU Mod MM(LOC)
ACCU : MM(LOC)
PC ¡ öLOC
If ACCU < MM(LOC') Then PC ¡ öLOC
If ACCU = MM(LOC') Then PC ¡ öLOC
If ACCU > MM(LOC') Then PC ¡ öLOC
MM(LOC) ¡ öinput data
print MM(LOC)
halt
23
載入指令
 載入指令 load-accumulator instruction, LDA
位址
000
001
002
003
004
005
006
¡ E
¡ E
¡ E
FFA
FFB
FFC
FFD
FFE
FFF
演算法與程式語言
記憶體
LDA 004
將記憶體位址"004"之
內容載入累加器
累加器
¡ E
¡ E
¡ E
15 14 13 12 11 10
9
8
7
6
5
4
3
2
1
0
Accumulator
狀態指示器
1
0
Condition Code Register
指令位址暫存器
(程式計數器)
11 10
24
9
8
7
6
5
4
3
2
1
0
Instruction Address Register
(Program Counter, PC)
儲存指令
 儲存指令 store-accumulator instruction, STA
位址
000
001
002
003
004
005
006
¡ E
¡ E
¡ E
FFA
FFB
FFC
FFD
FFE
FFF
演算法與程式語言
記憶體
STA 004
將累加器之內容儲存
在記憶體位址"004"
累加器
¡ E
¡ E
¡ E
15 14 13 12 11 10
9
8
7
6
5
4
3
2
1
0
Accumulator
狀態指示器
1
0
Condition Code Register
指令位址暫存器
(程式計數器)
11 10
25
9
8
7
6
5
4
3
2
1
0
Instruction Address Register
(Program Counter, PC)
示範程式:求兩整數之最大公約數(GCD)
流程圖
演算法
Input LARGER,
SMALLER
Input LARGER
Input SMALLER
L2: Load SMALLER
Yes
Compare with ZERO
SMALLER = 0 ?
If equal jump to L1
No
Load LARGER
Mod SMALLER
REMAINDER =
LARGER Mod SMALLER
Store REMAINDER
Load SMALLER
LARGER = SMALLER
SMALLER = REMAINDER
Store LARGER
Load REMAINDER
Store SMALLER
Output LARGER
Jump to L2
L1: Output LARGER
Halt
Halt
演算法與程式語言
26
示範程式:求兩整數之最大公約數(GCD)
演算法
Input LARGER
Input SMALLER
在主記憶體
編排之程式
與資料
L2: Load SMALLER
Compare with ZERO
If equal jump to L1
Load LARGER
Mod SMALLER
Store REMAINDER
Load SMALLER
Store LARGER
Load REMAINDER
Store SMALLER
Jump to L2
L1: Output LARGER
Halt
演算法與程式語言
27
位址
記憶體
助憶詞
000
001
002
003
004
005
006
007
008
009
00A
00B
00C
00D
00E
00F
010
011
012
D00F
D010
1010
8012
B00D
100F
7010
2011
1010
200F
1011
2010
9002
E00F
F000
0000
0000
0000
0000
IN LARGER
IN SMALLER
LDA SMALLER
CMP ZERO
JEQ 00D
LDA LARGER
MOD SMALLER
STA REMAINDER
LDA SMALLER
STA LARGER
LDA REMAINDER
STA SMALLER
JMP 002
OUT LARGER
HALT
LARGER
SMALLER
REMAINDER
ZERO
µ{
¦ ¡
¸ ê
®Æ
範例:求 18, 6 之最大公約數
位址
記憶體
助憶詞
000
001
002
003
004
005
006
007
008
009
00A
00B
00C
00D
00E
00F
010
011
012
D00F
D010
1010
8012
B00D
100F
7010
2011
1010
200F
1011
2010
9002
E00F
F000
0000
0000
0000
0000
IN LARGER
IN SMALLER
LDA SMALLER
CMP ZERO
JEQ 00D
LDA LARGER
MOD SMALLER
STA REMAINDER
LDA SMALLER
STA LARGER
LDA REMAINDER
STA SMALLER
JMP 002
OUT LARGER
HALT
LARGER
SMALLER
REMAINDER
ZERO
演算法與程式語言
程式執行:
指令
累加器
狀態指示器
0.
1.
0 0 0
D00F
0 0 1
0 0 F 0012
2.
PC
Input "18"
D010
0 0 2
0 1 0 0006
Input "6"
3.
1010
0 0 0 6
4.
8012
0 0 0 6
1 0
0 0 4
5.
B00D
0 0 0 6
1 0
0 0 5
6.
100F
0 0 1 2
1 0
0 0 6
7.
7010
0 0 0 0
1 0
0 0 7
8.
2011
0 0 0 0
1 0
0 0 8
0 1 1 0000
28
0 0 3
範例:求 18, 6 之最大公約數
位址
記憶體
助憶詞
程式執行:
000
001
002
003
004
005
006
007
008
009
00A
00B
00C
00D
00E
00F
010
011
012
D00F
D010
1010
8012
B00D
100F
7010
2011
1010
200F
1011
2010
9002
E00F
F000
0000
0000
0000
0000
IN LARGER
IN SMALLER
LDA SMALLER
CMP ZERO
JEQ 00D
LDA LARGER
MOD SMALLER
STA REMAINDER
LDA SMALLER
STA LARGER
LDA REMAINDER
STA SMALLER
JMP 002
OUT LARGER
HALT
LARGER
SMALLER
REMAINDER
ZERO
指令
演算法與程式語言
累加器
狀態指示器
PC
0 0 F 0012
0 1 0 0006
0 1 1 0000
9.
1010
0 0 0 6
1 0
0 0 9
10.
200F
0 0 0 6
1 0
0 0 A
0 0 F 0006
11.
1011
0 0 0 0
1 0
0 0 B
12.
2010
0 0 0 0
1 0
0 0 C
0 1 0 0000
13.
9002
0 0 0 0
1 0
0 0 2
14.
1010
0 0 0 0
1 0
0 0 3
15.
8012
0 0 0 0
0 1
0 0 4
29
範例:求 18, 6 之最大公約數
位址
記憶體
助憶詞
000
001
002
003
004
005
006
007
008
009
00A
00B
00C
00D
00E
00F
010
011
012
D00F
D010
1010
8012
B00D
100F
7010
2011
1010
200F
1011
2010
9002
E00F
F000
0000
0000
0000
0000
IN LARGER
IN SMALLER
LDA SMALLER
CMP ZERO
JEQ 00D
LDA LARGER
MOD SMALLER
STA REMAINDER
LDA SMALLER
STA LARGER
LDA REMAINDER
STA SMALLER
JMP 002
OUT LARGER
HALT
LARGER
SMALLER
REMAINDER
ZERO
演算法與程式語言
程式執行:
指令
累加器
狀態指示器
PC
0 0 F 0006
0 1 0 0000
0 1 1 0000
16.
B00D
0 0 0 0
0 1
0 0 D
17.
E00F
0 0 0 0
0 1
0 0 E
0 0 F 0006
18.
F000
0 0 0 0
--- END ---
30
Output "6"
0 1
0 0 F
高階語言(High-level Language)
 與人類日常生活用語相近,簡單易學、
撰寫方便的電腦語言。
 高階語言必須先經過編譯器(Compiler)或
釋譯器(Interpreter)加以翻譯成機械語言
後,才能被執行。
演算法與程式語言
31
高階語言(High-level Language)
 FORTRAN ─ FORmula TRANslation,
適用於解決數學、工程及科學上的問題
。
 COBOL ─ Common Business Oriented
Language,適用於商業資料處理。
 BASIC ─ Beginner’s All-purpose
Symbolic Instruction Code,簡單、易學
、易用的一般性多用途程式語言。
演算法與程式語言
32
高階語言(High-level Language)
 PASCAL ─語法嚴謹,符合結構化程式設
計的精神,並擴充了資料結構和資料型
態的能力。
 C語言─結構嚴密,可呼叫組合語言,並
提供許多低階函數,可攜性高,執行速
度快。
 C++ ─物件導向式語言。
演算法與程式語言
33
編譯器(Compiler)
高階語言
(原始程式)
(Source program)
編譯器
機械語言
(目的程式)
(Object program)
執行
執行結果
目的程式
資料
演算法與程式語言
34
釋譯器(Interpreter)
高階語言
(原始程式)
(Source program)
釋譯器
資料
演算法與程式語言
35
執行結果
組合器(Assembler)
組合語言
ADD
演算法與程式語言
組合器
36
機械語言
01011010