1. 程式人生 > >彙編器優化,指令名連結串列排序與二分查詢

彙編器優化,指令名連結串列排序與二分查詢

在彙編器的詞法分析階段,需要對獲取的指令名進行有效性驗證並儲存對應的指令型別。然而,當前實現方法在效率和管理性方面還有不足,顧需進行優化,主要工作如下圖。


  前期實現時,為了快速匹配指令名,建立了一個與指令集對應的全域性陣列,該陣列按字母表順序索引指令名。具體而言就是將相同首字母的指令放入以該字母命名的一維陣列中,26個字母索引陣列共同構成全域性陣列。
  該方法存在兩方面的問題,1 需要手動建立和同步修改全域性陣列和指令集,還需要人工按字母索引分類,程式碼冗餘,不易於管理。2 查詢時需要遍歷索引內的所有指令名,效率不高。
  本次優化,使用連結串列自動遍歷指令集並生成排好序的索引陣列,並在查詢時使用二分法提高效率。
  由於指令集中指令並不一定按照字母順序排列,而二分法必須是對有序資料才能進行。因此需要建立一個包含全部指令名的有序陣列。實現中,使用基於連結串列的插入排序,表頭資料為全A,為最小的指令名,每次插入時,從表頭查詢,直到第一個大於新指令名的節點,並將新指令名插入到該節點之前,實現中,需要一個儲存上一個節點的臨時變數。由於指令存在多種引數或型別,指令集中包含多條相同名指令,因此需要進行插入前的過濾。
  插入排序完成後,需要將連結串列內容拷貝到陣列中以便使用二分查詢,同時記錄指令總數。
  二分查詢對待查詢內容進行折半判斷,每次判斷後,調整查詢區間為之前的一半,本次優化使用遞迴形式實現。
  通過以上的優化,去除了之前手工維護的全域性索引陣列,大大簡化程式碼維護和管理工作,並建立相應類,呼叫時直接呼叫類方法,而非之前在使用時的for迴圈遍歷。另一方面,提高了一定的查詢效率。