2019-2020-1学期20212407《网络空间安全专业导论》第三周学习总结

今天我学习了《低级程序设计语言与伪代码》和《问题求解与算法设计》两章内容,思维导图如下:
低级程序设计语言与伪代码
·机器语言是最低等级的编程语言
·伪代码能够表示算法
6.1 计算机操作
·我们所用的程序设计语言都必须反映出计算机能够执行的运算类型
·计算机是能够存储、检索和处理数据的可编辑电子设备。用户可以把数据输入计算机,计算机能够显示数据。在最底层抽象中,给机器的指令直接反映了这5种操作
·操作字包括可编程的(programmable)、存储(store)、检索(retrieve)和处理(process)
6.2 机器语言
·机器语言(machine language):有计算机直接使用的二进制编码指令构成的语言【计算机必须参考的命令的真实清单并不存在】
·计算机的机器语言是一套机器的硬件能够识别并执行的指令。每条机器语言指令只能执行一个非常低级的任务
·目前几乎没有程序是用机器语言编写的,主要是因为编写这种程序太费时间
1.Pep/9:一台虚拟机
·虚拟机(virtual computer (machine)):为了模拟真实机器的重要特征而设计的假象机器
·每种类型的CPU都有它能理解的自己的机器语言
·Pep/9有40条机器语言指令
----Pep/9的基本特性
·Pep/9的内存单元由65536字节的存储空间构成;Pep/9的字长是2字节,或者16位
·寄存器(register)用来存储特殊的数据和中间值。Pep/9有七个寄存器[重点研究三个pep/9的CPU]
程序计数器(PC),其中包含下一条即将被执行的指令的地址
指令寄存器(IR),其中包含正在被执行的指令的一个副本
累加器(A)用来存储数据和运算的结果
·存储器中的地址本身并不存储在存储器中,它们只是其中独立字节的名字
·可以的位数决定了我们可以使用的内存大小
----指令格式
·一条指令由两部分组成,即8位的指令说明符(instruction specifier)和(可选的)16位的操作数说明符(operand specifier),所以Pep/9的指令长度是一字节或三字节,取决于是否需要用操作说明符
·指令说明符(指令的第一个字节)说明了要执行什么操作和如何解释操作数的位置;操作数说明符(指令的第二和第三个字节)存放的是操作数本身或操作数的地址
·操作代码(operation code)称为操作码(opcode),长度从4位到8位不等
·寻址模式说明符(addressing mode specifier)表示怎样解析指令中的操作数部分。【寻址模式为000:立即寻址(immediate(i));寻址模式为001:直接寻址(direct(d))】
·没有操作数(要处理的数据)的指令称为一元指令(unary instruction)
----一些示例指令
·0000停止指令:停止(stop)指令是一个一元指令,没有操作数说明符
·1100将字载入寄存器A中:将一个字(两个字节)载入寄存器A中【寻址模式决定了该字要载入的位置】
如果是立即寻址,是被载入寄存器A中的值在操作数说明符中;如果是直接寻址,是操作数说明符存储了操作数驻留在内存中的地址(address)
·1101将字节载入寄存器A中:将一个字节载入寄存器A中
如果是立即寻址,操作数说明符第一个字节会被忽略,第二个字节被载入寄存器A;如果是直接寻址,只载入内存位置的1字节而不是2字节
·1110存储寄存器A中的字:把寄存器A中的内容存储到操作数中指定的位置
在存储操作码中使用立即寻址模式是非法的,因为我们不能将寄存器的内容存储到操作数说明符中
·1111存储寄存器A的字节:只存1字节而不是2字节,它不支持立即寻址模式
·0110将操作数加到寄存器A中:与载入操作相似,相加操作使用寻址模式说明符,使它有两种解释方式
·1000从寄存器A减操作数(与加法操作相似)
2.Pep/9的输入/输出
·Pep/9系统模拟了从键盘读入字符输入并将字符输出写到屏幕(终端窗口)中的能力;对于输入和输出(I/O),虚拟机遵循的设计原则内存映射输入/输出(memory-mapped I/O)
6.3 一个程序实例(在屏幕上显示“Hi”)
·有5条机器语言指令:2条用于载入,2条用于存储,1条用于停止程序运行
·二进制和十六进制的列代表相同的值
·必须使用存储单一字节的存储指令
1.Pep/9模拟器
·为了运行Pep/9机器语言程序,我们逐字节输入十六进制的程序代码到一个有目标代码(Object Code)标签的窗口中;程序代码每个字节用空格隔开,以zz结束程序
·载入存储器这个任务通过装入程序(loader)的软件工具实现
·读取——执行周期:1)从由程序计数器确定的存储器位置上获取指令;2)解码指令,更新程序计数器;3)获得操作数(如果需要);4)执行指令
2.另一个机器语言实例(读入两个字符作为输入,并且将它们逆序打印出来)
·1)载入字节指令【从存储器FC15(代表输入设备,存储累加器的字符)位置读入】;2)存储字节操作【暂时存储存储器0013位置字符】;3)载入字节指令【读取第二个字符,存储到累加器】;4)存储字节操作【将第二个字符输出到输出设备】;5)载入第一个字符【重新回到累加器】;6)存储字节操作【将第一个字节输出到输出设备(用来打印字符)】;7)使用一元终止指令停止
6.4 汇编语言
·汇编语言(assembly language):一种低级语言,用助记码表示特定计算机的机器语言指令
·汇编器(assembler):把汇编语言程序翻译成机器代码的程序
1.Pep/9汇编语言
·Pep/9汇编语言中,操作数用0x和十六进制表示,接下来是逗号,最后是寻址模式【由字母i(立即寻址)或d(直接寻址)说明,LDWA(载入字)和LDBA(载入字节)两种助记码均能使用(i),寻址载入操作数的值可用(d)】
·汇编语言支持汇编器指令(assenbler directive),这些指令是汇编器本身使用(翻译程序使用)的指令,有时被称为伪操作(pseudo-operation)
·注释(comment)是为程序使用者而写的说明文字,解释了会发生什么情况
2.数字数据、分支、标签
·Pep/9机器语言的输出值被定义为单个字符,不能直接使用机器语言编写程序来金乡数值计算
·分支(branch):指出执行下一条指令的指令
1)DECI指令代表十进制输入(decimal input),可以读入十进制数,并存储在操作数指定的位置(不支持(i))
2)DECO指令输出特定的十进制数字(支持(i)和(d));STRO指令用来打印完整的一串字符
3)BR指令(无条件转移)使程序计数器(用来确定下一条指令的寄存器)的值为操作数中的存储器地址
4)BRLT(累加器小于零)和BREQ(累加器等于零)指令只满足特定情况时导致程序分支
5)CPWA指令对比了累加器中的数值和操作数(将累加器的当前值减去操作数,并存储累加器的结果)
·标签(label):对内存位置起的名字,可以将这个名字当作操作数
1)每个数据块2字节
2)标签和它们对应的地址会在代码清单后以符号表(symbol table)的形式展示
3)BRLT指令被用来在累加器(sum)包含负数的时候进行跳转
3.汇编语言中的循环
·我们通过AddNums程序来使用循环
6.5表达算法
·算法(algorithm):解决方案的计划或概要,或解决问题的逻辑步骤顺序
·伪代码(pseudocode):一种表达算法的语言(不是计算机语言)
1.伪代码的功能
·变量:出现在伪代码算法中的名字,引用的是内存中存储值的位置,反映它存放的值在算法中的角色
·赋值:把值放入变量的方法
1’把值放入变量sum中:Set sum to 0 或者使用反箭头sum <—— 1
2’访问变量sum和num的值:Set sum to sum+num 或sum<——sum+num
·存入变量的值可以是单个的值,也可以是由变量或操作符构成的表达式(expression)
3’输入/输出
·我们可以使用write语句进行输出,使用read语句进行输入
1)Write“Enter the number of values to read and sum” 2)Read num
·双引号之间的字符叫做字符串(string)
·Display和Print都等价于Write,Get和Input与Read同义
·伪代码算法是写给人们看的,以便转换成程序设计语言
1)Write “Err”【把双引号之间的字符输出到屏幕上】;Write sum【变量sum的内容输出到屏幕上】
4’选择
//Read and sum three numbers
IF(sum<0)
Print error message
Print sum
//Whatever comes next
符号"//"用于加注释,它并不是算法的一部分
5’重复
Set limit to number of value to sum
WHILE(counter<limit)
Read num
Set sum to sum+num
Set counter to counter+1
//Rest of program
·WHILE和IF旁边的括号里表达式是布尔表达式(boolean expression),其结果可为真或假
·将WHILE、IF和FLSE大写是因为这些语句通常直接使用在很多编程语言中,在计算领域中它们由特殊的含义
·一个伪代码语句可以被翻译成多种汇编语言语句
2.执行伪代码算法
·decimalNumber最初存放的是这个问题的初始值,即要转化的数
·方框newBase在整个过程中都没有改变,这个算法是把十进制数转化为另一种基数的值,所以必须给这个问题输入新基数
3.写伪代码算法
·numberRead需改变,要增加numberRead的值

·伪代码是人们为了表示算法而使用的一种便捷形式的语言,允许用户命名变量(存放值的空间)、把数值输入变量以及输出存储在变量中的值
·我们问了问题并推迟了细节。推迟细节则是首先给任务一个名称,然后在补充细节来完成这个任务
·在没有测试之前,算法都不算完成。可以采用基于模拟基数转换算法的方法来测试算法:选择数值,用纸与笔进行代码走查
·桌面检查(desk checking):在纸上走查整个设计
4.翻译伪代码算法
·如何翻译伪代码算法取决于我们将算法翻译成哪种成哪种语言
·首先使用ASCII伪操作设置消息,然后创建代码将这个消息写出来;STRO指令是用来打印消息的
认证是非政府组织给予满足组织要求规定的个体识别资格的过程;许可是一个政府资助的法律权威
6.6 测试
·我们根据程序原先的目的来判断它直观的正确性
·测试计划(test plan):说明如何测试程序的文档(每套输入的数据值称为测试用例(test case))
·代码覆盖(明箱)测试法(code-coverage(clear-box)testing):通过执行代码中的所有语句测试程序或子程序的测试方法
·数据覆盖(暗箱)测试法(data-coverage(black-box)testing):把代码作为一个暗箱,基于所有可能的输入数据测试程序或子程序的测试方法
·测试计划实现(test-plan implementation):用测试计划中规定的测试用例验证程序是否输入了预期的结果
·代码覆盖测试法通过仔细检查程序的代码来决定程序的输入;数据覆盖测试法通过考虑所有可能的输入值来决定程序的输入
问题求解与算法设计
·算法,即它们在解决问题、开发策略、采用和测试的技术中的作用。我们选择经典搜索和排序算法来讨论算法
7.1 如何解决问题
·如果把文字未知量改成问题,数据换成信息,定理换成解决方案,Polya的书中“如何解决它”这个列表适用各种类型的问题
·其中第二步(找到信息与解决方案之间的联系)是问题求解的核心

1·提出问题
2·寻找熟悉的情况
3.分治法(应用了抽象概念)
4.算法
·算法(algorithm):在有限的时间内用有限的数据解决问题或子问题的明确指令集合
5计算机问题求解过程
·四个阶段:分析和说明阶段(清楚的问题描述)、算法开发阶段(通用解决方案)、实现阶段(计算机可以运行的程序)和维护阶段(检查是否有错误)

·如何用计算机解决问题的略图中,包括Polya类别中的所有阶段。第一步都是理解问题,不可能给根本不理解的问题编写计算机解决方案

6.方案总结
·四个步骤:1)分析问题 2)列出主要问题(用自然语言或伪代码在主模块中重述问题) 3)编写其余的模块 4)根据需要进行重组和改写
7.测试算法
·计算机求解的目标是生成问题的特定答案
7.2 有简单变量的算法
1.带有选择的算法(IF ;ELSE IF ;··· ;ELSE )
·到达第二个if语句的唯一条件是第一个if表达式是不真实的
2.带有循环的算法
两种基本循环:计数循环;事件循环
1’计数控制循环(Set count to 初始值;WHILE(条件);Set count to 表达式;···)
·使用一个特殊的变量叫做循环控制变量(loop control variable)
·第一部分是初始化;第二部分是测试;第三部分是增量
·while循环称为前测试循环(pretest loop),因为循环开始前就测试了
·永远不会终止的循环叫做无限循环(infinite loop)
2’事件控制循环
·循环中重复的次数是由循环体自身内发生的事件控制的循环称为事件控制循环
·使用while语句实现循环的三个部分:事件必须初始化;事件必须被测试;事件必须被更新
·嵌套结构(nest structure):控制结构嵌入另一个控制结构的结构,又称为嵌套逻辑(nested logic)
3.平方根
·绝对值:abs(epsilon)
·猜测的平方与原始值的差距在0.001之前,则这个值足够好
Read in square
Set guess to square/4
Set epsilon to 1
WHILE (epsilon>0.001)
Calculate new guess
Set epsilon to abs(square-guess*guess)
Write out square and the guess
·抽象步骤(abstract step):季节仍未明确的算法步骤
·具体步骤(concrete step):季节完全明确的算法步骤
7.3 复杂变量
·引用中的字母叫做字符串,存储一个字符串,所需位置数量取决于字符串字符的数量
1.数组
·数组是同构项目的有名集合
·项目在集合中的位置叫做索引
·与数组相关的算法:搜索(搜索数组的项,一次找一个特定的值)、排序(按顺序放入数组)、处理(对数组中的项所做的所有其他计算)
2.记录
·记录是异构项目的有名集合,可以通过名字单独访问其中的项目
·异构指集合中的元素可以不必相同
7.4 搜索算法
1.顺序搜索(Set position to 0;Set found to FALSE;WHILE (条件);IF (条件);Set found to TRUE;ELSE;Set position to 表达式
·布尔操作符包括特殊操作符AND、OR、NOT
2.有序数列中的顺序搜索
·在有序数列中查找数字

3.二分检索
·二分检索(binary search):在有序列表中查找项目的操作,通过比较操作排除大部分检索范围
·数组必须是有序的
·如果数组是有序的,已经排好,且其中的项目超过20个,使用二分检索更好
7.5 排序
1.选择排序(Set ··· to ···;WHILE(条件);IF(条件);Set ··· to ··· )
·选出第一个,在从剩下的里找出第二个,以此类推
·选择排序算法不能确定数组是有序的,一定要执行整个算法
2.冒泡排序
·冒泡排序也是一种选择排序法,只是在查找最小值时采用了不同的方法。它从数组的最后一个元素开始,比较相邻的元素对,如果下面的元素小于上面的元素,就交换这两个元素的位置

3.插入排序
·current就是元素插入有序数列的元素

  7.6 递归算法
·当在一个算法中使用它自己时,这样的算法被称为递归算法,也就是说,如果在某种程度上调用自己,则这个调用称为递归调用
·递归(recursion):算法调用它本身的能力,是另一种重复(循环)的
·每个递归算法至少有两种情况:基本情况(答案已知的情况)和一般情况(调用自身来解决问题的更小版本的解决方案)
·有递归解决方案的第一步都是确定尺寸系数
·使用递归算法时,每次执行算法提供给算法的数据值必须是不同的。因此,继续递归之前前,先要了解一个新的控制结构:子程序语句
1.命名代码出现的地方叫调用单元

2.递归阶乘
·Factorial(N) = N*Factorial(N-1)
·每次调用 Factorial 时N都会减小,每次给出的数据称为参数
·子程序将不断地调用自身,直到运行时间支持系统耗尽了内存为止的情况叫无限递归(与无限循环等价)
3.递归二分检索
4.快速排序
·基本策略是分治法
·这种策略的基础是递归,即每次对一堆试卷排序,都要把它分成两小堆(较小的情况)然后分别对每一小堆试卷应用同样的方法
·永远不要重复造轮子
·如果问题陈述逻辑上分为两种情况(基本情况、一般情况),则递归是一种可行的选择
  7.7 几个重要思想
1.信息隐蔽
·信息隐蔽(information hiding): 隐蔽模块的细节以控制对这些细节的访问的做法
2.抽象
·抽象( abstraction)和信息隐蔽就像一个硬币的两面:信息隐蔽是隐藏细节的做法,抽象是隐藏细节背后的结果

3.事物命名
·给数据和过程的名字叫作标识符
4.测试
·测试分类:白盒测试和黑盒测试

posted @ 2021-10-17 22:00  20212407林媛媛  阅读(295)  评论(0)    收藏  举报