1701066408
1701066409
1701066410
1701066411
1701066412
▲图8.1 计算机存储器简化示意图,位置用1—5依次编号,其中4个存储有程序。指令指针指向计算机当前存储的指令。有些指令行前面带有空格,在执行的时候会被忽略
1701066413
1701066414
要执行程序,计算机要有一个“指令指针”——同样存储在存储器中的一个数字,记录当前执行的指令在存储器中的位置。指令指针——简记为ip——最初设为程序第一行的存储地址。我们称之为“指向”那条指令。在计算的每一步ip指向的指令会被执行,ip加1。
1701066415
1701066416
例如,在图8.1中,ip的值为2,也就是说指向的是print(“Hello, world!”)。
1701066417
1701066418
我们称ip为变量,因它的值随着计算的进行而不断变化。
1701066419
1701066420
还可以定义变量line[n]表示地址n中的字符串。例如,指令print(line[2])会显示输出:
1701066421
1701066422
print(“Hello, world!”)
1701066423
1701066424
此外,我们的编程语言中还包括loop指令(循环)。例如,下面的程序代码:
1701066425
1701066426
x=0
1701066427
1701066428
loop until x=4
1701066429
1701066430
{
1701066431
1701066432
print(“Hello, world!”)
1701066433
1701066434
x=x+1
1701066435
1701066436
}
1701066437
1701066438
会输出:
1701066439
1701066440
Hello, world!
1701066441
1701066442
Hello, world!
1701066443
1701066444
Hello, world!
1701066445
1701066446
Hello, world!
1701066447
1701066448
大括号之间的代码会反复执行直到循环结束条件(这里是x=4)满足。变量用作计数器——从0开始,每循环一次加1。增加到4时循环停止。
1701066449
1701066450
现在可以来看看自我复制程序了,程序完整展现在图8.2中。理解一段程序最好的办法就是手工推演,也就是一行一行跟踪程序的运行。
1701066451
1701066452
假设图8.2中的程序被加载到内存中,然后假设有人在计算机命令提示符后键入selfcopy,计算机就会开始执行程序selfcopy。译码器——操作系统的一部分——会将指令指针设为1,指向程序名。然后ip会下移,逐行执行各条指令。
1701066453
1701066454
在地址2处变量L被设为ip-1。而ip是当前执行指令的位置。因此当执行第2行时,ip设为2,L设为2-1=1。(注意虽然随着指令执行会不断变化,但L在重置之前会一直等于1直到其被重置。)接着会进入循环,直到line[L]等于字符串end。前面说了line[L]等于内存中地址L处的字符串。目前L等于1,line[L]等于字符串programselfcopy,不等于字符串end,因此循环不会停止。在循环中,会显示输出line[L],并将L加1。最初,L=1,显示输出program selfcopy;然后L被置为2。
1701066455
1701066456
1701066457
[
上一页 ]
[ :1.701066408e+09 ]
[
下一页 ]