2019-2020-1學期 20192419 《網絡空間安全專業導論》第三週學習總結 (讀書筆記)

第六章 低級程序設計語言與僞代碼

6.1 計算機操做

計算機是可以存儲、檢索和處理數據的可編程電子設備。存儲、檢索和處理是計算機可以對數據執行的動做。程序員

6.2 機器語言

計算機真正執行的程序設計指令是用機器語言編寫的指令。算法

  • 機器語言:由計算機直接使用的二進制編碼指令構成的語言。編程

    Pep/8:一臺虛擬機

    -虛擬機:爲了模擬真實機器的重要特徵而設計的假想機器。數組

    Pep/8反應的重要特性

    Pep/8的內存單元由65536字節的存儲空間構成。Pep/8的字長是2字節,或者16比特。
    Pep/8有七個寄存器,重點研究其中三個:ide

  • 程序計數器(PC),其中包含下一條即將被執行的指令的地址。
  • 指令寄存器(IR),其中包含正在被執行的指令的一個副本。
  • 累加器(是一個寄存器)。oop

指令格式

一條指令由兩個部分組成,即8位的指令說明符和(可選的)16位的操做數說明符。指令說明符(指令的第一個字節)說明了要執行什麼操做和如何解釋操做數的位置。操做數說明符(指令的第二個和第三個字節)存放的是操做數自己或者操做數的地址。有些指令沒有操做數說明符。
操做代碼(稱爲操做碼)的長度從4比特到8比特不等。4比特操做碼的第5位用來指定使用哪一個寄存器。
尋址模式說明符表示了怎樣解析指令中的操做數部分。若是尋址模式是000,那麼指令的操做數說明符中存儲的是操做數所在的內存地址名稱。這種尋址模式稱爲直接尋址。
沒有操做數的指令稱爲一元指令,這些指令沒有操做數說明符。也就是說,一元指令的長度是1字節,而不是3字節。測試

一些示例指令


例子:
      指令說明符:1100000編碼

尋址模式是當即尋址,即要被載入寄存器A中的值在操做數說明符中。翻譯

      指令說明符:11000001
尋址模式是直接尋址,意味着操做數自己並不在操做數說明符中,而是操做數說明符存儲了操做數駐留在內存中的地址。
在存儲操做碼中使用當即尋址模式是非法的,也就是說,咱們不能嘗試將寄存器的內容存儲到操做數說明符中。
01001把字符輸入操做數:這一指令只能使用直接尋址,因此輸入的字符被存儲在操做數說明符中顯示的地址中。設計

6.3 一個程序實例

在屏幕上顯示"Hello":
在屏幕上顯示字符的指令是0101,即「從操做符輸出字符」的操做。

6.3.1 手工模擬

讀取-執行週期的四個步驟:

  1. 從程序計數器指定的位置)讀取下一條指令
  2. 譯解指令(而且更新程序計數器)
  3. 若是須要,獲取數據(操做數)
  4. 執行指令

注意,一旦指令已被訪問,程序計數器就會遞增。

6.3.2 Pep/8模擬程序

雖然Pep/8是一臺(假想的)虛擬機,可是它有對應的模擬程序。要運行一個程序,須要逐字節地輸入十六進制的代碼,每一個字節之間用空格隔開,以zz結束程序。

  • 裝入程序:軟件用於讀取機器語言並把它載入內存的部分

    6.4 彙編語言

  • 彙編語言:一種低級語言,用助記碼錶示特定計算機的機器語言指令。
  • 彙編器:把彙編語言程序翻譯成機器代碼的程序。

彙編語言給每條機器語言指令分配了一個助記指令碼,程序員能夠用這些指令碼代替二進制數字。

6.4.1 Pep/8彙編語言

6.4.2 彙編器指令

大多數程序設計語言都有兩種類型的指令,即要翻譯的指令和翻譯程序使用的指令。

  • 彙編器指令:翻譯程序使用的指令,也叫僞操做。

6.4.3 Hello程序的彙編語言版本

編譯器會忽略從分號開始到一行結束的全部字符,這就是一個註釋。

  • 註釋:爲程序讀者提供的解釋性文字。

彙編器的輸入是一個用匯編語言編寫的程序,輸出是用機器代碼編寫的程序。

6.4.6 具備循環的程序

如何知道已經讀取了多少個值呢?能夠在每次重複循環時創建一個散列標記,這個散列標記就是內存中一個爲0的存儲單元,咱們稱之爲計數器。每次循環重複時,咱們在內存中該存儲單元中加1,即計數器加1.當計數器等於咱們想輸入的數量,就完成讀取和計數。

6.5 表達算法

  • 算法:解決方案的計劃或概要,或解決問題的邏輯步驟順序。
  • 僞代碼:一種表達算法的語言。

    6.5.1 僞代碼的功能

    變量

    出如今僞代碼算法中的名字,引用的是內存中的存儲值的位置。這些名字要能反映出它存放的值在算法中的角色。

    賦值

    Set sum to 0
    這個語句把一個值存放到變量sum中。另外一種表示同一律唸的方法是使用反向箭頭(←):sum<——1
    存放在sum中的值加上存放在mum的值,結果存放在sum中。

    輸入/輸出

    咱們可使用Write語句進行輸出,使用Read語句進行輸入。雙引號之間的字符叫做字符串,告訴用戶要輸入什麼或者要輸出什麼。

    選擇

    用選擇結構能夠選擇執行或跳過某項操做。此外,用選擇結構還能夠在兩項操做之間進行選擇。選擇結構使用括號中的條件決定執行哪項操做。符號「//」用於加註釋,它並非算法的一部分。

    重複

    使用重複結構能夠重複執行指令。和選擇結構同樣,在WHILE旁邊的圓括號中的表達式是一個判斷,若是判斷成立,縮進中的語句將被執行,若是不成立,就會跳過縮進中的語句,直接執行下一個非縮進語句。
    WHILE和IF旁邊的括號裏的表達式是布爾表達式,在IF中,若是表達式爲真,則執行接下來的縮進代碼塊,若表達式爲假,則跳過縮進代碼塊。在WHILE中,若是表達式爲真,則執行縮進代碼塊。若是表達式爲假則跳到下一個執行語句。

  • 布爾表達式:評價爲真爲假的表達式。

6.5.3 寫僞代碼算法

  • 推遲細節:首先給任務一個名稱,而後再補充細節來完成這個任務。
  • 分佈解決:首先編寫算法代碼,而後補充細節完成這個任務的策略。
  • 桌面檢查:在紙上走查整個設計。

6.6 測試

  • 測試計劃:說明如何測試程序的文檔。
  • 代碼覆蓋(明箱)測試法:經過執行代碼中的全部語句測試程序或子程序的測試方法,會確保程序中的每條語句都能被執行到。
  • 測試計劃實現:用測試計劃中規定的測試用例驗證程序是否輸出了預期結果。

    第七章 問題求解與算法設計

    7.1.1 提出問題

    如何解決它:
    第一步必須理解問題
    第二步找到信息和解決方案之間的聯繫。若是找不到直接的聯繫,則可能須要考慮輔助問題。最終,應該獲得解決方案
    第三步執行方案
    第四步分析獲得的解決方案

    7.1.3 分治法

    一般,咱們會把一個大問題劃分爲幾個能解決的小單元。這項原則尤爲適用於計算領域:把大的問題分割成可以單獨解決的小問題。

    7.1.4 算法

  • 算法:在有限的時間內用有限的數據解決問題或子問題的明確指令合集。

    7.1.5 計算機問題求解過程

    計算機問題求解過程包括四個階段,即分析和說明階段、算法開發階段、實現階段和維護階段。

    7.1.6 方法總結

  1. 分析問題
          首先要理解問題,列出必須處理的信息。明確採用什麼樣的解決方式。思考如何手動地解決這個問題。
  2. 列出主要任務
          用天然語言或僞代碼在主模塊中重述問題。用任務名把問題分解成功能區塊。
          在主模塊中所要作的只是給下一層中每一個解決任務的模塊一個名字,要採用含義明確的標識符。
  3. 編寫其他的模塊
          每一層中的模塊能夠指定多個下層模塊。上層模塊必須完整。不斷細化每一個模塊,直到模塊中的每條語句都是具體的步驟爲止。
  4. 根據須要進行重組和改寫
          要維持透明性,簡單直接地表達你的想法。自頂向下設計,將任務分層從而解決。

    7.1.7 測試算法

    數學問題求解的目標是生成問題的特定答案,所以,檢查結果等價於測試推出答案的過程。

    7.2 有簡單參數的算法

    簡單(原子)變量是那些不能被分開的變量,例如,數字就是簡單變量。

    7.2.1 帶有選擇的算法

    咱們定義熱天爲90以上,好天氣70以上,有點寒冰爲50以上,寒冷爲32以上。
          IF(temperature>90)
          Write"Texas weather:wear shots"
    ELSE IF(temperature>70)
          Write"Ideal weather:short sleeves are fine"
    ELSE IF(temperature>32)
          Write"Philadelphia weather:wear a heavy coat"
    ELSE
          Write"Stay insides"
    到達第二個if語句的惟一方式是第一個if表達式是不真實的。

    7.2.2 帶有循環的算法

    有兩種基本的循環,分別爲計數控制和事件控制。

    計數控制循環

    計數控制循環能夠指定過程重複的次數,這個循環的機制是簡單記錄過程重複的次數且在重複再次開始前檢測循環是否已經結束。
    這類循環有三個不一樣的部分,使用一個特殊的變量叫做循環控制變量。第一部分是初始化:循環控制變量初始化爲某個初始值。第二部分是測試:循環控制變量是否已經達到特定值?第三部分是增量:循環控制變量以1遞增。
    while循環被稱爲前測試循環,由於在循環開始前就開始測試了。
    永遠不會終止的循環稱爲一個無限循環。
    計數循環如:
    Write"How many pairs of values are to be entered?"
    Read numberRead to 0
    WHILE(numberRead<numberOfPairs)
          //Body of loop
          ...
          Set numberRead to numberRead+1
    Pep/8使用分號來表示以後的部分是註釋,在僞代碼中,使用兩個斜槓來開始註釋。

    事件控制循環

    循環中重複的次數是由循環體自身內發生的事件控制的循環被稱爲事件控制循環。這一過程仍分爲三個部分:事件必須初始化,事件必須被測試,事件必須更新。
    事件控制循環如:
    Write"Enter the new base"
    Read newBase
    Write"Enter the number to be converted"
    Read decimaiNumber
    Set answer to 0
    Set quotient to 1
    WHILE(quotient is not zero)
          Set quotient to decimalNumber DIV newBase
          //Rest of loop body
    Write"The answer is",answer
    計數控制循環是很是直接簡單的,它指定了循環的次數,而在事件控制循環中則不太清楚,並不顯而易見。
    在控制結構中執行或跳過的語句中能夠是簡單的語句或者是複雜的語句,所以跳過或重複的語句中能夠包含一個控制結構。選擇語句能夠嵌套在循環結構中,循環結構能夠嵌套在選擇語句中。控制結構嵌入另外一個控制結構被稱爲嵌套結構。(又稱嵌套邏輯)

    平方根

    給出一個想要計算平方根的數,猜想答案,若是猜想的平方和原始值的差距在±0.001之間,則咱們把這個差距叫做epsilon差別。如何測量差距的正負?運用絕對值計算,這個表達式爲abs(epsilon),即絕對值。

  • 抽象步驟:細節仍未明確的算法步驟。
  • 具體步驟:細節徹底明確的算法步驟。

    7.3 複雜變量

  • 字符串:引用的字母。

    7.3.1 數組

    數組是同構項目的有名集合,能夠經過單個項目在集合中的位置訪問它們。項目在集合中的位置叫做索引
    與數組有關的算法分爲三類:搜索、排序和處理。搜索就像它的字面意思同樣,搜索數組中的項,一次尋找一個特定的值。排序是按順序將元素放入數組中。處理是一種捕捉短語,包含了對數組中的項所作的全部其餘計算。

    7.3.2 記錄

    記錄是異構項目的有名集合,能夠經過名字單獨訪問其中的項目。所謂異構,就是指集合中的元素能夠沒必要相同。集合能夠包含整數、實數、字符串或其餘類型的數據。記錄能夠把與一個對象相關的各類項目綁定在一塊兒。

    7.4 搜索算法

    7.4.1 順序搜索

    第一個搜索算法遵循了搜索定義。咱們依次查找每個元素並將其與咱們須要搜索的元素進行比較。發現了元素或者是查找全部的元素後都沒有找到匹配項就中止。
    AND是一種布爾操做符,布爾操做符包括特殊操做符AND、OR和NOT。AND操做符只有在表達式都爲真時返回值纔是TRUE,不然返回FALSE。OR操做符只有在表達式都爲假時返回FALSE,其他返回TRUE。NOT操做符改變表達式的值。

    7.4.2 有序數組中的順序搜索

    咱們在算法中是用變量index而不是position。程序員在處理數組時常用數學標識符index而不是直觀的標識符position或place。

    7.4.3 二分檢索

    數組的順序搜索在數組開頭開始,直到找到匹配項或者整個數組中都沒有匹配項。
    二分檢索查找數組中的項目的方法則徹底不一樣,它採用的是分治法。
    二分檢索算法假設要檢索的數組是有序的,其中每次比較操做能夠找到的項目或把數組減小一半。二分檢索不是從數組開頭開始順序前移,而是從數組中間開始。而後再檢測數組的「中間」項(即整個數組1/4處的項目)。
    爲何咱們不老是用二分檢索呢?由於爲了計算中間項的索引,每一個比較操做都須要更多的計算。此外,數組必須是有序的。若是數組是有序的已經排好,且其中的項目不超過20個,那麼使用二分檢索算法比較好。

    7.5 排序

    所謂排序,就是按順序排放東西。在計算領域,把無序數組轉化成有序數組是很常見的有用操做。

    7.5.1 選擇排序

    選擇排序算法也許是最簡單的,但卻有缺陷,它須要兩個完整列表(數組)的空間。即便不考慮內存空間,複製操做顯然也很費空間。不過對這種手動方法稍做修改,就能夠免除所需的複製空間。當把最小項移動到新的數組中時,就空出一個位置,所以沒必要把最小值寫入第二個列表,而是把它與它應該所在的位置處的當前值交換便可。
    這個算法只有三個抽象步驟,即肯定數組是否已經排好序、找到最小元素的索引和互換二者位置。

    7.5.2 冒泡排序

    冒泡排序也是一種選擇排序法,只是在查找最小值時採用了不一樣方法。它從數組的最後一個元素開始,比較相鄰的元素對,若是下面的元素小於上面的元素,就交換這兩個元素的位置。
    冒泡排序是很是慢的排序算法。比較排序算法的方法一般是看它們對數組排序的迭代次數,而冒泡排序要對數組中除最後一個元素以外的全部元素進行一次迭代。

    7.5.3 插入排序

    如今,這兩個元素是有序的,根據這兩個元素把第三個元素放在合適的位置。如今,相對於彼此前三個元素就是有序的。將元素加入有序部分相似於冒泡排序中的冒泡的過程。
    選擇排序的每次迭代後,一個元素被放置到它的永久位置。而插入排序的每次迭代後,一個元素將被放在相對於其餘元素來講適當的位置上。

    7.6 遞歸算法

    遞歸就是算法調用它自己的能力,是另外一種重複(循環)的循環結構。這種算法使用一個選擇語句來肯定是否重複算法來調用一遍或中止這一過程,而不是使用一個循環語句執行一個算法。
    每一個遞歸算法至少有兩種狀況:基本狀況和通常狀況。 基本狀況是答案已知的狀況;通常狀況則是調用自身來解決問題的更小版本的解決方案。由於通常狀況下解決的是原始問題愈來愈小的版本,因此程序最終達到基本狀況,即答案是已知的,因此遞歸中止。遞歸解決方案的第一步都是肯定尺寸係數。尺寸係數可能就是數值自己。

    7.6.1 子程序語句

    咱們能夠給一段代碼一個名稱,而後程序另外一部分的一個語句使用這個名稱。遇到這個名稱時,這個進程的其餘部分將會終止,等待這個命名代碼被執行。當命名代碼執行完畢將會繼續處理下面的語句。命名代碼出現的地方被稱爲調用單元。
    子程序有兩種形式,一種只執行特定任務的命名代碼,一種是不只執行任務,還返回給調用單元一個值。第一種形式的子程序在調用單元中用做語句,第二種則用表達式,返回的值被用來評估表達式。

    7.6.2 遞歸階乘

    數的階乘的定義是這個數於0和它自身之間的全部數的乘積,即 N!=N*(N-1)!

    7.6.3 遞歸二分檢索

    遞歸算法必須從非遞歸算法中調用。

    7.6.4 快速排序

    快速排序算法的基本思想是對兩個小列表排序比對一個大列表排序更快更容易。其基本策略是「分治法」。這種策略的基礎是遞歸。

    7.7 幾個重要思想

    7.7.1 信息隱蔽

    對於設計的每一個特定分層,設計者只考慮與之相關的細節。這種作法叫做信息隱蔽,即在進行高層設計時不能見到低層的細節。

    7.7.2 抽象

    抽象和信息隱蔽就像一個硬幣的兩面。信息隱蔽是隱藏細節的作法,抽象則是隱藏細節後的結果。

  • 抽象:複雜系統的一種模型,只包括對觀察者來講必需的細節。
  • 數據抽象:把數據的邏輯視圖和它的實現分離開。
  • 過程抽象:把動做的邏輯視圖和它的實現分離開。
  • 控制抽象:把控制結構的邏輯視圖和它的實現分離開。
  • 控制結構:用於改變正常的順序控制流的語句,

    7.7.3 測試

    測試在編程的每一個階段都十分重要,有兩種基本的測試分類:白盒測試,基於代碼自己;黑盒測試,基於測試全部可能的輸入值。

相關文章
相關標籤/搜索