第四十八章:十岁的小老师(2/2)

投票推荐 加入书签 留言反馈

    陆沉看着眼前三位同学,一个游戏崩溃,一个刨根问底钻研硬体原理,一个试图用计算机解决高阶数学问题。

    他忽然觉得这场面有点熟悉,仿佛回到了前世的实验室,同事们拿着各自的问题来找他讨论。

    「一个个来。」陆沉把门完全打开,让三人进来。

    里间空间不大,一下子显得有点拥挤。

    他先走到孙鹏的机器前。

    孙鹏的坦克大战是他用BASIC模仿的,图形极其简陋,用字符表示坦克和墙壁。

    陆沉调出原始码,快速浏览。

    「你这里,」陆沉指着一行代码,「BULLETX = TANKX + DIRX * 3,子弹初始位置用坦克坐标加上方向向量乘以3。你想让子弹发射位置靠前一点,想法没错。但你没检查TANKX + DIRX*3会不会超过屏幕边界。当坦克贴边时,这个计算值可能为负或超过最大值,导致数组越界,访问了不该访问的内存地址,程序就崩了。」

    「边界检查……」孙鹏恍然大悟,「我光想着让坦克跑得快,忘了子弹出生点也可能出界!那怎麽办?每发一颗子弹都判断一下?」

    「加个IF语句判断计算后的坐标是否在有效范围内,如果非法,就修正到边界值,或者乾脆不允许发射。」陆沉说着,接过键盘,快速加了四行条件判断。

    运行,坦克贴边开火,子弹稳稳出现在边界处,不再死机。

    「神了!」孙鹏一拍大腿,「就这麽简单?我怎麽就没想到!」

    「经验问题。多写多崩几次,就有感觉了。」陆沉笑了笑。

    这确实是经验,前世调试程序时,边界条件是最容易出错的角落之一。

    接着是陈浩。

    陆沉拿过他那张手绘的CPU图,看了几眼,发现陈浩的理解已经相当深入,甚至画出了简单的数据通路。

    「你的比喻很对,时钟周期就像曲轴转一圈,指挥所有齿轮(寄存器丶运算器)同步动作一次。但CPU内部不是只有一个曲轴,它有多级流水线,可以像工厂的流水线一样,同时处理多条指令的不同阶段。」陆沉尽量用陈浩能懂的比喻,「比如第一条指令在取齿轮(取指),第二条指令就可以同时在转齿轮(解码),第三条在咬合齿轮(执行)。这样总的效率就高了。至于哪个力道优先,由控制器根据指令本身的依赖关系和流水线状态动态调度,有点像码头调度员指挥不同货船装卸,要避免拥堵和冲突。」

    为了让陈浩更直观地理解流水线,陆沉乾脆在草稿纸上画了一条简易的丶分为取指-解码-执行-访存-写回五个阶段的流水线图,用箭头表示指令流动,并标出可能发生的数据冲突(比如下条指令需要上条指令的结果,但结果还没写回)和控制冲突(遇到跳转指令)。

    这些都是计算机体系结构课程的内容,但他用齿轮卡壳丶传送带改道这样接地气的说法解释,陈浩听得眼睛发亮,连连点头。

    「我好像有点明白了!就是说,CPU不是傻乎乎地干完一件事再干下一件,而是像……像几个老师同时批改不同班级的卷子,虽然每个老师只负责一道题,但整体批改速度飞快!」陈浩兴奋地总结。

    「这个比喻好。」陆沉赞道。

章节目录