跳轉到內容

電腦入門/程式設計

來自華夏公益教科書,開放的書籍,開放的世界

踏入程式設計世界的第一步

[編輯 | 編輯原始碼]

計算機程式設計(通常簡稱程式設計)是使用特定的程式語言將一個或多個相互關聯的抽象演算法轉換為具體的計算機程式的過程。程式設計包含了藝術、科學、數學和工程的元素。程式設計的第一步是理解你試圖透過編寫程式來解決的問題。程式設計通常透過在文字編輯器中編寫人類可讀的程式碼,然後將該程式碼編譯成計算機能夠理解的格式,即二進位制可執行檔案來完成。

程式語言的型別

[編輯 | 編輯原始碼]

根據使用的程式碼或語法,存在多種型別的程式語言。

它們之間的差異在於我們編寫程式碼的方式以及它們允許我們實現的不同型別的解決方案。

例如,組合語言是一種低階語言,使用者在其中編寫的程式碼與計算機理解的程式碼幾乎相同(有關更多資訊,請參見下文)。高階程式語言使用更自然、人類可讀的語法,使人類更容易理解和編寫程式碼。

如今,大多數程式設計師使用某種高階語言,因為它們更容易學習和理解,通常需要更少的工作量。

低階彙編程式碼

組合語言是一個典型的低階程式語言示例。組合語言提供最低級別的程式設計體驗,這意味著程式設計師可以完全控制機器執行的所有操作。雖然這為程式設計師提供了最大的權力,但它非常難學,即使是最基本的任務也可能需要程式設計師付出巨大的努力。彙編程式編譯後通常提供最快的執行速度和最精確的處理器控制。組合語言通常用於更小的、對速度要求嚴格的專案,例如編寫裝置驅動程式,但由於其語法難以理解且複雜,如今它正在被高階語言取代。低階語言和高階語言之間最大的區別在於程式碼如何編譯成二進位制形式。用於編譯彙編程式碼的編譯器稱為彙編器,正如程式設計師所說,編寫的程式碼被彙編成二進位制形式,而不是編譯(有關更多詳細資訊,請參閱編譯器)。此外,還存在許多組合語言,通常特定於處理器平臺。雖然它們極難使用,但它們是一個很好的學習工具,因為彙編程式設計師需要了解機器的工作原理(主要是 CPU 和 RAM)才能編寫程式碼。MASM(微軟的宏彙編器)是 Windows 80x86(奔騰/酷睿)平臺上的一個流行彙編器,其他流行的彙編器包括 TASM(Borland 的 Turbo 彙編器)和開源的 FASM(Flat Assembler)。NASM(Nationwide Assembler)是目前存在的最通用和最受歡迎的編譯器。

Randall Hyde 還為 80x86 平臺編寫了一個流行的彙編器,稱為 HLA(高階彙編),它試圖透過使用高階語法來簡化組合語言的學習。雖然可以使用高階語法,但 Randall Hyde 一再強調程式設計師仍然可以使用一系列 CMP 和 Jcc,而不是例如 .IF。

以下是一個用 MASM 編寫的程式的彙編程式碼片段,它將兩個數字(在暫存器 eax 和 ebx 中)載入進來,將它們相加並將結果(在暫存器 ecx 中)儲存起來。

.model small, C
 .586

 .data

 mov eax,5
 mov ebx,10

 add eax,ebx
 mov ecx,eax

 end

高階語言

由於組合語言程式設計的複雜性極難學習,並且編寫的程式難以維護,低階語言通常無法移植到另一個平臺,因為它們使用平臺,或者更確切地說,是 CPU 特定的指令,因此為 PC 編寫的彙編程式碼無法移植到另一個平臺(例如 Mac)而無需對程式進行完全重寫。程式設計師需要一種易於理解且可移植的語言,因此出現了高階語言。高階語言和低階語言之間的主要區別在於它們的編寫和編譯方式。

雖然彙編程式碼被直接彙編成二進位制形式,而無需進行任何修改,只是將語法轉換為 CPU 指令,但高階語言使用編譯器,它也把程式碼轉換為二進位制形式,但它不使用表示 CPU 指令的語法,而是使用可讀的、人類可理解的程式碼,因此更容易、更快地編寫、學習和維護。缺點是編譯器負責轉換程式碼,並且它通常會生成比彙編程式生成的執行速度更慢的二進位制檔案。

編譯器非常擅長最佳化程式碼,大多數情況下會生成與彙編程式生成的二進位制檔案具有相同執行速度的二進位制檔案,前提是使用正確。它們也很聰明,可以告訴我們程式碼中是否存在問題,有時甚至可以自行修復問題。如今,在速度不如多年前重要的時代,高階語言是大多數程式設計師的選擇。

雖然我們已經瞭解了兩種型別的語言,但在高階語言中也存在低階語言和高階語言。一種程式語言甚至可以同時是高階語言和低階語言。C 或 C++ 是一個典型的例子。它們都提供低階操作(甚至操作計算機已知的最小形式 - 位),但它們也提供自然且易於使用的語法。C# 或 Java 是一個典型的完全高階語言的例子,它們不提供任何低階操作,因此更容易學習和編寫。

程式語言級別之間的差異是速度 - 語言級別越高,二進位制檔案越慢,學習曲線越快。

以下是使用 C 編寫的程式碼(與之前的彙編示例一樣)將兩個數字相加並將結果儲存起來。

int main()
{
  // assign to the variable result the value of 5 + 10
  int result = 5 + 10;

  return 0;
}

數學中的“等於”運算子('=')在 C 中有不同的含義,所以讓我解釋一下這個程式的功能。它取兩個數字 5 和 10,將它們相加並將它們儲存在一個我們稱之為“result”的區域性變數中(該變數儲存在 RAM 中)。

另一種流行的高階程式語言是微軟的 Visual Basic。由於其易用性和易於理解,它經常被用於學習程式設計。所有程式語言都需要一些基本的數學知識(主要是代數)以及計算機工作原理的基礎知識。此外,每種程式語言都有其用途。例如,PHP 用於程式設計動態網頁,而 C# 用於程式設計 Windows 應用程式,Java 用於程式設計平臺無關的應用程式。

程式的工作原理

[編輯 | 編輯原始碼]

理解計算機工作原理的基礎知識非常重要,因為學習任何語言都需要先了解這些知識。計算機使用處理器 (CPU) 來執行指令,使用記憶體 (RAM) 來儲存正在執行的程式,使用硬碟驅動器 (HDD) 來儲存未在此時執行的資料和程式。為了使程式能夠像我們在前一個例子中那樣新增兩個數字,程式必須在編譯時以及程式執行之前知道應該請求多少記憶體以及在其中儲存什麼內容。計算機使用變數來執行此操作。變數是儲存在 RAM 中的資料,可以在程式執行時隨時更改。在我們的示例中,我們沒有使用變數,而是使用了常量 - 無法在執行時更改的普通數字。你會發現,這非常沒用,因為大多數情況下我們不知道我們的程式將要執行什麼操作。

沒有使用者輸入,計算器將毫無用處,如果它只能新增在編譯時已經給出的數字。因此,變數是你學習程式設計時要了解的第一件事。當你執行我們用 C 編寫的程式時,程式知道它包含兩個數字,並要求作業系統為 2 個整數分配記憶體空間。整數是諸如 1、24 和 1497 之類的整數。程式不僅要知道它需要請求多少空間,而且還要知道它將儲存什麼型別的變數。它將是整數還是字串?

無論何時使用需要使用者輸入的程式(例如計算器),它已經在 RAM 中為將要輸入的數字預留了空間。當你輸入數字時,它會將數字儲存在該位置並標記其型別 - 如果你輸入 33,它將標記為整數,如果你輸入 3.14,它將標記為實數。

實數是帶有小數部分的數字。例如,1.33 是一個實數,0.25 也是一個實數等等。程式知道儲存的是什麼型別的變數,就知道可以對它執行什麼操作。因此,如果我們有實數或整數,我們可以對它們進行乘法、除法等操作。但是,我們不能對字串執行這些操作。我們不能除以單詞和字母。

關於程式設計需要了解的另一件重要的事情是,計算機無法思考。沒有人類操作,計算機幾乎毫無用處。計算機只會完全按照你告訴它做的去做,不會做更多的事情。你可能已經注意到,這在現實生活中似乎並不總是如此,但這幾乎從來不是計算機的錯,幾乎總是程式設計師的錯。計算機不理解數字、單詞或任何其他人類可讀型別。它們只理解兩種狀態:真和假。

你可能聽說過計算機使用 1 和 0 來工作,但事實並非如此。它們使用電力,僅此而已。我們發明了 1 和 0 來讓我們更容易理解它們(1 和 0 代表電壓變化)。如果沒有人的程式設計,計算機無法思考或執行任何有用的操作。它們只能比較數字,其他什麼也做不了。瞭解這一點很重要,這樣你就可以開始以計算機程式設計師的方式思考。

華夏公益教科書