準備
下載 Pascal
首先推薦 Free Pascal,它就像過去 DOS 時代的 Turbo Pascal 一樣,提供編譯器、還有藍白畫面的 IDE,濃濃 80 年代風味~
想開發視窗應用程式的話,可以用媲美 Delphi 的 Lazarus,或許你會愛上 Pascal。不過這樣就必須寫 Object Pascal,而物件導向的它一點也不優雅,反而不比 C++ 的雅痞。
我比較推薦寫傳統結構化程式設計的 Pascal,所以本文選擇 Free Pascal 來教學,而不是 Lazarus。
但學會 Pascal 語法,急著想開發應用軟體的話,應該改用視覺化開發環境、拉一拉元件就能寫程式的 Lazarus。這樣一來跟 Java 或 Python 比,到底誰有開發效率,就很難說了~
Hello, world!
用記事本寫入如下程式,並儲存檔案為 main.pas:
進入命令提示字元,然後用 Free Pascal 的 fpc.exe
編譯 main.pas,正常的話會編譯出 main.o 和 main.exe 兩個檔案,執行 main.exe 會顯示 Hello, world!:
參考手冊
Free Pascal 的 doc 資料夾裡,有完整的說明書,以 PDF 檔呈現,製作用心程度,就跟購買商業編譯器附的厚厚好幾本說明書一樣:
user.pdf | User's Guide |
prog.pdf | Programmer's Guide |
ref.pdf | Language Reference guide |
rtl.pdf | Run-Time Library Reference guide |
fcl.pdf | Free Component Library Reference guide |
User's Guide
使用者指南,介紹 Free Pascal 軟體本身,即編譯器和編輯器的安裝與使用,與程式語言無關。基本上跳過不讀,等需要用到時,再翻開來找目錄查閱想要的資料。
Programmer's Guide
程式設計師指南,介紹系統工程師可以用 Free Pascal 完成哪些程式開發工作,像處理器和記憶體的控制啊、多執行緒的排程啊、與作業系統底層的訊息交換啊、最佳化編譯執行啊…還是看下一本好了~
Language Reference guide
語言工具書,寫程式時放在手邊查閱用的,這本不是教你 Pascal 語言怎麼用的,而是對語法的運作方式做深入說明。但根本就沒有詳細指導該怎麼用 Pascal 語言寫程式的書,所以新手或剛入門的人,真正要讀的還是這本。
Run-Time Library Reference guide
函式庫工具書,程式寫不出來就翻翻看有沒有現成的,有 1780 頁,跟大雄哭著找哆啦 A 夢有沒有道具一樣,每次都有新發現。
Free Component Library Reference guide
類別庫工具書,因為 Free Pascal 支援 Object Pascal。
基礎
區塊
主程式必須寫在區塊裡面,區塊以 begin
開始,end
結束。但隨著區塊的不同,end 後面會接不同的符號。
end.
表示整份程式碼到此結束。
連續出現區塊時,使用 end;
表示分隔,通常用在函式區塊的結束,因為函式與程序通常寫在主程式區塊外面,形成連續的區塊。
而像流程控制,每個指令分支下的區塊,本來就是各自獨立的,所以用 end
就好,不用加符號。
一個沒有意義,但能通過編譯,表現各種 begin end 關係的程式:
其實除了 if 結構以外,其他地方的 end 加 ; 分號並不會報錯,嫌麻煩的話一律用 end; 就好 XD 至少一律加分號報錯的機率,遠低於不加分號 XDDD
敘述
分號 ;
並不是敘述的結束,而是分隔多行敘述。
換句話說,只有一行敘述的話,並不用加分號。或者區塊內有多行敘述的話,最後一行的敘述其實不用加分號。
但加了分號也不會報錯,不加反而常常該加的也忘了加,時常報錯,所以個人習慣是所有敘述通通加分號。
大小寫
Pascal 不分大小寫,識別字 sayhello 和 SayHello 是一樣的名稱、var 和 Var 是一樣的指令、true 和 True 是一樣的值。
資料、宣告
宣告型態蠻多的,但基本上這四個就夠了:
integer | 整數,大小隨 16, 32, 64-bit 系統而定。 |
single | 單精度浮點數。 |
string | 字串,使用 ' 單引號,不能使用 " 雙引號。 |
boolean | false 和 true。 |
其次是:
cardinal | 無號整數,大小隨 16, 32, 64-bit 系統而定。 |
double | 倍精度浮點數。 |
char | 字元。 |
pointer | 指標(存取記憶體位址用) |
還有資料結構以及物件導向的:
array | 陣列 |
set | 集合 |
record | 紀錄(鍵值對資料) |
class | 類別 |
object | 物件 |
直接將資料結構做為宣告納入 Pascal,也是這門語言的特色!當時的程式語言,資料結構是要自己寫的,頂多幫你寫好然後放到內建函式庫。但 Niklaus Wirth 認為「程式設計就是演算法加資料結構」,既然 Pascal 要用來教授學生什麼才是程式設計,就將資料結構的觀念也加到語言裡面,於是指令不是只有設計演算法的功能而已,還有資料結構的功能。
最後是固定位元數,大小範圍不變的:
byte | 0 ~ 255 |
word | 0 ~ 65535 |
shortint | -128 ~ 127 |
smallint | -32768 ~ 32767 |
longint | -2147483648 ~ -2147483647 |
int64 | -9223372036854775808 ~ 9223372036854775807 |
currency | 只留小數 4 位的浮點數 |
剩下還有一個用來相容早期 Pascal 處理小數用的 real
(實數)。早期各家編譯器對浮點數的設計都不一樣,直到 1980 年 Intel 推出 8087 這顆專門處理浮點數的輔助處理器,大家開始以它的設計為標準,甚至原生支援 8087 的浮點數省得自己來,速度又快,索性成為 IEEE 754 業界標準。1970 年就問世的 Pascal 也不例外,它使用介於 single (4-bit) 和 double (8-bit) 之間的 6-bit 設計浮點數,支援 IEEE 754 後,real 只做為相容舊版 Pascal 程式時使用,往後都用原生支援處理器浮點數的 single 和 double,光執行效率就差很多。
最後就是宣告變數要放在 var
,宣告常數要放在 const
,同樣型態的變數可用 ,
宣告在一起,宣告時可同時用 =
給予預設值。
定義型態
type
可以定義型態,將複雜的資料結構寫成型態,往後只要簡單宣告一下就能使用。尤其多個變數用的是同樣資料結構時,就更需要定義成型態來用,才不會寫一堆重複的程式碼。
程序、函式
不傳回資料的話用 procedure
,要傳回資料的話用 function
。
程式、單元
Pascal 原始碼分 program
與 unit
兩種,前者是主程式,後者是外部程式,有了這層關係上的定義,就能在主程式使用外部程式。
不使用外部程式的話,主程式可以不寫 program。要使用外部程式的話,就必須寫上去,否則無法通過編譯。
unit 可做為程序導向程式設計的模組,也可做為物件導向程式設計的介面。
流程控制
break, continue
使用 break
可以強制離開流程結構,使用 continue
可以跳過迴圈接下來的程式,再重新迴圈一次。
註解
Pascal 那個年代,很多國家的鍵盤配置只有 () 括號,沒有 {} 括號,且作業系統是 DOS 那種操作介面,沒辦法像現在容易找到其他辦法打出想要的符號,因此設計了 (* *) 的註解。
現在這些國家的鍵盤都有 AltGr 鍵,能按出各種字母和符號,已經不是問題。
即使沒有,Windows 作業系統也能靠 Ctrl+Alt 達到相同效果。
如果你覺得程式設計軟體總喜歡設計一堆 Ctrl+Alt+.. 組合鍵,就是這麼來的,反正他們平常都要按 Ctrl+Alt,索性多來幾個組合鍵功能。