计算机要向何处发展 #随笔杂记#
/* 我关于计算机方面受到的最好的训练,恐怕是本科期间自己写的bootloader以及一个简陋到什么都不能做的操作系统,来到美国之后跟着一位很geeky的老师读了一个学期的Unix V6源代码,以及上个暑假接触到的Forth。我之前的专业是电子和计算机工程,所以在我的知识范畴中有很多CS覆盖不到的地方,比如如何用VHDL实现一个CPU(有一周时间真的在用机器码写程序),在缓存命中或者缓存失效的情况下一条指令要执行多少纳秒,要如何调整指令发射的顺序才能更好地优化流水线。头一个学期听了一门计算机原理的课程,老师在用Haskell讲编程语言原理。Haskell有很多奇怪的并且据说很优雅的特性,比如Lazy evaluation,比如monad等等。当讲到如何才能写出优雅的代码时,有同学问道不同的写法会不会有性能上的差异,老师很不屑地说,well,现在的计算机已经足够快了。我觉得这个假设有点难以接受,倒不是说这个假设有问题,因为电子计算机工程这个专业完全建立在另外一个对立的假设即“现在的计算机还不够快”才得以继续发展。如果说整个行业的发展都是建立在一两个随随便便做出的假设之上,想想觉得有点可笑啊。
问题是,那么计算机到底要多快?作为一个以后必定会成为一个计算机行业的从业人员,我到底要向哪个方向努力?努力到什么程度? */
1. 硬件的现状 计算机硬件已经分为了很多阵营,除了传统的x86 (包括x86_64) 架构,另外还有低端的和用于特定领域的市场的架构,这部分以RISC为主,主要是被ARM(Cortex系,用于智能手持设备、工业控制),TI(MSP430系,低功耗)以及MIPS处理器(24E/24K,知道的人不是很多,但是几乎垄断了所有的路由设备,性能和Cortex A系相近)。
x86架构十分可惜地浪费了很多计算资源。到现在为止除了Intel自己的编译器之外,很少有其他的处理器能够利用起指令集中其它的有效指令。比如现在流行的Intel处理器中应该包括SSE1~5,AVX,还有一些新近的指令集(AESNI and PCLMULQDQ,很诡异的名字,分别用于AES算法和无进位双64位乘法)在as和masm生成的HEX中,基本是找不到这些指令的代码的。这就意味着在我们现在CPU内的很多指令器件是闲置的。但是出于向前兼容的考虑,以及接受“不要重新发明轮子”的劝告,几乎没人在这个层次优化代码。当然,使用这些指令会不会产生其它问题,CPU出货之后,无论是intel还是使用CPU的人,就都不在意了。
关于RISC和CISC的区别,有一个简单的事实是,如Intel的CISC处理器,其实是由若干个RISC处理器构成的。CISC指令译码之后会被指派到不同的sub-RISC处理器中。RISC在处理某些问题时会体现出架构性优势,这就好像是general-purpose language和domain-specific language的区别一样。它们都在各个领域蓬勃发展,但不幸的是,真正愿意耐心了解CPU构造的人在整个计算机产业中还是太少了。
除了传统的处理器之外还有两个阵营正在慢慢变得牛逼起来,一个是GPU,一个是FPGA。
现在的GPU一般都支持ARB,但是这种类汇编语言并不是直接对GPU指令的映射。GPU的推广有一些问题,就是通常生产GPU的都是大厂商,大厂商自然只愿意和大厂商合作,所以GPU的开发平台基本都是在Windows下。这很让人头疼。暑假我曾试图从Mesa的源代码中找到OpenGL某些命令(如渲染、ModelView/Projection矩阵乘法)对应的GPU指令是什么,后来找到了很有趣的东西,在邮件列表里Intel负责为Linux开发驱动程序的小组领导人Dave Airlie曾经写信给Linus Torvalds讨论关于framebuffer驱动程序的问题,是否能够修改Kernel的驱动来让驱动程序更有效,然后被Torvalds义正言辞地拒绝了。于是Airlie的小组(包括Keith Packard等人)不得不写很多很恶心的胶合层代码,从TTM到GEM [我之前翻译过不少文章,但是都被我自己删掉了 :D ] 看过代码之后基本知道可以将显卡的汇编通过MMIO写入显卡里,但是这部分文档十分缺乏,所以显卡的计算资源(至少就现在来看)不是很容易利用。
FPGA在最近的五年发展可以说是异军突起,然而相比于传统的处理器平台,了解FPGA的人更少。FPGA现在已经能够做到实时重构电路,简单说就是它可以实现一个完全由硬件实现的解释器。Xilinx现在的全线产品都已经支持动态可重构,然而能够操纵它们的人确实不多。
一句话总结,就是硬件的计算资源浪费惊人。学校仓库里躺着一台台退下来的计算机,大概只用了不到两年就被淘汰,看着十分心疼。
2. 操作系统的现状 如果看一遍《The Art of UNIX Programming》,大概能看出来现在的操作系统发展已经违背了操作系统设计的初衷。操作系统本质上应该是一个软件工具集合,就好像是一个很全面的工具箱,里面全都是很小很顺手的小工具。你可以使用一些脚本将其组成适合解决你问题的工具,同时工具箱还提供了一种很牛的工具,就是可以用它锻造新的工具,如果你认为组合工具效率不够高,或者能够确保某一个环节可以用一种atomic的工具代替,那么就自己造一个。
操作系统产生于主机-客户端时代,后来提出了UNIX哲学,主张定制和裁剪操作系统,然后让计算机成为解决你问题的工具。在这个context之下,是没有所谓“应用程序”的说法的。应用程序是在像Mac OS或Windows这种桌面系统的语境下的词汇。桌面系统的特点是,你没有工具可以挑选,脚本的能力也非常有限。然而为了能让第三方开发者参与其中,这些操作系统保留了那个锻造新工具的工具,于是人们不得不用它制造出类似瑞士军刀一样的工具,比如Java。
3. 关于计算机的未来 很难具体地预测。但是有两件事可以肯定,x86在十年之内地位是无法撼动的。毕竟它是全球范围内计算机的基础设施。然而另外一方面,对特定环境下的计算机和电子设备的需求正在持续增长,这部分的市场会被如MIPS/ARM/MSP430系的平台所占据。不过这些平台在培训/开发/市场的循环还没有完全建立起来,需要花点时间。
4. 关于计算机从业人员的未来 计算机行业这两年吸纳了大量的从业人员,然而因为工作已经十分细化,导致使用不同编程语言的人,做网络/系统/硬件的人之间很难沟通。这个场景和圣经里Tower of Babel的故事很类似。因为沟通不畅,所以导致摩擦很严重,于是降低了开发效率。而企业维持开发效率的方法是进一步吸纳劳动力。此种情况下,如果不能确保持续的需求,那么市场的利润会被进一步摊薄。那些做着最具体的工作的人(尤其是做测试的),生活会更加辛苦。
5. 怎么办?[这只是我想到的对我自己的建议] 1) 不要随便被新技术和人们为新技术勾勒出的未来吸引。相反,有时间的话,要认真了解计算机的历史。譬如关于并发计算的问题,大概在上世纪六十年代就解决了(John Backus有一篇精彩绝伦的文章,同时也是他获得图灵奖时做的报告)。生活在新世纪的我们,事实上在不断借鉴故人的思想。 2) 不要把计算机开发看做一种工作。计算机发明出来本来是用来解决人类的问题的,然而现在看起来人类在逐渐变成计算机的外设。计算机本来应该让人更加自由,而不是更受限制。之所以现在出现这个局面,主要是人们没有了解计算机的真实面貌,而是杜撰了很多没必要的东西。我可能需要花点时间,去做大家都不屑去做的事情。 3) 学会为自己设计更好的工具。工欲善其事,必先利其器。如果不知道如何利其器恐怕还要现学。如果不会学恐怕还要学习如何学习。学习通常不会那么立竿见影,不妨沉下心来,日拱一卒,不期速成。