A-level 計算機科學/WJEC (Eduqas)/第一部分/程式設計原理
正規化是程式語言的基本方法。
過程式語言執行操作和計算,這些操作和計算用於以邏輯的逐步過程解決問題。C 和 Python 是使用這種方法的語言示例。它們遵循有序指令,並且每個步驟都明確定義。它們允許嚴格控制所用硬體的底層操作。它們通常用於大型複雜程式中,其中過程和函式在執行的不同階段執行。這種正規化是更廣泛的指令式程式設計正規化的一部分,這意味著語句可以分組到更小的過程和函式中。
非過程式語言允許程式設計師指定他們想要的結果,而不是指定如何解決問題。它們與發出查詢有關,例如在資料庫查詢中,檢索資料比檢索資料的準確過程更重要。它們還用於人工智慧、語法檢查和語言翻譯應用程式。

視覺化正規化不用輸入程式碼,而是用於生成物件、按鈕和圖示。視覺化正規化適合在 GUI 或事件驅動語言中進行開發。Scratch 和 GameMaker 是使用這種方法的程式示例。例如,Scratch 使用拖放應用程式,其中命令從一組命令中拖入,從而生成程式碼。視覺化正規化更好,因為它更直觀,更容易為初學者學習,因為提供了很多幫助和工具。
事件驅動正規化基於 GUI,並使用程式執行時發生的任何事件。VB.NET Windows 窗體使用這種方法。程式在一個常量迴圈中等待使用者的任何輸入。當觸發互動時,例如使用者單擊按鈕,就會呼叫一個監聽器。監聽器然後處理事件並在程式中執行相關程式碼。
面向物件程式設計 (OOP) 使用物件和類。它能夠生成按鈕和圖示,這在視覺環境中非常有用。物件是屬性(資料)和方法的組合。它們有很多優點:一旦建立,就無需瞭解它們的實現細節即可使用它們。物件控制其他物件如何與它們互動,防止錯誤,例如程式設計師無法將視窗寬度設定為 -500。在某些語言(如事件驅動語言)中,這些物件被放置在表單上(事件驅動語言)。一旦建立,它們可以在各種其他程式中重複使用。類是一個模板,指定方法(程式例程)和屬性(資訊)。
OOP 使用三個關鍵原則:封裝、繼承和多型性。
- 封裝是指技術實現隱藏在物件內部。這意味著資料保留在類內部,並且無法訪問程式的其餘部分。封裝的另一個優點是,一旦建立了一個物件,就不需要了解它的實現細節就可以使用它。以這種方式建立的物件可以輕鬆地重複用於其他程式,並且可以由不同的程式設計師使用。
- 繼承是指屬性和方法被複制到另一個類。它發生在類按相似的屬性和方法進行分組時。可以在父類中賦予跨類共有的屬性和方法,其他類成為此父類的子類。這樣做的影響是子類繼承了父類的屬性和方法,可以像使用自己的屬性和方法一樣使用它們。這是一種優勢,因為它意味著只有在定義一次方法後,所有其他使用它的類都可以檢視它們的父類,而不是重新定義它。繼承與建立新物件(例項化)有關。
- 多型性是指建立一個可以與各種資料型別一起使用的通用物件。它只是說,方法可以根據執行它的類或提供給它處理的資料的不同而不同地工作。例如,一個 Area 方法將為“圓形”和“正方形”類計算不同的面積,但兩者都將從它們的父類“形狀”繼承該方法。
標記語言向文字文件新增命令以賦予文字一些意義。這些命令提供有關如何格式化和顯示文字的指令。例如,HTML 中的命令稱為標籤,並用尖括號括起來,例如
<h1> This represents text in a heading in HTML. </h1>
命令是開啟的,因此任何後續文字將應用於文字的格式,例如標題。它們隨後由帶有正斜槓的標籤關閉。

另一個例子是 XML(可擴充套件標記語言),有時用於對資料進行結構化以儲存,而不是顯示它。XML 沒有固定的約定,開發者可以自由地為每塊資料新增自己的含義,例如參見右側的圖片。這些標記語言通常與其他語言一起使用,例如 JavaScript 與 HTML。
指令碼語言嵌入到其他語言中,可以為網頁新增額外的功能(例如 JavaScript)。
專用語言是指為特定目的而設計的語言。它們可能包含與應用程式相關的基本/有用的功能。專用語言在模擬和控制等領域都有應用。它們非常獨特,內建的功能/能力直接適用於解決語言設計用於解決的問題。它們通常用於計算機輔助設計 (CAD)、人工智慧 (AI)、專家系統、科學應用和遊戲程式設計等應用程式。
高階程式語言更容易理解、學習和程式設計,因為程式碼更類似於英語(與低階程式設計相比)。它使用識別符號,這些識別符號可以是自文件化的,以及可以在整個程式中重複使用的模組。高階語言轉換為許多行可執行機器程式碼(0 和 1)。
在低階程式語言中,開發者可以直接訪問和操作記憶體暫存器和 CPU,以及直接與連線到計算機的硬體裝置通訊。不同的 CPU 架構執行不同的指令集,開發者可以透過低階程式設計訪問這些指令。可以使用諸如組合語言之類的語言,它使用助記符來執行機器程式碼。要將組合語言轉換回高階程式碼,必須使用匯編器。
低階程式語言用於速度至關重要的場合,例如 ROM 上的載入程式和嵌入式系統。由於它們的體積更小,它們比高階語言效率更高。由於它們更小,它們需要更少的時間來轉換為機器程式碼。諸如組合語言之類的語言用於命令具有一對一對映的場合(一行彙編程式碼 = 一行機器程式碼)。
USB(通用序列匯流排)連線介質是標準的一個例子。標準用於確保各種產品能夠相互整合,例如透過 USB 連線的外部 HDD 在作業系統上讀取/寫入檔案,而作業系統利用了所有計算機上的 USB 標準。將組建各種人員參與的團隊以開發標準。
標準很有用,因為用一種語言編寫的程式更有可能在完全不同的計算機架構上執行,並且熟悉使用一種程式語言的程式設計師可以輕鬆地切換到使用另一種語言,即使是在不同的架構上。由於不同的製造商可能出於商業原因(例如市場份額)不願意標準化,因此很難實現標準化。
歧義是指含義不確定,可能存在不同的解釋。高階程式語言必須是無歧義的,因此每個語句只有一個解釋方式,例如兩個 Else 語句是歧義的。這是為了允許準確地轉換為可執行的機器程式碼。巴克斯-諾爾正規化 (BNF) 使用無歧義規則。
巴克斯-諾爾正規化 (BNF) 是一種正式的程式語言語法編寫方式。其主要思想是引入規則,以確保原始碼在語法上正確(每個部分的排列正確)且無歧義。BNF 比英語更可取,因為英語是歧義的,而 BNF 則不是。為了將這些概念引入程式碼,我們使用類似於普通英語的語法規則,這些規則包含在尖括號(<>)中。這些“語法規則”中可以包含兩種部分:終結符和非終結符。終結符不能再進行評估(這意味著它不能再分解),而非終結符需要進一步評估(它必須分解才能進行解釋)。要建立規則,我們首先必須熟悉規則中使用的符號及其含義。以下是一個例子
<Digit> ::= 0|1|2|3|4|5|6|7|8|9
<Digit> 用於啟動規則並將其命名為“Digit”,請注意使用的尖括號。“::=” 用於表示賦值。“|” 用於表示邏輯運算子 OR(這是一個管道字元)。此規則可用於構建所需的任何數字,因為所有數字都必須包含 0-9。從 0 開始非常重要,否則無法包含諸如 100 或 900 之類的較大數字。此示例中的數字(0-9)將被視為終結符,因為您不能再對其進行評估。
<TwoDigitNumber> ::= <Digit><Digit>
這裡,我們聲明瞭“TwoDigitNumber”規則,該規則包含兩個“Digit”規則。如您所見,我們需要查詢“Digit”規則以瞭解此規則的含義 - 我們需要進一步評估它 - 所以這是一個非終結符。您可能想知道我們如何用 BNF 構建單詞或字母,這是很正確的!假設我們正在使用 BNF 建立電子郵件以表示所有內容。我們需要以下規則來做到這一點
<Uppercase> ::= A|B|C|D|E ... |Z
(請注意,這裡我們使用 ... 來表示延續,您也可以在考試中這樣做!)
<Lowercase> ::= a|b|c|d|e ... |z
這允許使用字母表中的任何字母,但必須是小寫字母。
<Digit> ::= 0|1|2|3|4|5|6|7|8|9
(通常在所有 BNF 問題中都需要,例如,某些電子郵件可能包含 EmployeeID)。到目前為止,這些是我們建立電子郵件所需的所有規則,但我們使用的當前規則存在問題。人們只能擁有由單個字母和數字組成的電子郵件。當我們想要在電子郵件中使用全名時,這顯然是有問題的。我們可以使用前面介紹的概念遞迴來解決這個問題
<Name> ::= <Lowercase>|<Lowercase><Name>
在<Name>規則中,有兩個可能的路徑,第一條路徑和第二條路徑。在第一條路徑中,它接受一個單個小寫字元,如果只有一個字母,則會呼叫它。否則,將呼叫第二條路徑,它將接受一個單個字元,但也會再次呼叫該規則 - 因此您可以根據需要使用任意多個小寫字元來建立全名。這種思維方式非常有用,因為它可以讓您正確地記住遞迴規則,因為該規則必須採用這種確切的格式,否則就不正確(這是評分標準中的格式)。必須有兩條路徑,要麼是單個字元,要麼是單個字元和再次呼叫的規則。
最後,在解決了所有可能的資料約束之後,我們建立了一個包含所有邏輯的最終規則。以下是在此示例中使用的示例問題
|
電子郵件考試問題 國家銀行員工的電子郵件地址由名字、一個句點、姓氏、一個數字、@ 符號和“nb.co.uk”組成。所有名字僅包含小寫字母,並且可以是任意長度。 答案 <Lowercase> ::= a|b|c|d|e ... |z <Digit> ::= 0|1|2|3|4|5|6|7|8|9 <Name> ::= <Lowercase>|<Lowercase><Name> <Email> ::= <Name>.<Name><Digit>@nb.co.uk
|
我們也可以用圖表的形式來表示 BNF,但這只是為了讓人們更容易地看到它所代表的內容,而不是有更大的目的。為此,使用三種形狀:一個帶有左右兩條線的矩形,表示非終結符,一個橢圓形表示終結符,一個箭頭表示資訊流(所走的路徑)。這兩種符號內部都包含文字,以顯示它們所代表的內容。一個橢圓形(終結符)可能包含“1”,而一個矩形(非終結符)可能包含“Digit”。遞迴是透過在決定透過非終結符之前畫一條帶有箭頭的線來表示的,因此這表明你可以一直回到整個字串被構建出來為止。