一秒记住【爱阅】aiyue365.org,更新快,无弹窗!
他像一块乾燥的海绵,疯狂吸收着关于这两台机器的知识。
苹果II上,他用BASIC写简单的图形程序,画会动的星星丶跳动的音符;8086上,他学DOS命令,用DEBUG工具看内存,甚至尝试用汇编语言写几行小程序(虽然语法生涩,但逻辑清晰)。
他的进步快得惊人。
两周后,他就能用苹果II的BASIC写一个贪吃蛇游戏——用方向键控制小方块移动,吃到随机出现的食物后变长,撞到边界或自己身体则游戏结束。
虽然画面是粗糙的字符和简单图形,但逻辑完整,运行流畅。
本书由??????????.??????全网首发
张老师看到后,惊讶得半天说不出话:「这……这得学多久才能写出来?」
「三天,每天放学后练两小时。」陆沉说。
张老师沉默了。
他知道陆沉没说谎,但三天写出一个可运行的贪吃蛇,在任何一本编程教材里都是进阶案例,而这个十岁的孩子,只用了三天。
陆沉的计算机能力很快在实验班传开。
孙鹏缠着他教怎麽改游戏参数,陈浩想了解硬体原理,刘宇则和他讨论算法优化。
陆沉从不藏私,但也不会主动炫耀。
他帮孙鹏修改了贪吃蛇的移动速度,给陈浩解释了8086的寄存器结构(用修农机时齿轮传动打比方),和刘宇一起用数学公式优化了图形绘制效率。
——
特权带来的意料之中的副作用,就是学霸三人组的请教越来越频繁。
每天下午放学后,陆沉钻进里间机房没多久,外间就会响起试探性的敲门声,或者乾脆是孙鹏那标志性的大嗓门隔着门板传来:「沉子!开门!救命!」
这天周四,陆沉正在8086PC机上,尝试用DEBUG工具查看一段简单的汇编程序在内存中的加载情况。
门又被敲响了,节奏急促。
陆沉保存好进度,起身开门。
门口站着三个人:一脸苦相的孙鹏,眉头紧锁的陈浩,还有抱着本厚厚《数学物理方法》的刘宇。
「沉子,江湖救急!」孙鹏率先挤进来,指着外间一台中华学习机,「我的坦克大战,好不容易改了参数,坦克跑得飞快,可一开火就死机!肯定是哪个数据溢出搞崩了!」
陈浩则递过来一张手绘的草图,上面画着8086CPU的方块图,用箭头标注着数据流,旁边写着密密麻麻的问题:「你上次说AX丶BX这些寄存器像齿轮箱里的不同齿轮,负责传递不同力道的的数据。那如果同时有多个力道要处理,CPU怎麽知道先转哪个齿轮?还有这个时钟周期,是不是就像柴油机的曲轴转一圈,完成一个动作?」
刘宇没说话,只是把手里那本《数学物理方法》翻到某一页,指着上面一个用级数展开近似计算积分的公式,又指了指里间那台苹果II:「我在想,如果要用计算机数值求解这个积分,是不是得把这个连续过程离散化?离散的步长怎麽取,才能在精度和计算量之间取得平衡?我用BASIC写了个循环试算,但结果不太对,感觉是舍入误差累积了。」
陆沉看着眼前三位同学,一个游戏崩溃,一个刨根问底钻研硬体原理,一个试图用计算机解决高阶数学问题。
他忽然觉得这场面有点熟悉,仿佛回到了前世的实验室,同事们拿着各自的问题来找他讨论。
「一个个来。」陆沉把门完全打开,让三人进来。
里间空间不大,一下子显得有点拥挤。
他先走到孙鹏的机器前。
孙鹏的坦克大战是他用BASIC模仿的,图形极其简陋,用字符表示坦克和墙壁。
陆沉调出原始码,快速浏览。
「你这里,」陆沉指着一行代码,「BULLETX=TANKX+DIRX*3,子弹初始位置用坦克坐标加上方向向量乘以3。你想让子弹发射位置靠前一点,想法没错。但你没检查TANKX+DIRX*3会不会超过屏幕边界。当坦克贴边时,这个计算值可能为负或超过最大值,导致数组越界,访问了不该访问的内存地址,程序就崩了。」
「边界检查……」孙鹏恍然大悟,「我光想着让坦克跑得快,忘了子弹出生点也可能出界!那怎麽办?每发一颗子弹都判断一下?」
「加个IF语句判断计算后的坐标是否在有效范围内,如果非法,就修正到边界值,或者乾脆不允许发射。」陆沉说着,接过键盘,快速加了四行条件判断。
运行,坦克贴边开火,子弹稳稳出现在边界处,不再死机。
「神了!」孙鹏一拍大腿,「就这麽简单?我怎麽就没想到!」
「经验问题。多写多崩几次,就有感觉了。」陆沉笑了笑。
这确实是经验,前世调试程序时,边界条件是最容易出错的角落之一。
接着是陈浩。
陆沉拿过他那张手绘的CPU图,看了几眼,发现陈浩的理解已经相当深入,甚至画出了简单的数据通路。
「你的比喻很对,时钟周期就像曲轴转一圈,指挥所有齿轮(寄存器丶运算器)同步动作一次。但CPU内部不是只有一个曲轴,它有多级流水线,可以像工厂的流水线一样,同时处理多条指令的不同阶段。」陆沉尽量用陈浩能懂的比喻,「比如第一条指令在取齿轮(取指),第二条指令就可以同时在转齿轮(解码),第三条在咬合齿轮(执行)。这样总的效率就高了。至于哪个力道优先,由控制器根据指令本身的依赖关系和流水线状态动态调度,有点像码头调度员指挥不同货船装卸,要避免拥堵和冲突。」
为了让陈浩更直观地理解流水线,陆沉乾脆在草稿纸上画了一条简易的丶分为取指-解码-执行-访存-写回五个阶段的流水线图,用箭头表示指令流动,并标出可能发生的数据冲突(比如下条指令需要上条指令的结果,但结果还没写回)和控制冲突(遇到跳转指令)。
这些都是计算机体系结构课程的内容,但他用齿轮卡壳丶传送带改道这样接地气的说法解释,陈浩听得眼睛发亮,连连点头。
「我好像有点明白了!就是说,CPU不是傻乎乎地干完一件事再干下一件,而是像……像几个老师同时批改不同班级的卷子,虽然每个老师只负责一道题,但整体批改速度飞快!」陈浩兴奋地总结。
「这个比喻好。」陆沉赞道。