汇编器优化,指令名链表排序与二分查找

来源:互联网 发布:gevent 数据库 编辑:程序博客网 时间:2024/05/17 07:10

在汇编器的词法分析阶段,需要对获取的指令名进行有效性验证并保存对应的指令类型。然而,当前实现方法在效率和管理性方面还有不足,顾需进行优化,主要工作如下图。


  前期实现时,为了快速匹配指令名,建立了一个与指令集对应的全局数组,该数组按字母表顺序索引指令名。具体而言就是将相同首字母的指令放入以该字母命名的一维数组中,26个字母索引数组共同构成全局数组。
  该方法存在两方面的问题,1 需要手动建立和同步修改全局数组和指令集,还需要人工按字母索引分类,代码冗余,不易于管理。2 查找时需要遍历索引内的所有指令名,效率不高。
  本次优化,使用链表自动遍历指令集并生成排好序的索引数组,并在查找时使用二分法提高效率。
  由于指令集中指令并不一定按照字母顺序排列,而二分法必须是对有序数据才能进行。因此需要建立一个包含全部指令名的有序数组。实现中,使用基于链表的插入排序,表头数据为全A,为最小的指令名,每次插入时,从表头查找,直到第一个大于新指令名的节点,并将新指令名插入到该节点之前,实现中,需要一个保存上一个节点的临时变量。由于指令存在多种参数或类型,指令集中包含多条相同名指令,因此需要进行插入前的过滤。
  插入排序完成后,需要将链表内容拷贝到数组中以便使用二分查找,同时记录指令总数。
  二分查找对待查找内容进行折半判断,每次判断后,调整查找区间为之前的一半,本次优化使用递归形式实现。
  通过以上的优化,去除了之前手工维护的全局索引数组,大大简化代码维护和管理工作,并建立相应类,调用时直接调用类方法,而非之前在使用时的for循环遍历。另一方面,提高了一定的查找效率。
0 0
原创粉丝点击