FreeBSD Developers' Handbook
Prev | Chapter 2 程式開發工具 | Next

# 2.3 Programming 概念

簡單的說，程式只是一堆指令的集合體；而這些指令是用來告訴電腦應該要作那些事情。 有時候，指令的執行取決於前一個指令的結果而定。 本章將會告訴你有 2 個主要的方法，讓你可以對電腦下達這些指示(instruction) 或 “命令(commands)”。 第一個方法就是 直譯器(interpreter)， 而第二個方法是 編譯器(compiler)。 由於對於電腦而言，人類語言的語意過於模糊而太難理解， 因此命令(commands)就常會以一種(或多種)程式語言寫成，用來指示電腦所要執行的特定動作為何。

## 2.3.1 直譯器

使用直譯器時，所使用的程式語言就像變成一個會和你互動的環境。 當在命令提示列上打上命令時，直譯器會即時執行該命令。 在比較複雜的程式中，可以把所有想下達的命令統統輸入到某檔案裡面去， 然後呼叫直譯器去讀取該檔案，並且執行你寫在這個檔案中的指令。 如果所下的指令有錯誤產生，大多數的直譯器會進入偵錯模式(debugger)， 並且顯示相關錯誤訊息，以便對程式除錯。

這種方式好處在於：可以立刻看到指令的執行結果，以及錯誤也可迅速修正。 相對的，最大的壞處便是當你想把你寫的程式分享給其他人時，這些人必須要有跟你一樣的直譯器。 而且別忘了，他們也要會使用直譯器直譯程式才行。 當然使用者也不希望不小心按錯鍵，就進入偵錯模式而不知所措。 就執行效率而言，直譯器會使用到很多的記憶體， 而且這類直譯式程式，通常並不會比編譯器所編譯的程式的更有效率。

筆者個人認為，如果你之前沒有學過任何程式語言，最好先學學習直譯式語言(interpreted languages)， 像是 Lisp，Smalltalk，Perl 和 Basic 都是，UNIX® 的 shell 像是 `sh` 和 `csh` 它們本身就是直譯器，事實上，很多人都在它們自己機器上撰寫各式的 shell “script”， 來順利完成各項 “housekeeping(維護)” 任務。 UNIX 的使用哲學之一就是提供大量的小工具， 並使用 shell script 來組合運用這些小工具，以便工作更有效率。

## 2.3.2 FreeBSD 提供的直譯器

下面這邊有份 FreeBSD Ports Collection 所提供的直譯器清單，還有討論一些比較受歡迎的直譯式語言

至於如何使用 Ports Collection 安裝的說明，可參閱 FreeBSD Handbook 中的 Ports章節。

BASIC

  BASIC 是 Beginner's ALL-purpose Symbolic Instruction Code 的縮寫。 BASIC 於 1950 年代開始發展，最初開發這套語言的目的是為了教導當時的大學學生如何寫程式。 到了 1980，BASIC已經是很多 programmer 第一個學習的程式語言了。 此外，BASIC 也是 Visual Basic 的基礎。

  FreeBSD Ports Collection 也有收錄相關的 BASIC 直譯器。 Bywater Basic 直譯器放在 `lang/bwbasic`。 而 Phil Cockroft's Basic 直譯器(早期也叫 Rabbit Basic)放在 `lang/pbasic`。

Lisp

  LISP 是在 1950 年代開始發展的一個直譯式語言，而且 LISP 就是一種 “number-crunching” languages(迅速進行大量運算的程式語言)，在當時算是一個普遍的程式語言。 LISP 的表達不是基於數字(numbers)，而是基於表(lists)。 而最能表示出 LISP 特色的地方就在於： LISP 是 “List Processing” 的縮寫。 在人工智慧(Artificial Intelligence, AI)領域上 LISP 的各式應用非常普遍。

  LISP 是非常強悍且複雜的程式語言，但是缺點是程式碼會非常大而且難以操作。

  絕大部分的 LISP 直譯器都可以在 UNIX 系統上運作，當然 FreeBSD 的 Ports Collection 也有收錄。 GNU Common Lisp 收錄在 `lang/gcl`， Bruno Haible 和 Michael Stoll 的 CLISP 收錄在 `lang/clisp` ，此外 CMUCL(包含一個已經最佳化的編譯器)， 以及其他簡化版的 LISP 直譯器(比如以 C 語言寫的 SLisp，只用幾百行程式碼就實作大多數 Common Lisp 的功能) 則是分別收錄在 `lang/cmucl` 以及 `lang/slisp`。

Perl

  對系統管理者而言，最愛用 perl 來撰寫 scripts 以管理主機， 同時也經常用來寫 WWW 主機上的 CGI Script 程式。

  Perl 在 Ports Collection 內的 `lang/perl5`。 而 FreeBSD 4.X 則是把 Perl 裝在 `/usr/bin/perl`。

Scheme

  Scheme 是 LISP 的另一分支，Scheme 的特點就是比 Common LISP 還要簡潔有力。 由於 Scheme 簡單，所以很多大學拿來當作第一堂程式語言教學教材。 而且對於研究人員來說也可以快速的開發他們所需要的程式。

  Scheme 收錄在 `lang/elk`， Elk Scheme 直譯器(由麻省理工學院所發展的 Scheme 直譯器)收錄在 `lang/mit-scheme`， SCM Scheme Interpreter 收錄在 `lang/scm`。

Icon

  Icon 屬高階程式語言，Icon 具有強大的字串(String)和結構(Structure)處理能力。 FreeBSD Ports Collection 所收錄的 Icon 直譯器版本則是放在 `lang/icon`。

Logo

  Logo 是種容易學習的程式語言，最常在一些教學課程中被拿來當作開頭範例。 如果要給小朋友開始上程式語言課的話，Logo 是相當不錯的選擇。 因為，即使對小朋友來說，要用 Logo 來秀出複雜多邊形圖形是相當輕鬆容易的。

  Logo 在 FreeBSD Ports Collection 的最新版則是放在 `lang/logo`。

Python

  Python 是物件導向的直譯式語言， Python 的擁護者總是宣稱 Python 是最好入門的程式語言。 雖然 Python 可以很簡單的開始，但是不代表它就會輸給其他直譯式語言(像是 Perl 和 Tcl)， 事實證明 Python 也可以拿來開發大型、複雜的應用程式。

  FreeBSD Ports Collection 收錄在 `lang/python`。

Ruby

  Ruby 是純物件導向的直譯式語言。 Ruby 目前非常流行，原因在於他易懂的程式語法結構，在撰寫程式時的彈性， 以及天生具有輕易的發展維護大型專案的能力。

  FreeBSD Ports Collection 收錄在 `lang/ruby8`。

Tcl and Tk

  Tcl 是內嵌式的直譯式語言，讓 Tcl 可以如此廣泛運用的原因是 Tcl 的移植性。 Tcl 也可以快速發展一個簡單但是具有雛型的程式或者具有完整功能的程式。

  Tcl 許多的版本都可在 FreeBSD 上運作，而最新的 Tcl 版本為 Tcl 8.4， FreeBSD Ports Collection 收錄在 `lang/tcl84`。

## 2.3.3 編譯器

編譯器和直譯器兩者相比的話，有些不同，首先就是必須先把程式碼統統寫入到檔案裡面， 然後必須執行編譯器來試著編譯程式，如果編譯器不接受所寫的程式，那就必須一直修改程式， 直到編譯器接受且把你的程式編譯成執行檔。 此外，也可以在提示命令列，或在除錯器中執行你編譯好的程式看看它是否可以運作。 [1]

很明顯的，使用編譯器並不像直譯器般可以馬上得到結果。 不管如何，編譯器允許你作很多直譯器不可能或者是很難達到的事情。 例如：撰寫和作業系統密切互動的程式，甚至是你自己寫的作業系統！ 當你想要寫出高效率的程式時，編譯器便派上用場了。 編譯器可以在編譯時順便最佳化你的程式，但是直譯器卻不行。 而編譯器與直譯器最大的差別在於：當你想把你寫好的程式拿到另外一台機器上跑時， 你只要將編譯器編譯出來的可執行檔，拿到新機器上便可以執行， 而直譯器則必須要求新機器上，必須要有跟另一台機器上相同的直譯器， 才能組譯執行你的程式！

編譯式的程式語言包含 Pascal、C 和 C++， C 和 C++ 不是一個親和力十足的語言，但是很適合具有經驗的 Programmer。 Pascal 其實是一個設計用來教學用的程式語言，而且也很適合用來入門， FreeBSD 預設並沒有把 Pascal 整合進 base system 中， 但是 GNU Pascal Compiler 和 Free Pascal Compiler 都可分別在 `lang/gpc` 和 `lang/fpc` 中找到。

如果你用不同的程式來寫編譯式程式，那麼不斷地編輯-編譯-執行-除錯的這個循環肯定會很煩人， 為了更簡化、方便程式開發流程，很多商業編譯器廠商開始發展所謂的 IDE (Integrated Development Environments) 開發環境， FreeBSD 預設並沒有把 IDE 整合進 base system 中， 但是你可透過 `devel/kdevelop` 安裝 kdevelop 或使用 Emacs 來體驗 IDE 開發環境。 在後面的 Section 2.7 專題將介紹，如何以 Emacs 來作為 IDE 開發環境。

### Notes

[1] | 如果在提示命令列下執行，那麼有可能會產生 core dump。

Prev | Home | Next
簡介 | Up | 用 `cc` 來編譯程式

本文及其他文件，可由此下載：ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/。

若有 FreeBSD 方面疑問，請先閱讀 FreeBSD 相關文件，如不能解決的話，再洽詢 <questions@FreeBSD.org>。
關於本文件的問題，請洽詢 <doc@FreeBSD.org>。