“程程,帮忙看一个问题呗?”
一名绑着单马尾,脸蛋圆圆的妹子蹭到了程原的身旁,并小声向他请教道:“我这个程序运行不起来!”
“哎,好吧。”程原耸了耸肩,并暂时放下了手中的笔记本。
随后,他伸手轻轻一推桌边,装有轮子的办公椅便将他送到了圆脸妹子的工位旁。接下来他抬头看了一眼屏幕……
“我说团团啊。”程原痛苦地扶了扶额头:“程序的主入口是main函数,你写的这个mian函数是什么鬼啊。”
“哎呀,不好意思。”被称为团团的妹子下意识地吐了吐舌头,随后她用两根手指飞快地敲击了几下键盘,这下程序终于成功地运行起来了。
“耶!我成功了,现在我也会写程序啦!”望着弹出窗口中显示的一行文字,团团高兴地握了握拳头。
一旁的程原下意识地张了张口,但是他最终并没有打击妹子的积极性。虽然她写的只是一个最简单的菜鸟入门程序,但谁还不是从菜鸟一步一步成长起来的呢?
随后,程原再次一推桌子,返回了自己的工位。不过还没等他重新拿起笔记本,另一名同事就已经带着问题屁颠屁颠地跑过来了。
“程远大佬,帮忙看一个问题呗……”
好吧,程原只好再次动身。
十秒钟后,程原一脸无语地指着面前的几行代码道:“大熊啊,这个index我还可以理解,但是后边的indey和indez是什么东西啊?”
被称为大熊的汉子憨厚地张了张嘴:“x,y,z,没问题啊?”
程原:“……”
他感觉自己的肝在隐隐作痛。随后,程原默默地调取了一点宝贵的信息点,为自己施展了一个小型的治疗术。
好说歹说劝服大熊修改了变量名称的拼写,程原还没来得及松口气,下一个问题就找上了门。
“这行a[i++]+=++i+i+i++是谁写的?”一看到面前的一串鬼画符,程原就气不打一处来:“赶快换回正常人类的写法,这种东西以后没人能看得懂。”
“这可是我想了好久才想出来的!”提问的强子不服气地回道:“看不懂的人说明他水平不够。”
面对强词夺理的强子,程原本想批评他两句,但想了想后还是忍住了:“在工作中,绝大部分时候都不要这样写程序。代码是用来实现功能的,不是用来让你炫耀技巧的。”
“那我加上注释说明还不行么?”强子仍不死心,毕竟这行代码中凝聚了他不少的“心血”。
“不好意思还是不行,这样写会出问题的。”程原无奈地扯过强子的键盘,并在上面随手敲了两下,打开了一个全是英文的网站:“你自己看看吧,jdk9前几个月报出的问题,你这个写法正好会触发这个编译器的bug。”
闻言,强子连忙打开了他宝贵的电子词典,开始一个单词一个单词地读起了这个网页中的内容……半晌后他发出了一声惊叫:“我的天!居然编译器也会出问题……大佬你是怎么发现这个的啊?”
程原无奈地耸了耸肩。这个问题当时在网络上还是有一点讨论热度的,所以他自制的爬虫小程序自然不会放过将这条消息推送到他面前的机会。
“编译器又是什么东西啊?”团团好奇地凑了过来。
程远微微地叹了口气。他本来想解释说,编译器是一种可以将程序转换为程序的程序,但是很明显地,这个说法除了听上去很高端以外,它并不能对菜鸟妹子产生一点点的帮助。
所以,程原想了想后说道:“编译器……它就像是程序界中的‘翻译’。”
“翻译?”团团好奇地问道:“它可以将什么翻译成什么呢?”
“什么都可以。”程原一边考虑着适合的措辞一边回答道:“不过一般来说的话,我们会使用它将平时编写的代码翻译成机器能够看懂的二进制指令……”
程远缓缓地讲着,他的思绪渐渐飘远。
——
最开始,人们在计算时,只是使用手指,绳结和石头。后来,人们发明了简单的算盘和复杂的齿轮,帮助数学家们进行各种各样的运算。
然而,齿轮的转动速度是缓慢的,人们的加工精度是有限的。当需要处理复杂的运算时,即使是最好的工匠也没办法加工出满足要求的齿轮,地球位面史上,曾经的一位“机械计算机”发明者就因此抱憾而终。
然而后来,人们发现,如果使用一些特定的工艺,对一些被称为“半导体”的材料进行加工的话,就可以在其中产生一种被称为“pn结”的结构。
当然,不了解这个“pn结”的原理并不要紧,我们只需要知道,曾经的人们使用这个pn结,发明了二极管和三极管。
当然,不了解二极管和三极管的原理也不要紧,我们只需要知道,曾经的人们使用二极管和三极管,组合出了与或非等逻辑门电路。
当然,不了解逻辑门的原理也不要紧,我们只需要知道,工程师们使用一个个的逻辑门,制作出了各种各样的芯片。这些芯片中,有的能够进行加减运算,有的能够进行乘除,有的能够对输入的信号进行判断……
虽然,这些芯片只能使用一串串的高低电压,或者说二进制的“0”和“1”作为输入与输出,但是这就足够了。
终于有一天,工程师们发明了这样的一种芯片:
它可以接收最少两个二进制数字,一个“操作指令类型”的信号,并输出一个数字。
如果这个“操作指令”是加法,那么这个芯片便对接收的两个数字进行加法运算,并输出计算结果。
如果这个“操作指令”是乘法,那么这个芯片便对接收的两个数字进行乘法运算,并输出计算结果。
如果这个“操作指令”是比较大小,那么这个芯片便返回两个数字的比较结果……
工程师们为这个芯片设计了几十上百种可以支持的操作指令。除此之外,工程师们还在这个芯片的旁边安装了各种各样的,由电容或者磁铁粉制作而成的“存储器”,这些存储器可以为芯片提供输入信号,或者存储芯片输出的数值。
随后,工程师们开始在纸带上打孔。纸带上的每一段,都对应着芯片需要执行的一行指令。
最终,整个系统被组合。一条条纸带从识别孔洞的机器中划过,一波波电脉冲忠实地将扫描到的指令存入存储器。随后,一个由信号构成的“箭头”便可以从第一条指令开始,逐条地向芯片传递它所指向的指令。有时,这个箭头会听从芯片的命令,向前跳跃一段距离或是向后退两步,或者在小范围内转上几圈……不过一般情况下,它都能够到达最终的目的地。而在那时,工程师们想要计算的复杂公式的运算结果,已经安安稳稳地躺在存储器中了。
这个多功能的芯片,便是人们常说的cpu,而那一摞摞能够铺满整个地面的纸条,便是早期的计算机程序。
——
“大概的情况就是这样吧。”程原一边指着屏幕中的一行行如同天书一般的符号一边介绍道:“但是,一般人很难看得懂cpu直接使用的机器指令。因此,人们发明了各种各样的高级语言,然后再用编译器将这些高级语言转换为汇编指令和机器指令,这样就方便得多啦。”
“原来如此。”团团似懂非懂:“那……编译器是用什么语言写的呢?”
“嗯,现在的大部分语言的编译器都是用‘c语言’写的。”程原想了想后,表情古怪地抛出了这样的一个回答。
“那c语言的编译器又是用什么语言写的呢?”一旁的大熊想了想后也提了一个问题。
“c语言的编译器是用c语言写的。”程原满意地笑了笑,果然有人跳坑了。
“啊?可是没有编译器就翻译不了c语言,没有c语言就写不了编译器……”旁听的几人陷入了混乱当中。
“恭喜你们成功领悟了递归。”程原得意地回道,这下他的心情终于平复了一些。
随后,他一脸满足地坐回了自己的位置上。不过还没等他得意多久,他便感觉到一道目光从隔壁投射而来。程原不自觉地缩了缩脖子,并开始了下意识的左顾右盼。
十秒钟后。
“好吧好吧,揭晓谜底。”在那道目光的注视下,程原最终还是缴械投降了:“最早的、最简单的编译器是用汇编写的,而复杂一点的编译器是用最简单的编译器生成的,复杂两点的编译器是用复杂一点的编译器生成的,以此类推。”
这下,旁听的几人终于摆出了一脸恍然大悟的表情。
而程原则趁机一脸无奈地望向了那道目光的主人:一名戴着眼镜的,瘦小的文静少女。
[于小鱼同学啊,我没做什么伤天害理的事啊。]程原用目光向少女示意道。
[谁叫你欺负团团姐的,哼。]少女不客气地白了他一眼。
[明明是你的团团姐先来欺负我的。]程原用目光叫屈道。
[不管,哼。]被称为于小鱼的少女再次递给了程原一个鄙夷的眼神,随后她又转过头去对着键盘敲敲打打了。
好吧,被发了坏人卡的程原只好一脸郁闷地坐回了自己的工位上,随后他再次默默地打开了手中的笔记本。
“刚才我整理到哪了……哦对,程远那家伙陪着妹子去了小树林,然后学了不少与‘程式’相关的知识回来。哎,真羡慕那个家伙还有人可以讨论问题,我就只能盼着身边的几只菜鸟早一点开窍……好吧,小鱼不算菜鸟,但是不知道为什么,她总是拿眼神戳我啊!”
“哎,真是的。”程原越想越沮丧:“所以说没事不要做什么程序员,只能当单身狗不说,就算天天为别人帮忙也会被鄙视!真是太过分了!”