从“学什么编程语言”说开去

看了 vssw 写的 《学什么编程语言》
  http://bbs.pediy.com/showthread.php?t=125062
有点感想,随便说说。

编程语言只是一个工具,是帮助你实现你的思想,你的目标的。一个编程语言,首先它要能帮助你完成你要做的工程,第二它在满足第一的前提下,要足够简单。

比如,你要写一个驱动。你可以选C,C++,ASM。但如果你非要选Delphi,Basic,JAVA等,即使你天才地做到了,也不是好的选择。因为这些语言不是干这个的。

先说汇编与C++。无论是用什么语言写的程序,编译后运行起来,都成了汇编。所以,一个高级程序员,至少要能看懂汇编。这样才能从根本上理解class是怎么实现的,exception是怎么实现的等等。一些溢出的BUG,更是必须看汇编才能找到问题。但如果因此你就喜欢上了汇编,无论什么项目都用汇编来写,就是你的不对了。

比如,要实现一个链表。用C++来写,就比用汇编省力得多。为什么?因为在汇编中,你要时时考虑我只有这几个有限的寄存器,用完了就没有了,不够用了。我要时时记住EAX存的是什么东西,[ebp+4]存的是什么东西。我要时时记住函数调用时堆栈必须配平,这太累了。用C++实现一个链表根本不需要考虑这些东西。这里,我们就得出一个结论:如果一个工具,你使用它完成任务时,需要考虑太多的细节,那说明它已经不合适了。

比如我要骑马。我希望一拍马屁股就能走。不需要我考虑它先迈左脚还是右脚,不需要我分析怎么样保持不倒。不必关心这些细节,才能专心做事,才能高效做事。

微软有个白痴,告诉我们写驱动时要用C而不是C++。于是我们看到网上所有的驱动例子,公开源码的驱动项目,都是点C文件名而不是点CPP。其实,编译成OBJ后,那还能分得清原来是C还是CPP?用C写驱动,意味着所有的变量都必须在函数前定义不能随用随定义,意味着你不能用class类来划分模块,于是所有的函数都是全局的。一旦工程变大,大量不分类的全局函数全局变量将变成一团糟。

记住,写驱动一定要用C++!不过在DriverEntry前面加个 extern "C"。如果你要用new和delete的话,就手动实现这两个函数。如果要有全局类需要初始化,就写一个做这件事的函数,在DriverEntry调用一下。

这几天,我在学习并行运算方面的东西。我们知道,现在电脑都是多核的。如果用CreateThread创建多个线程,它们就可能在不同的CPU并行运行,提高效率。理解了这个道理,实现起来却并不简单。你要知道电脑是几核的。如果只有两核,你创建过多的线程并不能提高效率。你要知道一个线程是不是跑完了再去运行下一个线程。你要把并行的内容放到线程函数中才能CreateThread。总之,把一个for循环改为并行的for,需要很大的工作量。这时候,我们应该明白,C++已经不够用了。现在我知道,Intel Cilk Plus对C++做了一个扩展,增加了一个 parallel_for 关键字,就完美实现了循环的并行化。这就是找到了合适的工具。

工具,只是工具。它是帮你完成任务用的。你不要对工具有所偏爱。说我就喜欢C++,我就喜欢汇编,这是错的。

总结。如果你什么时候发现,做一件事很麻烦,需要考虑很多细节,那很可能该换一个工具了。

说开了去。反过来说。你考虑的是什么样的细节,也决定了你的层次。如果你考虑的是一行行的代码,那你是程序员。如果你考虑的是一个个模块,不同的模块之间如何联系,不同的模块交给不同的人做,那你是项目主管。如果你要考虑的是,公司要不要做这个项目,或一个项目完成哪些功能,那你是公司领导。

京沪高铁贯通了。在这个项目中,必然有一个人说,我们应该有一条北京到上海的高铁。必须有一些人,要研究这高铁要通过哪些城市,要研究是建苏州北站还是苏州南站。也必须有一些人,去征地,去建设,去拧上每一个螺钉。不同层次的人,要考虑的细节不同。不可越级。

有一首歌唱,有一个老人在地图上画了一个圈。。。于是有了今天的深圳。你今天在深圳工作,都是因为这个圈。让我们每个人都努力拼搏,争取上位,做那个画圈的人。