2007年12月29日星期六

英语学习资源整理

未经测试,不保证所有链接可用。
1. http://www.chinadaily.com.cn/language_tips/index.html chinadaily--language tips
2. http://broadcast.yahoo.com/ 雅虎广播站,多个频道。
6.http://www.52en.com/tl/(英语听力特区)
7.http://www.putclub.com/(普特英语听力)8.http://www.51test.net/yyky/(无忧考网口语频道)
12.http://www.51test.net/yytl/(无忧考网听力频道)10.http://www.iselong.com/English/c/16index.htm(万千英语族)
11.http://www.pass-e.com/sort.php?sortid=8(真题网)15.http://www.meno.com.cn/view/bbs.html(美诺学习网)

english-at-home http://www.english-at-home.com/
主题:是一个全方位的学英语作为第二语言的网站
功能:聊天室,语法讲解,练习,小测试,成语讲解
特色:特别深入地介绍了语法,听力,沟通技巧等
对象:esl教师和学英语人士

english, baby! http://www.englishbaby.com/
主题:是一个年轻人学习交流的美国英语网站
功能:每天不同的网上课程,以美国流行文化为主题
特色:可以学到很多美国俚语和方言
对象:面向年轻人

englishclub.net http://www.englishclub.net/
主题:丰富齐全的商业性英文网站
功能:语法讲解,练习,参考资料,教师材料
对象:esl教师和学英语人士

englishpage http://www.englishpage.com/index.html
主题:针对英文基础较好的学习人士和教师的网站
功能:阅读,游戏。语法讲解,讨论等
特色:深入讲解了时态用法,每周有新课程推出,旧课程可以在存档中找到
对象:esl教师和学英语人士

esl partyland http://www.eslpartyland.com/default.htm
主题:自学和互相交流
功能:75个互动式测试和15个论坛,让学生互相交流,教师可以下载课程材料
特色:互动式
对象:esl教师和学英语人士

to learn english.com http://www.tolearnenglish.com/
主题:内容广泛,资源丰富,值得一看
功能:聊天室,语法讲解,练习,小测试,图片,论坛
特色:做完练习可以得到评语,老师可以在线制作试题
对象:esl教师和学英语人士

longman english language teaching
http://www.longman-elt.com/index.html
主题:为中国朋友所熟知的朗曼英语教学方法
功能:测试,专题文章,链接,小窍门
对象:esl教师和学英语人士

schmooze university http://schmooze.hunter.cuny.edu/
主题:英语学习个网站,可以一对一或分小组进行对话
功能:在线字典,语言游戏,usenet
对象:学英语人士

2、汉英、英汉、英英、汉汉词典:
http://www.m-w.com/ 韦氏大词典,英英,韦氏字典家族尽览。http://www.thesaurus.com/
http://www.dictionary.com/ 综合词典,同义词/反义词,分类,英英。

3、百科辞典
http://www.bartleby.com/reference/ 美国最大的免费在线参考网站。下有columbia encyclopedia, roget's thesauri, american heritage dictionary, columbia history of english and american literature等众多参考词典。更新快,内容丰富。英文。
http://www.encycolpedia.com/ 在线简明哥伦比亚百科全书,有5万多词条。英文。
http://www.ask.com/ 最常用的提问网站,可以通过查询分类查找问题答案,也可上帖提问。

4、翻译
http://www.bilinguist.com/ 汉英论坛,高手云集,可上贴提问,回答率高。
http://www.chinatranslate.net/ 中国翻译网,号称全国最大的翻译专业网站。知识全面,但更新较慢。
http://www.cn-trans.com/ 译者俱乐部,个人网站,其精选短文与翻译论坛尚可。更新慢。

5、语法、阅读、教学、写作
http://www.edufind.com/english/grammar/subidx.cfm 英文在线教学网站的语法部分,120条。
http://www.englishchina.com/ 英语中国,有丰富的站点链接,更新较慢。
http://webster.commnet.edu/writing/writing.htm 英文写作助手。多种国外资源链接。

6、社区、听力、口语、演讲
http://www.crazyenglish.org/ 疯狂英语俱乐部。英语学习方法、教程、各种最新资料。
http://www.hongen.com/eng/index.htm 洪恩在线。英语学习社区。外教讲座。
http://edu.china.com/zh_cn/elearn/second/test/index.html 提高英语听力的方法。
http://www.listeningexpress.com/ 部分voa、bbc、nce的听力材料。
http://www.un.org/av/
联合国广播,需待网况良好时使用。
http://www.historychannel.com/speeches/ 美国历史频道演说集,需要realplayer。
http://www.americanrhetoric.com/speechbank.htm 强大的名人演说集(文本+录音)。可搜索。
http://library.westmont.edu/英文公共演讲练习资源。
http://www.listeningexpress.com/ 英语听力特快

7. 综合类
http://www.360abc.com/ 世博英语
http://www.icansay.com/ 英文锁定, 精彩我来说
http://www.englishww.com/ 旺旺英语

8. 英语考试
寄托天下 http://www.gter.net/
太傻 http://www.taisha.org/
免费学习gre的好网站(e) http://www.number2.com/
testmagic.com(e) http://www.testmagic.com/

Podcast:
* 播客凯恩的EnglishPod: http://www.englishpod.com/
* English Through Stories: http://www.englishthroughstories.com/ :听故事学英语。播客也是Jeff McQuillan教授。
* BBC learning English :http://www.bbc.co.uk/worldservice/learningenglish/radio/specials/1728_uptodate/index.shtml :世界著名语言学家David Crystal教授做的关于英语新词的节目。虽然没有RSS,但是可以下载文字。BBC的东西,精品。
* The Word Nerds :http://www.thewordnerds.org/ :一家很专业的关注语言、词汇的Podcast网站。适合英语水平较高的听众。
* The Daily Idiom :http://www.englishcaster.com/idioms 介绍英语俚语、惯用语的英语学习网站。
* Flo-Joe:http://www.splendid-learning.co.uk/podcast 英国一家针对Cambridge First Certificate in English (FCE), Certificate in Advanced English (CAE) 以及 Certificate of Proficiency in English (CPE)应试的网站。英国口音。
美国有不少大学已经把教授的讲座制作成Podcast了,要听这些讲座,这里是一份列表: List of Academic Lecture Podcasts :http://productivity.strategy-blogs.com/2005/10/list_of_academi.html
* 知行播客李钳昌的英语随身学 http://go.afterclass.cn/
*Today’s Podcast http://todayspodcast.com/ 一日一词
*Just Vocabulary http://justvocabulary.libsyn.com/
*http://www.insuns.com/podcast/

2007年12月11日星期二

比尔·盖茨在哈佛大学毕业典礼上的演讲发信(zz)

看了“一个36 岁RD 工程师的心声”,有点感慨。关于这个行业的讨论已经很多很多了,从光明到黑暗都有。看到下面一篇文章,才发现自己的眼界是多么狭小,心中感觉一时表达不清,有点激昂的东西在回荡。

  比尔·盖茨在哈佛大学毕业典礼上的演讲
  2007年6月7日
  阮一峰 译
  President Bok, former President Rudenstine, incoming President Faust, members of the Harvard Corporation and the Board of Overseers, members of the faculty, parents, and especially, the graduates:
  尊敬的Bok校长,Rudenstine前校长,即将上任的Faust校长,哈佛集团的各位成员,监管理事会的各位理事,各位老师,各位家长,各位同学:
  I've been waiting more than 30 years to say this: "Dad, I always told you I'd come back and get my degree."
  有一句话我等了三十年,现在终于可以说了:"老爸,我总是跟你说,我会回来拿到我的学位的!"
  I want to thank Harvard for this timely honor. I'll be changing my job next year … and it will be nice to finally have a college degree on my resume.
  我要感谢哈佛大学在这个时候给我这个荣誉。明年,我就要换工作了(注:指从微软公司退休)……我终于可以在简历上写我有一个本科学位,这真是不错啊。
  I applaud the graduates today for taking a much more direct route to your degrees. For my part, I'm just happy that the Crimson has called me "Harvard's most successful dropout." I guess that makes me valedictorian of my own special class … I did the best of everyone who failed.
  我为今天在座的各位同学感到高兴,你们拿到学位可比我简单多了。哈佛的校报称我是"哈佛大学历史上最成功的辍学生"。我想这大概使我有资格代表我这一类学生发言……在所有的失败者里,我做得最好。
  But I also want to be recognized as the guy who got Steve Ballmer to drop out of business school. I'm a bad influence. That's why I was invited to speak at your graduation. If I had spoken at your orientation, fewer of you might be here today.
  但是,我还要提醒大家,我使得Steve Ballmer(注:微软总经理)也从哈佛商学院退学了。因此,我是个有着恶劣影响力的人。这就是为什么我被邀请来在你们的毕业典礼上演讲。如果我在你们入学欢迎仪式上演讲,那么能够坚持到今天在这里毕业的人也许会少得多吧。
  Harvard was just a phenomenal experience for me. Academic life was fascinating. I used to sit in on lots of classes I hadn't even signed up for. And dorm life was terrific. I lived up at Radcliffe, in Currier House. There were always lots of people in my dorm room late at night discussing things, because everyone knew I didn't worry about getting up in the morning. That's how I came to be the leader of the anti-social group. We clung to each other as a way of validating our rejection of all those social people.
  对我来说,哈佛的求学经历是一段非凡的经历。校园生活很有趣,我常去旁听我没选修的课。哈佛的课外生活也很棒,我在Radcliffe过着逍遥自在的日子。每天我的寝室里总有很多人一直待到半夜,讨论着各种事情。因为每个人都知道我从不考虑第二天早起。这使得我变成了校园里那些不安分学生的头头,我们互相粘在一起,做出一种拒绝所有正常学生的姿态。
  Radcliffe was a great place to live. There were more women up there, and most of the guys were science-math types. That combination offered me the best odds, if you know what I mean. This is where I learned the sad lesson that improving your odds doesn't guarantee success.
  Radcliffe是个过日子的好地方。那里的女生比男生多,而且大多数男生都是理工科的。这种状况为我创造了最好的机会,如果你们明白我的意思。可惜的是,我正是在这里学到了人生中悲伤的一课:机会大,并不等于你就会成功。
  One of my biggest memories of Harvard came in January 1975, when I made a call from Currier House to a company in Albuquerque that had begun making the world's first personal computers. I offered to sell them software.
  我在哈佛最难忘的回忆之一,发生在1975年1月。那时,我从宿舍楼里给位于Albuquerque的一家公司打了一个电话,那家公司已经在着手制造世界上第一台个人电脑。我提出想向他们出售软件。
  I worried that they would realize I was just a student in a dorm and hang up on me. Instead they said: "We're not quite ready, come see us in a month," which was a good thing, because we hadn't written the software yet. From that moment, I worked day and night on this little extra credit project that marked the end of my college education and the beginning of a remarkable journey with Microsoft.
  我很担心,他们会发觉我是一个住在宿舍的学生,从而挂断电话。但是他们却说:"我们还没准备好,一个月后你再来找我们吧。"这是个好消息,因为那时软件还根本没有写出来呢。就是从那个时候起,我日以继夜地在这个小小的课外项目上工作,这导致了我学生生活的结束,以及通往微软公司的不平凡的旅程的开始。
  What I remember above all about Harvard was being in the midst of so much energy and intelligence. It could be exhilarating, intimidating, sometimes even discouraging, but always challenging. It was an amazing privilege – and though I left early, I was transformed by my years at Harvard, the friendships I made, and the ideas I worked on.
  不管怎样,我对哈佛的回忆主要都与充沛的精力和智力活动有关。哈佛的生活令人愉快,也令人感到有压力,有时甚至会感到泄气,但永远充满了挑战性。生活在哈佛是一种吸引人的特殊待遇……虽然我离开得比较早,但是我在这里的经历、在这里结识的朋友、在这里发展起来的一些想法,永远地改变了我。
  But taking a serious look back … I do have one big regret.
  但是,如果现在严肃地回忆起来,我确实有一个真正的遗憾。
  I left Harvard with no real awareness of the awful inequities in the world – the appalling disparities of health, and wealth, and opportunity that condemn millions of people to lives of despair.
  我离开哈佛的时候,根本没有意识到这个世界是多么的不平等。人类在健康、财富和机遇上的不平等大得可怕,它们使得无数的人们被迫生活在绝望之中。
  I learned a lot here at Harvard about new ideas in economics and politics. I got great exposure to the advances being made in the sciences.
  我在哈佛学到了很多经济学和政治学的新思想。我也了解了很多科学上的新进展。
  But humanity's greatest advances are not in its discoveries – but in how those discoveries are applied to reduce inequity. Whether through democracy, strong public education, quality health care, or broad economic opportunity – reducing inequity is the highest human achievement.
  但是,人类最大的进步并不来自于这些发现,而是来自于那些有助于减少人类不平等的发现。不管通过何种手段——民主制度、健全的公共教育体系、高质量的医疗保健、还是广泛的经济机会——减少不平等始终是人类最大的成就。
  I left campus knowing little about the millions of young people cheated out of educational opportunities here in this country. And I knew nothing about the millions of people living in unspeakable poverty and disease in developing countries.
  我离开校园的时候,根本不知道在这个国家里,有几百万的年轻人无法获得接受教育的机会。我也不知道,发展中国家里有无数的人们生活在无法形容的贫穷和疾病之中。
  It took me decades to find out.
  我花了几十年才明白了这些事情。
  You graduates came to Harvard at a different time. You know more about the world's inequities than the classes that came before. In your years here, I hope you've had a chance to think about how – in this age of accelerating technology – we can finally take on these inequities, and we can solve them.
  在座的各位同学,你们是在与我不同的时代来到哈佛的。你们比以前的学生,更多地了解世界是怎样的不平等。在你们的哈佛求学过程中,我希望你们已经思考过一个问题,那就是在这个新技术加速发展的时代,我们怎样最终应对这种不平等,以及我们怎样来解决这个问题。
  Imagine, just for the sake of discussion, that you had a few hours a week and a few dollars a month to donate to a cause – and you wanted to spend that time and money where it would have the greatest impact in saving and improving lives. Where would you spend it?
  为了讨论的方便,请想象一下,假如你每个星期可以捐献一些时间、每个月可以捐献一些钱——你希望这些时间和金钱,可以用到对拯救生命和改善人类生活有最大作用的地方。你会选择什么地方?
  For Melinda and for me, the challenge is the same: how can we do the most good for the greatest number with the resources we have.
  对Melinda(注:盖茨的妻子)和我来说,这也是我们面临的问题:我们如何能将我们拥有的资源发挥出最大的作用。
  During our discussions on this question, Melinda and I read an article about the millions of children who were dying every year in poor countries from diseases that we had long ago made harmless in this country. Measles, malaria, pneumonia, hepatitis B, yellow fever. One disease I had never even heard of, rotavirus, was killing half a million kids each year – none of them in the United States.
  在讨论过程中,Melinda和我读到了一篇文章,里面说在那些贫穷的国家,每年有数百万的儿童死于那些在美国早已不成问题的疾病。麻疹、疟疾、肺炎、乙型肝炎、黄热病、还有一种以前我从未听说过的轮状病毒,这些疾病每年导致50万儿童死亡,但是在美国一例死亡病例也没有。
  We were shocked. We had just assumed that if millions of children were dying and they could be saved, the world would make it a priority to discover and deliver the medicines to save them. But it did not. For under a dollar, there were interventions that could save lives that just weren't being delivered.
  我们被震惊了。我们想,如果几百万儿童正在死亡线上挣扎,而且他们是可以被挽救的,那么世界理应将用药物拯救他们作为头等大事。但是事实并非如此。那些价格还不到一美元的救命的药剂,并没有送到他们的手中。
  If you believe that every life has equal value, it's revolting to learn that some lives are seen as worth saving and others are not. We said to ourselves: "This can't be true. But if it is true, it deserves to be the priority of our giving."
  如果你相信每个生命都是平等的,那么当你发现某些生命被挽救了,而另一些生命被放弃了,你会感到无法接受。我们对自己说:"事情不可能如此。如果这是真的,那么它理应是我们努力的头等大事。"
  So we began our work in the same way anyone here would begin it. We asked: "How could the world let these children die?"
  所以,我们用任何人都会想到的方式开始工作。我们问:"这个世界怎么可以眼睁睁看着这些孩子死去?"
  The answer is simple, and harsh. The market did not reward saving the lives of these children, and governments did not subsidize it. So the children died because their mothers and their fathers had no power in the market and no voice in the system.
  答案很简单,也很令人难堪。在市场经济中,拯救儿童是一项没有利润的工作,政府也不会提供补助。这些儿童之所以会死亡,是因为他们的父母在经济上没有实力,在政治上没有能力发出声音。
  But you and I have both.
  但是,你们和我在经济上有实力,在政治上能够发出声音。
  We can make market forces work better for the poor if we can develop a more creative capitalism – if we can stretch the reach of market forces so that more people can make a profit, or at least make a living, serving people who are suffering from the worst inequities. We also can press governments around the world to spend taxpayer money in ways that better reflect the values of the people who pay the taxes.
  我们可以让市场更好地为穷人服务,如果我们能够设计出一种更有创新性的资本主义制度——如果我们可以改变市场,让更多的人可以获得利润,或者至少可以维持生活——那么,这就可以帮到那些正在极端不平等的状况中受苦的人们。我们还可以向全世界的政府施压,要求他们将纳税人的钱,花到更符合纳税人价值观的地方。
  If we can find approaches that meet the needs of the poor in ways that generate profits for business and votes for politicians, we will have found a sustainable way to reduce inequity in the world. This task is open-ended. It can never be finished. But a conscious effort to answer this challenge will change the world.
  如果我们能够找到这样一种方法,既可以帮到穷人,又可以为商人带来利润,为政治家带来选票,那么我们就找到了一种减少世界性不平等的可持续的发展道路。这个任务是无限的。它不可能被完全完成,但是任何自觉地解决这个问题的尝试,都将会改变这个世界。
  I am optimistic that we can do this, but I talk to skeptics who claim there is no hope. They say: "Inequity has been with us since the beginning, and will be with us till the end – because people just … don't … care." I completely disagree.
  在这个问题上,我是乐观的。但是,我也遇到过那些感到绝望的怀疑主义者。他们说:"不平等从人类诞生的第一天就存在,到人类灭亡的最后一天也将存在。——因为人类对这个问题根本不在乎。"我完全不能同意这种观点。
  I believe we have more caring than we know what to do with.
  我相信,问题不是我们不在乎,而是我们不知道怎么做。
  All of us here in this Yard, at one time or another, have seen human tragedies that broke our hearts, and yet we did nothing – not because we didn't care, but because we didn't know what to do. If we had known how to help, we would have acted.
  此刻在这个院子里的所有人,生命中总有这样或那样的时刻,目睹人类的悲剧,感到万分伤心。但是我们什么也没做,并非我们无动于衷,而是因为我们不知道做什么和怎么做。如果我们知道如何做是有效的,那么我们就会采取行动。
  The barrier to change is not too little caring; it is too much complexity.
  改变世界的阻碍,并非人类的冷漠,而是世界实在太复杂。
  To turn caring into action, we need to see a problem, see a solution, and see the impact. But complexity blocks all three steps.
  为了将关心转变为行动,我们需要找到问题,发现解决办法的方法,评估后果。但是世界的复杂性使得所有这些步骤都难于做到。
  Even with the advent of the Internet and 24-hour news, it is still a complex enterprise to get people to truly see the problems. When an airplane crashes, officials immediately call a press conference. They promise to investigate, determine the cause, and prevent similar crashes in the future.
  即使有了互联网和24小时直播的新闻台,让人们真正发现问题所在,仍然十分困难。当一架飞机坠毁了,官员们会立刻召开新闻发布会,他们承诺进行调查、找到原因、防止将来再次发生类似事故。
  But if the officials were brutally honest, they would say: "Of all the people in the world who died today from preventable causes, one half of one percent of them were on this plane. We're determined to do everything possible to solve the problem that took the lives of the one half of one percent."
  但是如果那些官员敢说真话,他们就会说:"在今天这一天,全世界所有可以避免的死亡之中,只有0.5%的死者来自于这次空难。我们决心尽一切努力,调查这个0.5%的死亡原因。"
  The bigger problem is not the plane crash, but the millions of preventable deaths.
  显然,更重要的问题不是这次空难,而是其他几百万可以预防的死亡事件。
  We don't read much about these deaths. The media covers what's new – and millions of people dying is nothing new. So it stays in the background, where it's easier to ignore. But even when we do see it or read about it, it's difficult to keep our eyes on the problem. It's hard to look at suffering if the situation is so complex that we don't know how to help. And so we look away.
  我们并没有很多机会了解那些死亡事件。媒体总是报告新闻,几百万人将要死去并非新闻。如果没有人报道,那么这些事件就很容易被忽视。另一方面,即使我们确实目睹了事件本身或者看到了相关报道,我们也很难持续关注这些事件。看着他人受苦是令人痛苦的,何况问题又如此复杂,我们根本不知道如何去帮助他人。所以我们会将脸转过去。
  If we can really see a problem, which is the first step, we come to the second step: cutting through the complexity to find a solution.
  就算我们真正发现了问题所在,也不过是迈出了第一步,接着还有第二步:那就是从复杂的事件中找到解决办法。
  Finding solutions is essential if we want to make the most of our caring. If we have clear and proven answers anytime an organization or individual asks "How can I help?," then we can get action – and we can make sure that none of the caring in the world is wasted. But complexity makes it hard to mark a path of action for everyone who cares — and that makes it hard for their caring to matter.
  如果我们要让关心落到实处,我们就必须找到解决办法。如果我们有一个清晰的和可靠的答案,那么当任何组织和个人发出疑问"如何我能提供帮助"的时候,我们就能采取行动。我们就能够保证不浪费一丁点全世界人类对他人的关心。但是,世界的复杂性使得很难找到对全世界每一个有爱心的人都有效的行动方法,因此人类对他人的关心往往很难产生实际效果。
  Cutting through complexity to find a solution runs through four predictable stages: determine a goal, find the highest-leverage approach, discover the ideal technology for that approach, and in the meantime, make the smartest application of the technology that you already have — whether it's something sophisticated, like a drug, or something simpler, like a bednet.
  从这个复杂的世界中找到解决办法,可以分为四个步骤:确定目标,找到最高效的方法,发现适用于这个方法的新技术,同时最聪明地利用现有的技术,不管它是复杂的药物,还是最简单的蚊帐。
  The AIDS epidemic offers an example. The broad goal, of course, is to end the disease. The highest-leverage approach is prevention. The ideal technology would be a vaccine that gives lifetime immunity with a single dose. So governments, drug companies, and foundations fund vaccine research. But their work is likely to take more than a decade, so in the meantime, we have to work with what we have in hand – and the best prevention approach we have now is getting people to avoid risky behavior.
  艾滋病就是一个例子。总的目标,毫无疑问是消灭这种疾病。最高效的方法是预防。最理想的技术是发明一种疫苗,只要注射一次,就可以终生免疫。所以,政府、制药公司、基金会应该资助疫苗研究。但是,这样研究工作很可能十年之内都无法完成。因此,与此同时,我们必须使用现有的技术,目前最有效的预防方法就是设法让人们避免那些危险的行为。
  Pursuing that goal starts the four-step cycle again. This is the pattern. The crucial thing is to never stop thinking and working – and never do what we did with malaria and tuberculosis in the 20th century – which is to surrender to complexity and quit.
  要实现这个新的目标,又可以采用新的四步循环。这是一种模式。关键的东西是永远不要停止思考和行动。我们千万不能再犯上个世纪在疟疾和肺结核上犯过的错误,那时我们因为它们太复杂,而放弃了采取行动。
  The final step – after seeing the problem and finding an approach – is to measure the impact of your work and share your successes and failures so that others learn from your efforts.
  在发现问题和找到解决方法之后,就是最后一步——评估工作结果,将你的成功经验或者失败经验传播出去,这样其他人就可以从你的努力中有所收获。
  You have to have the statistics, of course. You have to be able to show that a program is vaccinating millions more children. You have to be able to show a decline in the number of children dying from these diseases. This is essential not just to improve the program, but also to help draw more investment from business and government.
  当然,你必须有一些统计数字。你必须让他人知道,你的项目为几百万儿童新接种了疫苗。你也必须让他人知道,儿童死亡人数下降了多少。这些都是很关键的,不仅有利于改善项目效果,也有利于从商界和政府得到更多的帮助。
  But if you want to inspire people to participate, you have to show more than numbers; you have to convey the human impact of the work – so people can feel what saving a life means to the families affected.
  但是,这些还不够,如果你想激励其他人参加你的项目,你就必须拿出更多的统计数字;你必须展示你的项目的人性因素,这样其他人就会感到拯救一个生命,对那些处在困境中的家庭到底意味着什么。
  I remember going to Davos some years back and sitting on a global health panel that was discussing ways to save millions of lives. Millions! Think of the thrill of saving just one person's life – then multiply that by millions. … Yet this was the most boring panel I've ever been on – ever. So boring even I couldn't bear it.
  几年前,我去瑞士达沃斯旁听一个全球健康问题论坛,会议的内容有关于如何拯救几百万条生命。天哪,是几百万!想一想吧,拯救一个人的生命已经让人何等激动,现在你要把这种激动再乘上几百万倍……但是,不幸的是,这是我参加过的最最乏味的论坛,乏味到我无法强迫自己听下去。
  What made that experience especially striking was that I had just come from an event where we were introducing version 13 of some piece of software, and we had people jumping and shouting with excitement. I love getting people excited about software – but why can't we generate even more excitement for saving lives?
  那次经历之所以让我难忘,是因为之前我们刚刚发布了一个软件的第13个版本,我们让观众激动得跳了起来,喊出了声。我喜欢人们因为软件而感到激动,那么我们为什么不能够让人们因为能够拯救生命而感到更加激动呢?
  You can't get people excited unless you can help them see and feel the impact. And how you do that – is a complex question.
  除非你能够让人们看到或者感受到行动的影响力,否则你无法让人们激动。如何做到这一点,并不是一件简单的事。
  Still, I'm optimistic. Yes, inequity has been with us forever, but the new tools we have to cut through complexity have not been with us forever. They are new – they can help us make the most of our caring – and that's why the future can be different from the past.
  同前面一样,在这个问题上,我依然是乐观的。不错,人类的不平等有史以来一直存在,但是那些能够化繁为简的新工具,却是最近才出现的。这些新工具可以帮助我们,将人类的同情心发挥最大的作用,这就是为什么将来同过去是不一样的。
  The defining and ongoing innovations of this age – biotechnology, the computer, the Internet – give us a chance we've never had before to end extreme poverty and end death from preventable disease.
  这个时代无时无刻不在涌现出新的革新——生物技术,计算机,互联网——它们给了我们一个从未有过的机会,去终结那些极端的贫穷和非恶性疾病的死亡。
  Sixty years ago, George Marshall came to this commencement and announced a plan to assist the nations of post-war Europe. He said: "I think one difficulty is that the problem is one of such enormous complexity that the very mass of facts presented to the public by press and radio make it exceedingly difficult for the man in the street to reach a clear appraisement of the situation. It is virtually impossible at this distance to grasp at all the real significance of the situation."
  六十年前,乔治·马歇尔也是在这个地方的毕业典礼上,宣布了一个计划,帮助那些欧洲国家的战后建设。他说:"我认为,困难的一点是这个问题太复杂,报纸和电台向公众源源不断地提供各种事实,使得大街上的普通人极端难于清晰地判断形势。事实上,经过层层传播,想要真正地把握形势,是根本不可能的。"
  Thirty years after Marshall made his address, as my class graduated without me, technology was emerging that would make the world smaller, more open, more visible, less distant.
  马歇尔发表这个演讲之后的三十年,我那一届学生毕业,当然我不在其中。那时,新技术刚刚开始萌芽,它们将使得这个世界变得更小、更开放、更容易看到、距离更近。
  The emergence of low-cost personal computers gave rise to a powerful network that has transformed opportunities for learning and communicating.
  低成本的个人电脑的出现,使得一个强大的互联网有机会诞生,它为学习和交流提供了巨大的机会。
  The magical thing about this network is not just that it collapses distance and makes everyone your neighbor. It also dramatically increases the number of brilliant minds we can have working together on the same problem – and that scales up the rate of innovation to a staggering degree.
  网络的神奇之处,不仅仅是它缩短了物理距离,使得天涯若比邻。它还极大地增加了怀有共同想法的人们聚集在一起的机会,我们可以为了解决同一个问题,一起共同工作。这就大大加快了革新的进程,发展速度简直快得让人震惊。
  At the same time, for every person in the world who has access to this technology, five people don't. That means many creative minds are left out of this discussion -- smart people with practical intelligence and relevant experience who don't have the technology to hone their talents or contribute their ideas to the world.
  与此同时,世界上有条件上网的人,只是全部人口的六分之一。这意味着,还有许多具有创造性的人们,没有加入到我们的讨论中来。那些有着实际的操作经验和相关经历的聪明人,却没有技术来帮助他们,将他们的天赋或者想法与全世界分享。
  We need as many people as possible to have access to this technology, because these advances are triggering a revolution in what human beings can do for one another. They are making it possible not just for national governments, but for universities, corporations, smaller organizations, and even individuals to see problems, see approaches, and measure the impact of their efforts to address the hunger, poverty, and desperation George Marshall spoke of 60 years ago.
  我们需要尽可能地让更多的人有机会使用新技术,因为这些新技术正在引发一场革命,人类将因此可以互相帮助。新技术正在创造一种可能,不仅是政府,还包括大学、公司、小机构、甚至个人,能够发现问题所在、能够找到解决办法、能够评估他们努力的效果,去改变那些马歇尔六十年前就说到过的问题——饥饿、贫穷和绝望。
  Members of the Harvard Family: Here in the Yard is one of the great collections of intellectual talent in the world.
  哈佛是一个大家庭。这个院子里在场的人们,是全世界最有智力的人类群体之一。
  What for?
  我们可以做些什么?
  There is no question that the faculty, the alumni, the students, and the benefactors of Harvard have used their power to improve the lives of people here and around the world. But can we do more? Can Harvard dedicate its intellect to improving the lives of people who will never even hear its name?
  毫无疑问,哈佛的老师、校友、学生和资助者,已经用他们的能力改善了全世界各地人们的生活。但是,我们还能够再做什么呢?有没有可能,哈佛的人们可以将他们的智慧,用来帮助那些甚至从来没有听到过"哈佛"这个名字的人?
  Let me make a request of the deans and the professors – the intellectual leaders here at Harvard: As you hire new faculty, award tenure, review curriculum, and determine degree requirements, please ask yourselves:
  请允许我向各位院长和教授,提出一个请求——你们是哈佛的智力领袖,当你们雇用新的老师、授予终身教职、评估课程、决定学位颁发标准的时候,请问你们自己如下的问题:
  Should our best minds be dedicated to solving our biggest problems?
  我们最优秀的人才是否在致力于解决我们最大的问题?
  Should Harvard encourage its faculty to take on the world's worst inequities? Should Harvard students learn about the depth of global poverty … the prevalence of world hunger … the scarcity of clean water …the girls kept out of school … the children who die from diseases we can cure?
  哈佛是否鼓励她的老师去研究解决世界上最严重的不平等?哈佛的学生是否从全球那些极端的贫穷中学到了什么……世界性的饥荒……清洁的水资源的缺乏……无法上学的女童……死于非恶性疾病的儿童……哈佛的学生有没有从中学到东西?
  Should the world's most privileged people learn about the lives of the world's least privileged?
  那些世界上过着最优越生活的人们,有没有从那些最困难的人们身上学到东西?
  These are not rhetorical questions – you will answer with your policies.
  这些问题并非语言上的修辞。你必须用自己的行动来回答它们。
  My mother, who was filled with pride the day I was admitted here – never stopped pressing me to do more for others. A few days before my wedding, she hosted a bridal event, at which she read aloud a letter about marriage that she had written to Melinda. My mother was very ill with cancer at the time, but she saw one more opportunity to deliver her message, and at the close of the letter she said: "From those to whom much is given, much is expected."
  我的母亲在我被哈佛大学录取的那一天,曾经感到非常骄傲。她从没有停止督促我,去为他人做更多的事情。在我结婚的前几天,她主持了一个新娘进我家的仪式。在这个仪式上,她高声朗读了一封关于婚姻的信,这是她写给Melinda的。那时,我的母亲已经因为癌症病入膏肓,但是她还是认为这是又一个传播她的信念的机会。在那封信的结尾,她写道:"对于那些接受了许多帮助的人们,对他们的期待也更多。"
  When you consider what those of us here in this Yard have been given – in talent, privilege, and opportunity – there is almost no limit to what the world has a right to expect from us.
  想一想吧,我们在这个院子里的这些人,被给予过什么——天赋、特权、机遇——那么可以这样说,全世界的人们几乎有无限的权利,期待我们做出贡献。
  In line with the promise of this age, I want to exhort each of the graduates here to take on an issue – a complex problem, a deep inequity, and become a specialist on it. If you make it the focus of your career, that would be phenomenal. But you don't have to do that to make an impact. For a few hours every week, you can use the growing power of the Internet to get informed, find others with the same interests, see the barriers, and find ways to cut through them.
  同这个时代的期望一样,我也要向今天各位毕业的同学提出一个忠告:你们要选择一个问题,一个复杂的问题,一个有关于人类深刻的不平等的问题,然后你们要变成这个问题的专家。如果你们能够使得这个问题成为你们职业的核心,那么你们就会非常杰出。但是,你们不必一定要去做那些大事。每个星期只用几个小时,你就可以通过互联网得到信息,找到志同道合的朋友,发现困难所在,找到解决它们的途径。
  Don't let complexity stop you. Be activists. Take on the big inequities. It will be one of the great experiences of your lives.
  不要让这个世界的复杂性阻碍你前进。要成为一个行动主义者。将解决人类的不平等视为己任。它将成为你生命中最重要的经历之一。
  You graduates are coming of age in an amazing time. As you leave Harvard, you have technology that members of my class never had. You have awareness of global inequity, which we did not have. And with that awareness, you likely also have an informed conscience that will torment you if you abandon these people whose lives you could change with very little effort. You have more than we had; you must start sooner, and carry on longer.
  在座的各位毕业的同学,你们所处的时代是一个神奇的时代。当你们离开哈佛的时候,你们拥有的技术,是我们那一届学生所没有的。你们已经了解到了世界上的不平等,我们那时还不知道这些。有了这样的了解之后,要是你再弃那些你可以帮助的人们于不顾,就将受到良心的谴责,只需一点小小的努力,你就可以改变那些人们的生活。你们比我们拥有更大的能力;你们必须尽早开始,尽可能长时期坚持下去。
  Knowing what you know, how could you not?
  知道了你们所知道的一切,你们怎么可能不采取行动呢?
  And I hope you will come back here to Harvard 30 years from now and reflect on what you have done with your talent and your energy. I hope you will judge yourselves not on your professional accomplishments alone, but also on how well you have addressed the world's deepest inequities … on how well you treated people a world away who have nothing in common with you but their humanity.
  我希望,30年后你们还会再回到哈佛,想起你们用自己的天赋和能力所做出的一切。我希望,在那个时候,你们用来评价自己的标准,不仅仅是你们的专业成就,而包括你们为改变这个世界深刻的不平等所做出的努力,以及你们如何善待那些远隔千山万水、与你们毫不涉及的人们,你们与他们唯一的共同点就是同为人类。
  Good luck.
  最后,祝各位同学好运。

附:比尔.盖茨的11条准则
Bill Gates" 11 Rules 比尔.盖茨的11条准则   
In Bill Gates" Book for high school and college graduates, there is a list of 11 things they did not learn in school. In his book, Bill Gates talks about how feelgood, politically-correct teachings created a full generation of kids with no concept of reality and how this education set them up for failure in the real world.
在比尔·盖茨写给高中毕业生和大学毕业生的书里,有一个单子上面列有11项学生没能在学校里学到的事情。比尔·盖茨在书中谈到让你感觉良好的"政治上正确"的教导培养出一整代不知现实为何物的年轻人,这种教育只能导致他们成为现实世界中的失败者。
The 11 things are:
这11项事情是:
1. Life is not fair, get used to it.
1. 生活是不公平的;要去适应它。
2. The world won"t care about your selfesteem. The world will expect you to accomplish something before you feel good about yourself. 2.这世界并不会在意你的自尊。这世界指望你在自我感觉良好之前先要有所成就。
3. You will not make 40 thousand dollars a year right out of high school. You won"t be a vice president with a car phone, until you earn both.
3.高中刚毕业你不会一年挣4万美元。你不会成为一个公司的副总裁,并拥有一部装有电话的汽车,直到你将此职位和汽车电话都挣到手。
4. If you think your teacher is tough, wait till you get a boss. He doesn"t have tenure.
4.如果你认为你的老师严厉,等你有了老板再这样想。老板可是没有任期限制的。
5. Flipping burgers is not beneath your dignity. Your grandparents had a different word for burger flipping; they called it opportunity.
5.烙牛肉饼并不有损你的尊严。你的祖父母对烙牛肉饼可有不同的定义;他们称它为机遇。
6. If you mess up, it"s not your parents" fault, so don"t whine about our mistakes, learn from them.
6.如果你陷入困境,那不是你父母的过错,所以不要尖声抱怨我们的错误,要从中吸取教训。
7. Before you were born, your parents weren"t as boring as they are now. They got that way from paying your bills, cleaning your clothes and listening to you talk about how cool you are. So before you save the rain forest from the parasites of your parents" generation, try "delousing" the closet in your own room.
7.在你出生之前,你的父母并非像他们现在这样乏味。他们变成今天这个样子是因为这些年来他们一直在为你付账单,给你洗衣服,听你大谈你是如何的酷。所以,如果你想消灭你父母那一辈中的"寄生虫"来拯救雨林的话,还是先去清除你房间衣柜里的虫子吧。
8. Your school may have done away with winners and losers, but life has not. In some schools they have abolished failing grades; they"ll give you as many times as you want to get the right answer. This doesn"t bear the slightest resemblance to anything in real life.
8.你的学校也许已经不再分优等生和劣等生,但生活却仍在作出类似区分。在某些学校已经废除不及格分;只要你想找到正确答案,学校就会给你无数的机会。这和现实生活中的任何事情没有一点相似之处。
9. Life is not divided into semesters. You don"t get summers off and very few employers are interested in helping you find yourself. Do that on your own time.
9.生活不分学期。你并没有暑假可以休息,也没有几位雇主乐于帮你发现自我。自己找时间做吧。
10. Television is NOT real life. In real life people actually have to leave the coffee shop and go to jobs.
10.电视并不是真实的生活。在现实生活中,人们实际上得离开咖啡屋去干自己的工作。
11. Be nice to nerds. Chances are you"ll end up working for one. 11.善待乏味的人。有可能到头来你会为一个乏味的人工作。

2007年11月29日星期四

去滑雪(Nanshan ski)

今天组织去南山滑雪,这两天天气晴朗的一塌糊涂,所以都是人工造雪。中午在山上吃了一顿黑心饭,到下午发现雪都被晒化了,被那么多人一压,都快成冰了。非常难以控制速度。
最大的感受就是:人真多。上一次坡顶要排长队,到了顶上哧溜一下就下来了,然后就是再一次漫长的等待。


人工造雪

一半是雪,一半是草

游人如织

排长龙

都化成冰了

2007年11月28日星期三

生成等值面(Marching Cube)

看看文件的日期,最初的开始是21日,到现在又是一周了,才有了个初步的版本。
上周布置了一个活,让用Marching Cube算法实现在数据体中生成一个等值面的算法。听说这是上上届一位师兄毕业论文的内容,让我也照着实现一个。可后来发现找不到当初的代码了,没办法,只能自己动手。在UAF的网上课程中查到一份实现代码,接下来的工作就是看懂它然后应用到程序中来。我料到了开头,可是没有猜到过程会这么艰难。
MC算法的原理还比较简单,就是分析一个正方体体素八个顶点分别位于等值面外和内两种情况时的组合,根据这256种不同的情况生成体素内的三角形。在代码中用到了八叉树,用来保存等值面穿过的体素,为了理解这个结构,花了相当多的时间,一连几天都在研究这个算法,好不容易有点眉目了,巴巴地实现出来,结果被李博一针见血地指出每次生成的时候都要重新生成八叉树,虽然不一定每次都更新到整个树,但是考虑到其本身存储空间的开销,还是有点吃不消,真是备受打击。只好三下五除二把八叉树砍掉,原来1200多行的代码一下子砍的不到700行,其中约300行还是两个大的查找表。当初就是被这两个大表里面密密麻麻的冰冷的16进制数给吓住了。没有深入分析就去看八叉树了。后来发现其实里面的数据相当规律,就是在第一个表用01表示各个边是否被等值面截,然后到下一个表中找到相应的三角形组合方式。256种情况一一在目,要是让我自已写可能要多花几倍的功夫还不能保证穷尽所有情况。想到中科院自动化所田捷博士说的,图形学算法的特点就是容易理解,但是细节太烦琐。总结这一周的经验,对于网上下的源码的每一个部分,都应该吃透,不能留下死角,然后根据自己的实际需要,选择需要的部分,不能为了赶时间把整个块拿过来,期望它能够像一个黑盒似的工作正常。即使侥幸别人的代码写的不错,为了把其与自身代码结合所花费的改写时间也已经超出了读懂代码所要花费的时间了。

2007年11月20日星期二

需求变更(Software Change Control)

“什么东西是绿的,有两个轮子,长在房子周围?”
“……不知道,是什么?”
“草,轮子是我瞎说的。”

绕了一圈,又回到原点了。当初因为不知道将来的扩展情况,在效率和可扩展性之间选择的是后者,采用尽量独立的数据结构。随着项目的深入,原来的速度渐渐的变得不可容忍,而未来的应用范围已经可以基本上确定了,不用再考虑过多,于是又重新把过去写的数据结构去了,改成了当初那种ungraceful的写法,速度一下暴增,将来会出什么问题,还不知道,一步一步调,一点一点试吧。既然干编程这一行,就得随时做好需求变更的准备,一方面上是心态上的,对变化不要厌烦;一方面是技术上的,程序的编写要尽量灵活以利于扩充。看来有必要再好好学习一下设计模式的内容。

2007年11月18日星期日

保护眼睛(改变窗口颜色和Pdf背景颜色)

首先需要改一下设置,如果常常用电脑很容易导致眼睛过度疲劳而得干眼症,所以大夫建议电脑屏幕不要用白色,因为白色对眼睛的刺激是最大的。像我们这样整天对着电脑,也应该注意一下。其实,只要稍微设置一下,就能让你电脑上的窗口从白花花的颜色变成淡淡的绿色。

设置方法:
打开控制面板中的"显示" 选择外观(appearance)-高级(advanced), 然后在项目(items)那栏选窗口(windows),再点颜色(color)-其它(others),然后把Hue(色调设为85,Sat(饱和度)设为90,Lum(亮度)设为205。 然后单击 添加到自定义颜色(Add tocustom colors),一直确定。
把窗口设成绿色之后,再来把IE的网页背景也变成养眼的绿色吧:
打开IE,点击工具(TOOLS),点INTERNET选项(INTERNET OPTIONS),点右下角的辅助功能 (Assessibility),然后勾选 不使用网页中指定的颜色(ignore colors specifiedon web pages),然后点 确定退出。

现在你就会发现屏幕已经变成淡淡的绿色了。这个颜色会比白色柔和许多,刚开始可能你还有些不适应,但确实对我们的眼睛有好处,建议大家试一下。

PDF格式背景改变方法如下:

点击 编辑 -》首选项-》辅助工具-》选中“替换文档颜色”和“
自定义颜色”-》将背景颜色改成你想要的背景颜色。。-》

2007年11月13日星期二

为什么会出现LNK2005,LNK1169错误

许多Visual C++的使用者都碰到过LNK2005:symbol already defined和LNK1169:one or more multiply defined symbols found这样的链接错误,而且通常是在使用第三方库时遇到的。对于这个问题,有的朋友可能不知其然,而有的朋友可能知其然却不知其所以然,本文就试图为大家彻底解开关于它的种种疑惑。

大家都知道,从C/C++源程序到可执行文件要经历两个阶段:
(1)编译器将源文件编译成汇编代码,然后由汇编器(assembler)翻译成机器指令(再加上其它相关信息)后输出到一个个目标文件(object file,VC的编译器编译出的目标文件默认的后缀名是.obj)中;
(2)链接器(linker)将一个个的目标文件(或许还会有若干程序库)链接在一起生成一个完整的可执行文件。

编译器编译源文件时会把源文件的全局符号(global symbol)分成强(strong)和弱(weak)两类传给汇编器,而随后汇编器则将强弱信息编码并保存在目标文件的符号表中。那么何谓强弱呢?编译器认为函数与初始化了的全局变量都是强符号,而未初始化的全局变量则成了弱符号。比如有这么个源文件:

extern int errorno;
int buf[2] = {1,2};
int *p;
int main()
{
return 0;
}

其中main、buf是强符号,p是弱符号,而errorno则非强非弱,因为它只是个外部变量的使用声明。

有了强弱符号的概念,链接器(Unix平台)就会按如下规则(参考[1],p549~p550)处理与选择被多次定义的全局符号:

规则1: 不允许强符号被多次定义(即不同的目标文件中不能有同名的强符号);
规则2: 如果一个符号在某个目标文件中是强符号,在其它文件中都是弱符号,那么选择强符号;
规则3: 如果一个符号在所有目标文件中都是弱符号,那么选择其中任意一个;

虽然上述3条针对的是Unix平台的链接器,但据作者试验,至少VC6.0的linker也遵守这些规则。由此可知多个目标文件不能重复定义同名的函数与初始化了的全局变量,否则必然导致LNK2005和LNK1169两种链接错误。可是,有的时候我们并没有在自己的程序中发现这样的重定义现象,却也遇到了此种链接错误,这又是何解?嗯,问题稍微有点儿复杂,容我慢慢道来。

众所周知,ANSI C/C++ 定义了相当多的标准函数,而它们又分布在许多不同的目标文件中,如果直接以目标文件的形式提供给程序员使用的话,就需要他们确切地知道哪个函数存在于哪个目标文件中,并且在链接时显式地指定目标文件名才能成功地生成可执行文件,显然这是一个巨大的负担。所以C语言提供了一种将多个目标文件打包成一个文件的机制,这就是静态程序库(static library)。开发者在链接时只需指定程序库的文件名,链接器就会自动到程序库中寻找那些应用程序确实用到的目标模块,并把(且只把)它们从库中拷贝出来参与构建可执行文件。几乎所有的C/C++开发系统都会把标准函数打包成标准库提供给开发者使用(有不这么做的吗?)。

程序库为开发者带来了方便,但同时也是某些混乱的根源。我们来看看链接器(Unix平台)是如何解析(resolve)对程序库的引用的(参考[1],p556)。

在符号解析(symbol resolution)阶段,链接器按照所有目标文件和库文件出现在命令行中的顺序从左至右依次扫描它们,在此期间它要维护若干个集合:(1)集合E是将被合并到一起组成可执行文件的所有目标文件集合;(2)集合D是所有之前已被加入E的目标文件定义的符号集合;(3)集合U是未解析符号(unresolved symbols,即那些被E中目标文件引用过但在D中还不存在的符号)的集合。一开始,E、D、U都是空的。

(1): 对命令行中的每一个输入文件f,链接器确定它是目标文件还是库文件,如果它是目标文件,就把f加入到E,并把f中未解析的符号和已定义的符号分别加入到U、D集合中,然后处理下一个输入文件。
(2): 如果f是一个库文件,链接器会尝试把U中的所有未解析符号与f中各目标模块定义的符号进行匹配。如果某个目标模块m定义了一个U中的未解析符号,那么就把m加入到E中,并把m中未解析的符号和已定义的符号分别加入到U、D集合中。不断地对f中的所有目标模块重复这个过程直至到达一个不动点(fixed point),此时U和D不再变化。而那些未加入到E中的f里的目标模块就被简单地丢弃,链接器继续处理下一输入文件。
(3): 当扫描完所有输入文件时如果U非空或者有同名的符号被多次加入D,链接器报告错误信息并退出。否则,它把E中的所有目标文件合并在一起生成可执行文件。

上述规则针对的是Unix平台链接器,而VC(至少VC6.0)linker则有相当的不同: 它首先依次处理命令行中出现的所有目标文件,然后依照顺序不停地扫描所有的库文件,直至U为空或者某遍(从头到尾依次把所有的库文件扫描完称为一遍)扫描过程中U、D无任何变化时结束扫描,此刻再根据U是否为空以及是否有同名符号重复加入D来决定是出错退出还是生成可执行文件。很明显Unix链接器对输入文件在命令行中出现的顺序十分敏感,而VC的算法则可最大限度地减少文件顺序对链接的影响。作者不清楚Unix下新的开发工具是否已经改进了相应的做法,欢迎有实践经验的朋友补充这方面的信息(补充于2005年10月10日: 经试验,使用gcc 3.2.3的MinGW 3.1.0的链接器表现与参考[1]描述的一致)。

VC带的编译器是cl.exe,它有这么几个与标准程序库有关的选项: /ML、/MLd、/MT、/MTd、/MD、/MDd。这些选项告诉编译器应用程序想使用什么版本的C标准程序库。/ML(缺省选项)对应单线程静态版的标准程序库(libc.lib);/MT对应多线程静态版标准库(libcmt.lib),此时编译器会自动定义_MT宏;/MD对应多线程DLL版(导入库msvcrt.lib,DLL是msvcrt.dll),编译器自动定义_MT和_DLL两个宏。后面加d的选项都会让编译器自动多定义一个_DEBUG宏,表示要使用对应标准库的调试版,因此/MLd对应调试版单线程静态标准库(libcd.lib),/MTd对应调试版多线程静态标准库(libcmtd.lib),/MDd对应调试版多线程DLL标准库(导入库msvcrtd.lib,DLL是msvcrtd.dll)。虽然我们的确在编译时明白无误地告诉了编译器应用程序希望使用什么版本的标准库,可是当编译器干完了活,轮到链接器开工时它又如何得知一个个目标文件到底在思念谁?为了传递相思,我们的编译器就干了点秘密的勾当。在cl编译出的目标文件中会有一个专门的区域(关心这个区域到底在文件中什么地方的朋友可以参考COFF和PE文件格式)存放一些指导链接器如何工作的信息,其中有一项就叫缺省库(default library),它指定了若干个库文件名,当链接器扫描该目标文件时将按照它们在目标模块中出现的顺序处理这些库名: 如果该库在当前输入文件列表中还不存在,那么便把它加入到输入文件列表末尾,否则略过。说到这里,我们先来做个小实验。写个顶顶简单的程序,然后保存为main.c :


/* main.c */
int main() { return 0; }


用下面这个命令编译main.c(什么?你从不用命令行来编译程序?这个......) :

cl /c main.c

/c是告诉cl只编译源文件,不用链接。因为/ML是缺省选项,所以上述命令也相当于: cl /c /ML main.c 。如果没什么问题的话(要出了问题才是活见鬼!当然除非你的环境变量没有设置好,这时你应该去VC的bin目录下找到vcvars32.bat文件然后运行它。),当前目录下会出现一个main.obj文件,这就是我们可爱的目标文件。随便用一个文本编辑器打开它(是的,文本编辑器,大胆地去做别害怕),搜索"defaultlib"字符串,通常你就会看到这样的东西: "-defaultlib:LIBC -defaultlib:OLDNAMES"。啊哈,没错,这就
是保存在目标文件中的缺省库信息。我们的目标文件显然指定了两个缺省库,一个是单线程静态版标准库libc.lib(这与/ML选项相符);一个是oldnames.lib(它是为了兼容微软以前的C/C++开发系统,基本不用了,为了简化讨论可以忽略它)。另外,如果在源程序中用了

/* xxxx代表实际的库文件名 */
#pragma comment(lib,"xxxx")

编译指示命令(compiler directive)指定要链接的库,那么这个信息也会被保存到目标文件的缺省库信息项中,且位于缺省标准库之前。如果有多个这样的命令,那么对应库名在目标文件中出现的顺序与它们在源程序中出现的顺序完全一致(且都在缺省标准库之前)。

VC的链接器是link.exe,因为main.obj保存了缺省库信息,所以可以用
link main.obj libc.lib
或者
link main.obj
来生成可执行文件main.exe,这两个命令是等价的。但是如果你用
link main.obj libcd.lib
的话,链接器会给出一个警告: "warning LNK4098: defaultlib "LIBC" conflicts with use of other libs; use /NODEFAULTLIB:library",因为你显式指定的标准库版本与目标文件的缺省值不一致。通常来说,应该保证链接器合并的所有目标文件指定的缺省标准库版本一致,否则编译器一定会给出上面的警告,而LNK2005和LNK1169链接错误则有时会出现有时不会。那么这个有时到底是什么时候?呵呵,别着急,下面的一切正是为喜欢追根究底的你准备的。

建一个源文件,就叫mylib.c,内容如下:

/* mylib.c */
#include

void foo(void)
{
printf("%s","I am from mylib!\n");
}



cl /c /MLd mylib.c
命令编译,注意/MLd选项是指定libcd.lib为默认标准库。lib.exe是VC自带的用于将目标文件打包成程序库的命令,所以我们可以用
lib /OUT:my.lib mylib.obj
将mylib.obj打包成库,输出的库文件名是my.lib。接下来把main.c改成:

/* main.c */
void foo(void);

int main()
{
foo();
return 0;
}


cl /c main.c
编译,然后用
link main.obj my.lib
进行链接。这个命令能够成功地生成main.exe而不会产生LNK2005和LNK1169链接错误,你仅仅是得到了一条警告信息:"warning LNK4098: defaultlib "LIBCD" conflicts with use of other libs; use /NODEFAULTLIB:library"。我们根据前文所述的扫描规则来分析一下链接器此时做了些啥(加一个/VERBOSE选项就可以看到详尽的链接过程,但要注意,几乎所有的C编译器都会在符号前加一个下划线后再输出,所以在目标文件和链接输出信息中看到的符号名都比在源程序中见到的多出一个'_',此点不可不察。)。

一开始E、U、D都是空集。链接器首先扫描main.obj,把它的默认标准库libc.lib加入到输入文件列表末尾,它自己加入E集合,同时未解析的foo加入U,main加入D。接着扫描my.lib,因为这是个库,所以会拿当前U中的所有符号(当然现在就一个foo)与my.lib中的所有目标模块(当然也只有一个mylib.obj)依次匹配,看是否有模块定义了U中的符号。结果mylib.obj确实定义了foo,于是它加入到E,foo从U转移到D,未解析的printf加入到U,指定的默认标准库libcd.lib也加到输入文件列表末尾(在libc.lib之后)。不断地在my.lib库的各模块上进行迭代以匹配U中的符号,直到U、D都不再变化。很明显,现在就已经到达了这么一个不动点,所以接着扫描下一个输入文件,就是libc.lib。链接器发现libc.lib里的printf.obj里定义有printf,于是printf从U移到D,printf.obj加入到E,它定义的所有符号加入到D,它里头的未解析符号加入到U。如果链接时没有指定/ENTRY(程序入口点选项),那么链接器默认的入口点就是函数mainCRTStartup(GUI程序的默认入口点则是WinMainCRTStartup),它在crt0.obj中被定义,所以crt0.obj及它直接或间接引用的模块(比如malloc.obj、free.obj等)都被加入到E中,这些目标模块指定的默认库(只crt0init.obj指定了kernel32.lib)加到输入文件列表末尾,同时更新U和D。不断匹配libc.lib中各模块直至到达不动点,然后处理libcd.lib,但是它里面的所有目标模块都没有定义U中的任何一个符号,所以链接器略过它进入到最后一个输入文件kernel32.lib。事实上,U中已有和将要加入的未解析符号都可以在其中找到定义,那么当处理完kernel32.lib时,U必然为空,于是链接器合并E中的所有模块生成可执行文件。

上文描述了虽然各目标模块指定了不同版本的缺省标准库但仍然链接成功的例子,接下来你将目睹因为这种不严谨而导致的悲惨失败。

修改mylib.c成这个样子:

#include

void foo(void)
{
// just a test , don't care memory leak
_malloc_dbg( 1, _NORMAL_BLOCK, __FILE__, __LINE__ );
}

其中_malloc_dbg不是ANSI C的标准库函数,它是VC标准库提供的malloc的调试版,与相关函数配套能帮助开发者抓各种内存错误。使用它一定要定义_DEBUG宏,否则预处理器会把它自动转为malloc。继续用
cl /c /MLd mylib.c
lib /OUT:my.lib mylib.obj
编译打包。当再次用
link main.obj my.lib
进行链接时,我们看到了什么?天哪,一堆的LNK2005加上个贵为"fatal error"的LNK1169垫底,当然还少不了那个LNK4098。链接器是不是疯了?不,你冤枉可怜的链接器了,我拍胸脯保证它可是一直在尽心尽责地照章办事。

一开始E、U、D为空,链接器扫描main.obj,把libc.lib加到输入文件列表末尾,把main.obj加进E,把foo加进U,把main加进D。接着扫描my.lib,于是mylib.obj加入E,libcd.lib加到输入文件列表末尾,foo从U转移到D,_malloc_dbg加进U。然后扫描libc.lib,这时会发现libc.lib里任何一个目标模块都没有定义_malloc_dbg(它只在调试版的标准库中存在),所以不会有任何一个模块因为_malloc_dbg而加入E。但因为libc.lib中的crt0.obj定义了默认入口点函数mainCRTStartup,所以crt0.obj及它直接或间接引用的模块(比如malloc.obj、free.obj等)都被加入到E中,这些目标模块指定的默认库(只crt0init.obj指定了kernel32.lib)加到输入文件列表末尾,同时更新U和D。不断匹配libc.lib中各模块直至到达不动点后再处理libcd.lib,发现dbgheap.obj定义了_malloc_dbg,于是dbgheap.obj加入到E,它的未解析符号加入U,它定义的所有其它符号加入D,这时灾难便来了。之前malloc等符号已经在D中(随着libc.lib里的malloc.obj加入E而加入的),而dbgheap.obj及因它而引入的其它模块又定义了包括malloc在内的许多同名符号,导致了重定义冲突。所以链接器在处理完所有输入文件(是的,即使中途有重定义冲突它也会处理所有的文件以便生成一个完整的冲突列表)后只好报告: 这活儿没法儿干。

现在我们该知道,链接器完全没有责任,责任在我们自己的身上。是我们粗心地把缺省标准库版本不一致的目标文件(main.obj)与程序库(my.lib)链接起来,引发了大灾难。解决办法很简单,要么用/MLd选项来重编译main.c;要么用/ML选项重编译mylib.c;再或者干脆在链接时用/NODEFAULTLIB:XXX选项忽略默认库XXX,但这种方法非常不保险(想想为什么?),所以不推荐。

在上述例子中,我们拥有库my.lib的源代码(mylib.c),所以可以用不同的选项重新编译这些源代码并再次打包。可如果使用的是第三方的库,它并没有提供源代码,那么我们就只有改变自己程序的编译选项来适应这些库了。但是如何知道库中目标模块指定的默认库呢?其实VC提供的一个小工具便可以完成任务,这就是dumpbin.exe。运行下面这个命令
dumpbin /DIRECTIVES my.lib
然后在输出中找那些"Linker Directives"引导的信息,你一定会发现每一处这样的信息都会包含若干个类似"-defaultlib:XXXX"这样的字符串,其中XXXX便代表目标模块指定的缺省库名(注意,如果在编译时指定了/Zl选项,那么目标模块中将不会有defaultlib信息)。

知道了第三方库指定的默认标准库,再用合适的选项编译我们的应用程序,就可以避免LNK2005和LNK1169链接错误。喜欢IDE的朋友,你一样可以到 "Project属性" -> "C/C++" -> "代码生成(code generation)" -> "运行时库(run-time library)" 项下设置应用程序的默认标准库版本,这与命令行选项的效果是一样的。

---------------------------------------------------------------------------------------------------
在vc 2003下,如果使用了静态库,很有可能会发生link 2005的连接错误,主要是由于crt 库引起的,CRT 库对 new、delete 和 DllMain 函数使用弱外部链接,如果我们改变一下库的连接顺序,就可以解决这个错误

解决方案
解决该问题有两种方法:第一种解决方案涉及到强制链接程序按照正确的顺序链接库。第二种解决方案是让您查找导致问题的模块并纠正它。
解决方案一:强制链接程序按照正确的顺序链接库
1.在“生成”菜单上,单击“设置”。2.在“项目设置”对话框的“以下项目的设置”视图中,单击以选中出现链接错误的项目配置。3.在“链接”选项卡上,单击以选中“类别”组合框中的“INPUT”。4.在“要忽略的库”中,插入库名(例如,Nafxcwd.lib;Libcmtd.lib)。

注意:等效的链接程序命令行是:/NOD:。5.在“对象/库模块”框中,插入库名。必须确保这些库按顺序列出,且作为命令行中的前两个库(例如,Nafxcwd.lib 和 Libcmtd.lib)列出。要在 Visual C++ .NET 中设置该选项,请阅读“设置 Visual C++ 项目属性”联机帮助主题。
解决方案二:找到并纠正出现问题的模块
要查看当前的库链接顺序,请按照下列步骤操作: 1.在“生成”菜单上,单击“设置”。2.在“项目设置”对话框的“以下项目的设置”视图中,单击以选中出现链接错误的项目配置。3.在“链接”选项卡上,在“项目选项”框中键入 /verbose:lib

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1431093

LNK2001 unresolved external symbol错误


LNK2001 unresolved external symbol错误

这个错误一般有两种情况
1) 选择了错误的工程类型,导致系统寻找其实不需要的_main符合。

我们编制的程序有两种,Windows程序和Console程序,如果你编制的程序不是Console程序,你必须首先创建一种合适的工程,然后在这个工程内添加代码。如果先写代码然后直接编译,就会默认是console工程导致连接失败。具体IDE使用方法请买一本介绍VC编程的书看。
2)使用了一个实体(包括函数、全局变量等),但是使用时的名字、原型与定义时不一致,典型错误包括:
a) 函数原型声明和函数定义时的参数类型不一致
b) 函数原型声明和函数定义时的修饰符不一致,典型的是遗漏了PASCALL(WINAPI)修饰符或者extern "C"修饰符
c) 函数原型的返回类型和定义时不一致。
d) 在动态连接库中定义,但是没有把动态连接库对应的lib文件加入工程,其中很多系统函数出现的LNK2001错误就是这个原因。
e) 动态连接库函数在.c文件中定义,但是没有在头文件中用extern "C"修饰
f) 动态连接库没有输出这个函数
g) 变量声明和定义不一致。例如声明为指针,实际是一个数组。这种错误也许不会出2001,但是会导致运行失败,而且错误得莫名其妙。
h) 函数或者变量用static修饰,导致文件外无法看到这个实体。

在创建MFC项目时, 不使用MFC AppWizard向导, 如果没有设置好项目参数, 就会在编译时产生很多连接错误, 如error LNK2001错误, 典型的错误提示有:
libcmtd.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16
msvcrtd.lib(crtexew.obj) : error LNK2001: unresolved external symbol _WinMain@16
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __beginthreadex
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __endthreadex

下面介绍解决的方法:
1. Windows子系统设置错误, 提示:
libcmtd.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
Windows项目要使用Windows子系统, 而不是Console, 可以这样设置:
[Project] --> [Settings] --> 选择"Link"属性页,
在Project Options中将/subsystem:console改成/subsystem:windows

2. Console子系统设置错误, 提示:
LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16
控制台项目要使用Console子系统, 而不是Windows, 设置:
[Project] --> [Settings] --> 选择"Link"属性页,
在Project Options中将/subsystem:windows改成/subsystem:console

3. 程序入口设置错误, 提示:
msvcrtd.lib(crtexew.obj) : error LNK2001: unresolved external symbol _WinMain@16
通常, MFC项目的程序入口函数是WinMain, 如果编译项目的Unicode版本, 程序入口必须改为wWinMainCRTStartup, 所以需要重新设置程序入口:
[Project] --> [Settings] --> 选择"Link"属性页,
在Category中选择Output,
再在Entry-point symbol中填入wWinMainCRTStartup, 即可

4. 线程运行时库设置错误, 提示:
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __beginthreadex
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __endthreadex
这是因为MFC要使用多线程时库, 需要更改设置:
[Project] --> [Settings] --> 选择"C/C++"属性页,
在Category中选择Code Generation,
再在Use run-time library中选择Debug Multithreaded或者multithreaded
其中,
Single-Threaded 单线程静态链接库(release版本)
Multithreaded 多线程静态链接库(release版本)
multithreaded DLL 多线程动态链接库(release版本)
Debug Single-Threaded 单线程静态链接库(debug版本)
Debug Multithreaded 多线程静态链接库(debug版本)
Debug Multithreaded DLL 多线程动态链接库(debug版本)
单线程: 不需要多线程调用时, 多用在DOS环境下
多线程: 可以并发运行
静态库: 直接将库与程序Link, 可以脱离MFC库运行
动态库: 需要相应的DLL动态库, 程序才能运行
release版本: 正式发布时使用
debug版本: 调试阶段使用

2-------------------------------------------------------------------------------------------------------
在VC/MFC社区中经常看到有人问一些编译错误怎么解决的问题,很多错误都是VC++的链接错误LNK2001,所以把这篇我记不得从什么地方获得的文章贴出来,也许对大家有点帮助。在此要感谢本文的原始作者,为他的专业精神!

学习VC++时经常会遇到链接错误LNK2001,该错误非常讨厌,因为对于编程者来说,最好改的错误莫过于编译错误,而一般说来发生连接错误时,编译都已通过。产生连接错误的原因非常多,尤其LNK2001错误,常常使人不明其所以然。如果不深入地学习和理解VC++,要想改正连接错误LNK2001非常困难。
  初学者在学习VC++的过程中,遇到的LNK2001错误的错误消息主要为:
  unresolved external symbol “symbol”(不确定的外部“符号”)。
  如果连接程序不能在所有的库和目标文件内找到所引用的函数、变量或标签,将产生此错误消息。一般来说,发生错误的原因有两个:一是所引用
的函数、变量不存在、拼写不正确或者使用错误;其次可能使用了不同版本的连接库。
  以下是可能产生LNK2001错误的原因:
  一.由于编码错误导致的LNK2001。
  1.不相匹配的程序代码或模块定义(.DEF)文件能导致LNK2001。例如,如果在C++ 源文件内声明了一变量“var1”,却试图在另一文件内以变量
“VAR1”访问该变量,将发生该错误。
  2.如果使用的内联函数是在.CPP文件内定义的,而不是在头文件内定义将导致LNK2001错误。
  3.调用函数时如果所用的参数类型同函数声明时的类型不符将会产生LNK2001。
  4.试图从基类的构造函数或析构函数中调用虚拟函数时将会导致LNK2001。
  5.要注意函数和变量的可公用性,只有全局变量、函数是可公用的。
  静态函数和静态变量具有相同的使用范围限制。当试图从文件外部访问任何没有在该文件内声明的静态变量时将导致编译错误或LNK2001。
  函数内声明的变量(局部变量) 只能在该函数的范围内使用。C++ 的全局常量只有静态连接性能。这不同于C,如果试图在C++的
多个文件内使用全局变量也会产生LNK2001错误。一种解决的方法是需要时在头文件中加入该常量的初始化代码,并在.CPP文件中包含该头文件;另一种
方法是使用时给该变量赋以常数。
  二.由于编译和链接的设置而造成的LNK2001
  1.如果编译时使用的是/NOD(/NODEFAULTLIB)选项,程序所需要的运行库和MFC库在连接时由编译器写入目标文件模块, 但除非在文件中明确包含这些库名,否则这些库不会被链接进工程文件。在这种情况下使用/NOD将导致错误LNK2001。
  2.如果没有为wWinMainCRTStartup设定程序入口,在使用Unicode和MFC时将得到“unresolved external on _WinMain@16”的LNK2001错误信息。
  3.使用/MD选项编译时,既然所有的运行库都被保留在动态链接库之内,源文件中对“func”的引用,在目标文件里即对“__imp__func” 的引用。
如果试图使用静态库LIBC.LIB或LIBCMT.LIB进行连接,将在__imp__func上发生LNK2001;如果不使用/MD选项编译,在使用MSVCxx.LIB连接时也会发生LNK2001。
  4.使用/ML选项编译时,如用LIBCMT.LIB链接会在_errno上发生LNK2001。
  5.当编译调试版的应用程序时,如果采用发行版模态库进行连接也会产生LNK2001;同样,使用调试版模态库连接发行版应用程序时也会产生相同的问题。
  6.不同版本的库和编译器的混合使用也能产生问题,因为新版的库里可能包含早先的版本没有的符号和说明。
  7.在不同的模块使用内联和非内联的编译选项能够导致LNK2001。如果创建C++库时打开了函数内联(/Ob1或/Ob2),但是在描述该函数的相应头文件里却关闭了函数内联(没有inline关键字),这时将得到该错误信息。为避免该问题的发生,应该在相应的头文件中用inline关键字标志内联函数。
  8.不正确的/SUBSYSTEM或/ENTRY设置也能导致LNK2001。
  其实,产生LNK2001的原因还有很多,以上的原因只是一部分而已,对初学者来说这些就够理解一阵子了。但是,分析错误原因的目的是为了避免错
误的发生。LNK2001错误虽然比较困难,但是只要注意到了上述问题,还是能够避免和予以解决的。

CString,int,string,char*之间的转换

string 转 CString
CString.format("%s", string.c_str());

char 转 CString
CString.format("%s", char*);

char 转 string
string s(char *);

string 转 char *
char *p = string.c_str();

CString 转 string
string s(CString.GetBuffer());

1,string -> CString
CString.format("%s", string.c_str());
用c_str()确实比data()要好.
2,char -> string
string s(char *);
你的只能初始化,在不是初始化的地方最好还是用assign().
3,CString -> string
string s(CString.GetBuffer());
GetBuffer()后一定要ReleaseBuffer(),否则就没有释放缓冲区所占的空间.

《C++标准函数库》中说的
有三个函数可以将字符串的内容转换为字符数组和C—string
1.data(),返回没有”\0“的字符串数组
2,c_str(),返回有”\0“的字符串数组
3,copy()
---------------------------------------------------------------
CString与int、char*、char[100]之间的转换- -

CString与int、char*、char[100]之间的转换- -

CString互转int

将字符转换为整数,可以使用atoi、_atoi64或atol。
而将数字转换为CString变量,可以使用CString的Format函数。如
CString s;
int i = 64;
s.Format("%d", i)
Format函数的功能很强,值得你研究一下。

void CStrDlg::OnButton1()
{
// TODO: Add your control notification handler code here
CString
ss="1212.12";
int temp=atoi(ss);
CString aa;
aa.Format("%d",temp);
AfxMessageBox("var is " + aa);
}

sart.Format("%s",buf);

CString互转char*

///char * TO cstring
CString strtest;
char * charpoint;
charpoint="give string a value";
strtest=charpoint;


///cstring TO char *
charpoint=strtest.GetBuffer(strtest.GetLength());

标准C里没有string,char *==char []==string

可以用CString.Format("%s",char *)这个方法来将char *转成CString。要把CString转成char *,用操作符(LPCSTR)CString就可以了。


CString转换 char[100]

char a[100];
CString str("aaaaaa");
strncpy(a,(LPCTSTR)str,sizeof(a));


Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1438125

http://blog.csdn.net/ben1978/archive/2006/12/11/1438125.aspx

2007年11月9日星期五

九十月工作阶段小结(Fast Marching Methods)

不知不觉,距当初工作刚开始已经过去了九周了,中间过程曲折反复,本来预计月余即可完工的“小活”,至今仍距完工遥遥无期,现在已经把机子搬来打算“常驻”了。预期的结果中未来的迷雾中。
因为是第一次独立从事研究性的开发工作,所以对于时间的计算很没有把握,抱着一步一步来的心态来进行。开始比较紧张,直接搬入公司,附近就有技术大牛,随时可以得到支持。这在后面证明是保证进度相当重要的一点,很多的东西不是没有想法,大量的时间都消耗在代码的实现上了。在与冰冷的Error和Access violation的斗争中曲折前进,不知道什么时候自己才能达到“自在编程”的境界。
九周的时间进度是这样的,九月份的前三周主要是实现与导师商量好的算法,期间涉及到一个最小堆结构的实现,动态三维数组的设计,空间种子填充算法,以及对微分方程的数值求解等。最小堆是从算法导论上学的,不愧是经典,短短几十行代码效率非常高;动态三维数组申请空间时要多申请几个字节(参考:生死疆界——在new与delete之间);种子填充算法是自己想到,每次压栈的点选取当前点对面的五个点,事后证明运行的还不错。微分方程的求解是按文献中的说法来。期间穿插着网络实验的课程。到了第四周,程序大体结构已经完成,可是方程求解过程中老是出现无解的情况,拖了好几天。最后商量的结果是改变赋初值的方法看看有没有改善,十一之前还没改完,带着这个问题开始了两周的十一假期。
十一归来,新算法依然没有改进,只是无解的情况少了一点,只能采用近似的方法,最后程序是过了,效果也还令人满意。可还存在两个问题,一个是运行速度比较慢,一个是对初始地层扩展后形态的保持性较差。接下来的工作主要集中在这里。因为要应付网络实验考试,中间又占了将近一周时间。最后改来改去结果仍然不令人满意,期间顺手把地层数据体的存储操作做了一个类。对函数指针的使用和各个包之间的关系有了进一步的了解。到了现在,又进入了一个瓶颈阶段,目前是上下不能,体会煎熬的感觉。不过听说另一种方法的实现已经取得了初步的成功,而且没有出现数值不稳定的情况,也算是得到了一点慰籍。(人看到是05年的paper,我看的是99年的书。)
总结这9周,扣掉放假考试和零零碎碎的时间,工作时间5周,编了3000余行代码,平均一天不到100行当有效输出,最大的感觉就是“人力有穷尽”,虽说有数学基础的问题,有时仿佛就被魇住了,几天没有进展,然后旁人一点拨就发现原来只是一个微不足道的疏忽。但这段时间不应该放弃对原著的钻研,另一种方法取得进展就是一个证明,当初如果看了说不定就能从中获得启发。另外一个问题就是对于系统现在还不是很得心应手,虽说改过不少Bug,可是都停留在知其然不知其所以然的情况,很久以前改过的错误再碰到又要想半天,看来有必要深入底层研究一下。

搬,还是不搬?(Move, or not?)

这是个问题。最近莫名其妙的Blogspot突然好了,访问数突增,速度仍是那么快,当然不知什么时候又会莫名其妙地当掉。现在Blogspot在国内已经彻底变成一个小众产品,中国人看不了,外国人看不懂。曾经很认真的考虑换一个,可是发现面临的最大问题不是选择太少而是多大无法决定。目前博客网站多如过江之鲫,除开通过程的繁琐之外,已有文章的迁移实在是一个痛苦的过程。
新浪的Blog应该是不会选了,模板死的要命,还有强加的广告,而且与Google Reader的兼容性似乎不太好,独有图片无法由外部抓到,特排外的感觉。听说yo2不错,申请了一下,可最近悲哀地发现页面上是冰冷的“503 Service Temporarily Unavailable”。小网站的缺陷就在于:不知道什么时候就没了,辛辛苦苦积累的文章全部灰飞烟灭,找谁哭去?所以现在对于那些不是做博客出身,只是敢时髦的网站,都敬而远之。
算了,暂时作为个人的一个文集存档吧,还是很喜欢blogger周边各种丰富的插件。当了又不是没办法,道高一尺,魔高一丈,咱有tor,怕啥?Blogger本身的功能也很强大,目前用到的十中无一,看看师兄的博客(http://www.livingpearls.com/),就是在Blogspot上写完之后发布在申请的独立域名上,感觉自己这个还有相当大的开发余地啊。

附文一篇:我无法访问的国外优秀网站

2007年11月8日星期四

第五章 奔腾的芯(英特尔—Intel)(zz)

目录
1. 时势造英雄
2. 英特尔摩托罗拉之战
3. 指令集之争
4. 英特尔和 AMD 的关系
5. 天步艰难

在美国西海岸旧金山到圣荷西市(San Jose)之间,围绕着旧金山海湾有几十公里长,几公里宽的峡谷,通常称为硅谷。(在图中绿线圈出来的部分)那里之所以叫硅谷并不是因为它生产硅,而是它有很多是使用硅的半导体公司,包括全世界最大的半导体公司英特尔公司。全世界一大半的计算机都是用它的中央处理器(CPU),它对我们日常生活的影响是很少有公司可以匹敌的。我们在上一章介绍了摩尔定理和安迪-盖茨定理,其中摩尔是英特尔公司的创始人,而安迪.格罗夫是第四个加入英特尔并把英特尔公司真正发展成世界上最大的半导体公司的 CEO。今天,英特尔已经有近十万人,年产值达三百六十亿美元,市值高达一千四百亿美元。三十多年来,英特尔公司成功的关键首先是搭上了个人电脑革命的浪潮,尤其是有微软这个强势的伙伴;第二,它三十年来严格按照它的创始人预言的惊人的高速度在为全世界 PC 机用户提高着处理器的性能,用它自己的话讲,它给了每台微机一个奔腾的芯。

1. 时势造英雄

英特尔公司由戈登•摩尔(Gordon E. Moore)和罗伯特.诺伊斯(Robert Noyce)于 1968 年创立于硅谷。此前,摩尔和诺伊斯在 1956 年还和另外六个人一起创办了仙童(Fairchild)半导体公司。同 IBM、DEC 和惠普等公司相比,英特尔在很长时间内只能算是一个婴儿。说它是婴儿有两方面含义,第一,它是个人数少、生意小的小公司,第二,在八十年代以前,几乎所有的计算机公司如 IBM、DEC 都是自己设计中央处理器,因此这些计算机公司代表了处理器设计和制造的最高水平,而英特尔生产的是性能低的微处理器,是用来补充大计算机公司看不上的低端市场。单纯从性能上讲,英特尔八十年代的处理器还比不上 IBM 七十年代的,但是,它的处理器大家用得起,不是阳春白雪。即使在七十年代末,英特尔公司生产出了著名的十六位 8086 处理器,大家仍然将它看成小弟弟。在很长时间里,英特尔的产品被认为是低性能、低价格。虽然它的性价比很高,但并不是尖端产品。

虽然 8086 是我们今天所有 IBM PC 处理器的祖宗,但是,当时连英特尔自己也没有预测到它的重用性。当时英特尔公司对 8086 并没有一个明确的市场定位,只是想尽可能多地促销。IBM 只不过是英特尔当时众多大大小小的客户之一。1981 年,IBM 为了短平快地搞出 PC,也懒得自己设计处理器,拿来英特尔的 8086 就直接用上了。这一下子,英特尔一举成名。1982 年,英特尔搞出了和 8086 完全兼容的第二代 PC 处理器 80286,用在了 IBM PC/AT 上。由于 IBM 无法阻止别人造兼容机,随着 1985 年康柏(Compaq)造出了世界上第一台 IBM PC 的兼容机,兼容机厂商就像雨后春笋般在全世界冒了出来。这些兼容机硬件不径相同,但是为了和 IBM PC 兼容,处理器都得是英特尔公司的。下图是整个个人电脑工业的生态链。

可以看出在这个生态链中,只有作为操作系统开发商的微软和作为处理器制造商的英特尔处于一个不可替代的地位。因此,英特尔的崛起就成为历史的必然。这正是时势造英雄。

当然,虽然信息革命的浪潮将英特尔推上了前沿,英特尔还必须有能力来领导计算机处理器的技术革命。英特尔的 CEO 安迪•格罗夫在机会和挑战面前,最终证明了英特尔是王者。英特尔起步的八十年代恰恰是日本的十年,当时日本股市的总市值占了全世界的一半,日本东京附近的房地产总值相当于半个美国的房市总值。世界上最大的三个半导体公司都在日本,PC 里面日本芯片一度占到数量的 60%(注意:不是价钱的 60%)。以至于日本有些政治家盲目自大,认为日本到了全面挑战美国的时候,全世界都在怀疑美国在半导体技术上是否会落后于日本。但是冷静地分析一下全世界半导体市场就会发现,日本的半导体工业集中在技术含量低的芯片上,如存储器等芯片(即内存),而全世界高端的芯片工业,如计算机处理器和通信的数字信号处理器全部在美国。八十年代,英特尔果断地停掉了它的内存业务,将这个市场完全让给了日本人,从此专心做处理器。当时日本半导体公司在全市界挣了很多钱,日本一片欢呼,认为它们打败了美国人。其实,这不过是英特尔等美国公司弃子求势的一招棋。1985 年,英特尔公司继摩托罗拉后,第二个研制出 32 位的微处理器 80386,开始扩大它在整个半导体工业的市场份额。这个芯片的研制费用超过三亿美元,虽然远远低于现在英特尔新的处理器芯片的研制成本,但在当时确实是一场豪赌,这笔研制费超过中国当时在一个五年计划中对半导体科研全部投入的好几倍。英特尔靠 80386 完成了对 IBM PC 兼容机机市场一统江湖的伟业。

接下来到了 1989 年,英特尔推出了从 80386 到奔腾处理器的过渡产品 80486,它其实是 80386 加一个浮点处理器 80387 以及缓存(Cache)。靠 80486 的销售,英特尔超过所有的日本半导体公司,坐上了半导体行业的头把交椅。顺便说句题外话,今天日本的股市不到 1990 年 40%的水平,可是美国却涨了五倍。1993 年,英特尔公司推出奔腾处理器。从奔腾起,英特尔公司不再以数字命名它的产品了,但是在工业界和学术界,大家仍然习惯性地把英特尔的处理器称为 x86 系列。

奔腾的诞生,使英特尔甩掉了只会做低性能处理器的帽子。由于奔腾处理器的速度已经达到工作站处理器的水平,高端的微机从那时起,开始取代低性能的图形工作站。到今天,即使是最早生产工作站的太阳公司和世界上最大的计算机公司 IBM 以及以前从不使用英特尔处理器的苹果公司,都开始在自己的计算机中使用英特尔的或者和英特尔兼容的处理器了。现在,英特尔已经垄断了计算机处理器市场。

2. 英特尔摩托罗拉之战

资金密集型的日本半导体公司终究不可能是技术密集型的英特尔公司的对手。英特尔公司迄今唯一遇到的重量级对手只有八十年代的摩托罗拉。正如同罗马帝国的崛起是通过在布匿战争中打败原有的霸主迦太基而完成的,英特尔的崛起是靠击败老牌半导体公司摩托罗拉而实现的。摩托罗拉成立于 1928 年,早在二战期间,它就是美军无线通信的供应商。从六十年代起,它在通信和集成电路方面领先于世界。摩托罗拉比英特尔早两年推出在小数运算性能上五倍好于 8086 的 16 位微处理器 68000。68000 这个名字是以它集成的晶体管数目六万八千个而获得的。而 8086 只有不到三万个晶体管。当时,不少工作站包括惠普、太阳和已经不存在的阿波罗等等都采用的是摩托罗拉的处理器。在英特尔搞出 80286 的同一年(1982 年),摩托罗拉推出了在性能上明显好于 80286 的 68010,继续作为当时主要工作站的处理器。据说英特尔为了和摩托罗拉竞争在型号上耍了个小花招,英特尔公司第二代处理器本来应该命名为 80186,但是英特尔将这个编号留给了一个不重要的输入输出处理芯片,而将它的系列处理器的编号一下跳到 80286,不懂技术的人还以为英特尔的处理器比摩托罗拉高一代。在 32 位微处理器的较量中,摩托罗拉在技术上和推出的时间上完全占了上风,它接下来的 68020 明显好于英特尔的 80386,除了被用于主要的工作站上,68020 还并被苹果选为麦金托什的处理器。

这时,英特尔公司从外部得到了强援。由于 IBM PC 兼容机的逐步普及,技术上相对落后的英特尔反而占了更多的市场份额。虽然,摩托罗拉后来又推出了对应于英特尔 80486 的 68030,但是,这时各个工作站公司都开始开发自己减指指令(RISC)的处理器,摩托罗拉只剩下苹果一个用户便很难和英特尔竞争了。几年后,摩托罗拉干脆自己也加入了 RISC 的行列做起 PowerPC,十年后,随着苹果也开始使用英特尔的处理器,摩托罗拉彻底推出了微机处理器市场。

摩托罗拉并没有败在技术和资金上,八十年代以前,摩托罗拉在资金、技术各方面都明显强于英特尔。在很长时间里,它的处理器从性能上讲要优于英特尔的同类产品。摩托罗拉之败,首先是外界微软的因素,即英特尔有了微软这个没有签约的同盟军。但是,摩托罗拉自己在商业、管理和市场诸方面也有很多失误。如果摩托罗拉自己经营得当,它今天应该能通过精简指令集的处理器守住工作站和苹果的市场。

要分析摩托罗拉之败,我们不妨来比较一下英特尔和摩托罗拉这两个公司。首先,这是两个不同时代的公司。总部在美国中部伊利诺斯州的摩托罗拉虽然也是一个高技术公司,也经历了八十年代的信息革命,但是它的作态完全还是五六十年代的传统的公司。虽然摩托罗拉对雇员在工资和福利上待遇不错,但是公司和员工,基本上还是传统的雇佣关系,公司内部管理层次较多,大部分员工基本上没有多少股票期权。因此,公司的业绩和员工的利益关系不大。英特尔公司则是一的典型的硅谷公司。每个员工的工作强度比摩托罗拉要大很多,但是每个人平均的股票期权也多很多。硅谷几个比较好的学区的房子,不少被英特尔公司的早期员工买走了,而这些房子靠工资是一辈子也买不起的。几年前,美国历史频道(History Channel)在节目中评论了中日甲午战争。美国的历史学家认为,这是两个不同时代军队之间的战争,虽然双方武器相差不多,战争的结果不会有任何悬念,因为一个在专制的农业时代后期的军队很难打赢一个兴起的工业化国家的军队。英特尔和摩托罗拉之间的竞争也是如此。

第二,两个公司的统帅水平相去甚远。英特尔公司八九十年代的 CEO 格罗夫虽然是学者出身,同时也是微机时代最优秀的领导者和管理者,他几次被评为世界上最好的 CEO。摩托罗拉公司由加尔文(Galvin)兄弟创办,公司六十年代传到了儿子手里,八九十年代传到了孙子手里,是个典型的家族公司。俗话说富不过三代,这话果然应验在加尔文家族上,三代人可以说是一代不如一代。孙子辈的克里斯托弗•加尔文虽然是被"选成"CEO的,但是如果他不姓加尔文,他永远不可能是摩托罗拉的 CEO,甚至进不了工业界的高层。

在业务上,半导体只是摩托罗拉的一个部门,而微机处理器又只是其半导体部门的一项业务,可是它对于英特尔来讲却是全部。因此,摩托罗拉即使完全退出微机处理器市场也不过是损失一些地盘,而英特尔一旦失败,则会面临灭顶之灾。一般来讲,华尔街总是希望一个上市公司有尽可能多的而不是单一的收入来源,摩托罗拉确实是这么做的,它曾经在计算机的处理器、通信的数字信号处理器、对讲机、BP 机、手机和电视接收器等很多领域发展。结果每个领域都很难做大。英特尔公司做事情非常专注,直到今天,它一直集中精力于个人微机的处理器上。每一代产品的研发都是集中大量的人力和资金,每一次都是只能成功不能失败。这就像一把散线和一股绳,一把散线很容易被一股绳扯断。因此,专注的英特尔最终把计算机处理器的业务做得很大、很好,而业务多元化的摩托罗拉最后除了在微机处理器上败给了英特尔,在手机上碰到了诺基亚,在信号处理器(DSP)上又败给了德州仪器(TI)。很多人问我雅虎有没有可能在搜索领域赶上谷歌,我明确地回答--没有,因为雅虎不可能专注在这个领域。有时,一个好的公司不能完全按华尔街的意愿办事。

如果时光可以倒流,让摩托罗拉和英特尔当时换个个儿,即 IBM PC 采用摩托罗拉的处理器,而将服务器厂家和苹果交给英特尔。那么二十年发展下来,摩托罗拉也很难成为半导体领域的老大,因为它内部的问题没法解决。

3. 指令集之争

英特尔在微软的帮助下,在商业上打赢了对摩托罗拉一战。在接下来的十年里,它在技术上又和全世界打了一战。

当今的计算机系统结构可以根据指令集合分成复杂指令(CISC)和简单指令(RISC)两种。一个计算机的程序最终要变成一系列指令才能在处理器上运行。每个处理器的指令集不相同。有些处理器在设计时候,尽可能地实现各种各样、功能齐全的指令,这包括早期 IBM 和 DEC 的全部计算机,今天的英特尔和 AMD 的处理器等等。采用复杂指令系统的处理器芯片的好处是它可以实现很复杂的指令,但是它存在主要问题有两个,第一,设计复杂,实现同样的性能需要的集成度高;第二,由于每个指令执行时间不一样长,处理器内部各个部分很难流水作业,处理器会出现不必要的等待。除此之外,还有一个过去不是问题现在是问题的缺陷,就是复杂指令芯片高集成度带来的高功耗。

针对复杂指令的处理器的上述两个不足之处,八十年代,计算机科学家们提出了基于精简指令集的处理器设计思想,其代表人物是现任斯坦福大学校长、美国科学院、工程学院和文理学院三院院士轩尼诗(John Hennessy) 教授和加大伯克利分校著名的计算机教授派特森(David Patterson)院士。精简指令系统只保留很少的常用指令并将一条复杂的指令用几条简单的指令代替。基于精简指令集的设计思想是计算机发展史上的一次革命,它使得计算机处理器的设计得到很大简化,同时由于精简指令集的处理器可以保证每条指令执行时间相同,处理器内各部分可以很好地流水作业,处理器速度可以比同时期的基于复杂指令的处理器要来得快。精简指令集的处理器包括很多工作站的处理器和现在最快的 Sony PS/3 游戏机的微处理器 PS/3-Cell。

虽然复杂指令和精简指令的处理器各有千秋,但是在学术界几乎一边倒地认为复杂指令集的设计过时了,精简指令集是先进的。尤其是美国所有大学计算机原理和计算机系统结构两门课全是用轩尼诗和派特森合写的教科书。在很长时间里,书中以介绍轩尼诗自己设计的 MIPS 精简指令芯片为主。同时,IEEE 和 ACM 系统结构的论文也以精简指令为主。英特尔设计 8086 时还没有精简指令的芯片,否则我想,英特尔很可能会采用这种技术,而不是复杂指令系统。而一旦走上了复杂指令这条不归路,英特尔为了和 8086 完全兼容,在以后的 80286 和 80386 中必须继续使用复杂指令系统。在八十年代中后期,不少精简指令的处理器做出来了,包括轩尼诗设计的 MIPS,后来用于 SGI 工作站,以及派特森设计的 RISC,后来用于 IBM 的工作站。精简指令芯片的速度当时比的复杂指令的要快得多。

到了八十年代末,英特尔面临一个选择,是继续设计和以前 x86 兼容的芯片还是转到精简指令的道路上去。如果转到精简指令的道路上,英特尔的市场优势会荡然无存;如果坚持走复杂指令的道路,它就必须逆着全世界处理器发展潮流前进。在这个问题上,英特尔处理的很理智。首先,英特尔必须维护它通过 x86 系列芯片在微处理器市场上确立的领先地位;但是,万一复杂指令的处理器发展到头了,而精简指令代表了未来的发展方向,它也不能坐以待毙。英特尔在推出过渡型复杂指令集的处理器 80486 的同时,推出了基于精简指令集的 80860。这个产品事实证明不很成功,显然,市场的倾向说明了用户对兼容性的要求比性能更重要。因此,英特尔在精简指令上推出 80960 后,就停止了这方面的工作,而专心做"技术落后"的复杂指令系列。在整个九十年代,工业界只有英特尔一家坚持开发复杂指令集的处理器,对抗着整个处理器工业。

应该讲英特尔在精简指令处理器的工作没有白花,它在奔腾及以后的处理器设计上吸取了 RISC 的长处,使得处理器内部流水线的效率提高很多。由于英特尔每一种 PC 机处理器的销量都超过同时代所有的工作站处理器销量的总和,它可以在每个处理器的开发上投入比任何一种精简指令处理器多的多的研发经费和人力,这样,英特尔通过高强度的投入,保证了它处理器性能提升得比精简指令还要快。而在精简指令阵营,九十年代五大工作站厂家太阳、SGI、IBM、DEC 和 HP 各自为战,每家都生产自己的精简指令处理器,加上摩托罗拉为苹果生产的 PowerPC,六家瓜分一个市场,最后谁也做不大、做不好。到了 2000 年前后,各家的处理器都做不下去了,或者全部或者部分地开始采用英特尔的产品了。而最早的精简指令的 MIPS 处理器现在几乎没有人用了。轩尼诗和派特森作为两个负责任的科学家,将英特尔处理器加入到自己编的教科书中,以免大学生们再去学习 MIPS 这样的恐龙。

英特尔经过十年努力终于打赢了对精简指令集的处理器之战。需要强调的是,英特尔不是靠技术,而是靠市场打赢的此战。英特尔的表现在很多地方很值得圈点。首先,英特尔坚持自己系列产品的兼容性,即保证以往的软件程序肯定能在新的处理器上运行。这样时间一长,用户便积累了很多在英特尔处理器上运行的软件。每次处理器升级,用户原来的软件都能使,非常方便。因此大家就不愿意轻易更换其它厂家的处理器,即使那些处理器更快。而其它处理器生产厂家这点做的都没有英特尔好,它们常常每过几年就重起炉灶,害得用户以前很多软件不能用了,必须花钱买新的。时间一长,用户就换烦了。第二,英特尔利用规模经济的优势,大强度投入研发,让业界普遍看衰的复杂指令集处理器一代代更新。在九十年代初,英特尔的 x86 系列和精简指令集的处理器相比在实数运算上要略逊一筹。但是,英特尔十几年来坚持不懈地努力,后来居上,而其它厂商因为各自市场不够大,每一个单独的处理器芯片的投入远远不如英特尔,因此反倒落在了后面。与其说英特尔战胜其它厂商,不如说它把竞争对手熬死了。第三,英特尔并没有拒绝新技术,它也曾经研制出两个不错的精简指令的处理器,只是看到它们前途不好时,立即停掉了它们。第四,英特尔运气很好,在精简指令处理器阵营中,群龙无首。这一战,看似英特尔单挑诸多处理器领域的老大。但是,这几家做精简指令处理器的公司因为彼此在工作站方面是竞争对手,自然不会用对手的产品,而且各自为战,互相拆台打价格战,最后,太阳公司和 IBM 倒是把其他几家工作站公司全收拾了,但自己也无力和英特尔竞争了,现在这两家自己也用上了英特尔的芯片。本来,摩托罗拉最有可能一统精简指令处理器的天下和英特尔分庭抗礼,因为它本身不做工作站,而各个工作站厂商原本都是用它的 68000 系列处理器,但是摩托罗拉自己不争气。原因我们前面已经分析过了。

4. 英特尔和 AMD 的关系

我们在前面提到摩托罗拉公司时用了"英特尔和摩托罗拉之战"的说法,因为,那对于英特尔来讲确实是一场十分凶险的战争,当时摩托罗拉无论在技术还是财力上都略胜一筹。如果英特尔一步走错,它今天就不会存在了。英特尔和诸多精简指令处理器公司之战,可以说有惊无险,因为英特尔已经是内有实力,外有强援。而今天,英特尔和 AMD 之间争夺市场的竞争我个人认为不是一个重量级对手之间的比赛,因此算不上是战争。我想,如果不是反垄断法的约束,英特尔很可能已经把AMD击垮或者收购了。另外,英特尔和 AMD 的关系基本上是既联合又斗争。

AMD 不同于英特尔以往的对手,它从来没有另起炉灶做一种和英特尔不同的芯片,而是不断推出和英特尔兼容的、更便宜的替代品。AMD 的这种做法和它的基因很有关系。AMD 从血缘来讲应该是英特尔的族弟,因为它也是从仙童半导体分出来的,也在硅谷,只比英特尔晚几年,而且也和英特尔一样,从半导体存储器做起。和其它处理器公司不同,AMD 的创始人是搞销售出身的,而一般技术公司创始人都是技术出身。AMD 的这种基因决定了它不是自己会做什么就做什么,而是市场导向的,市场需要什么就做什么。在 AMD 创建不久,它就成功地解刨了英特尔的一个八位处理器芯片。八十年代,由于 IBM 采购的原则是必须有两个以上的公司参加竞标,所以在很长的时间里,Intel 主动让 AMD 帮它生产芯片卖给 IBM 等公司。

到了 1986 年,英特尔不想让 AMD 生产刚刚问世的 80386,可能是想独占 80386 的利润吧,于是开始毁约。AMD 拿出过去的合同请求仲裁,仲裁的结果是 AMD 可以生产 80386。这下子英特尔不干了,上诉到加州高等法院,这个官司打了好几年,但是法院基本上维持了仲裁的结果。AMD于 是便名正言顺地克隆起英特尔的处理器芯片了。当时微机生产厂家,例如康柏为了同英特尔的压价,开始少量采购 AMD 的芯片。几年后,英特尔再次控告 AMD 公司盗用它花几亿美元买来的多媒体处理的 MMX 技术,AMD 做了让步达成和解。在整个九十年代,英特尔和 AMD 虽然打打闹闹但是,它们在开拓 x86 市场,对抗精简指令集的工作站芯片方面利益是一致的。因此它们在市场上的依存要多于竞争。

两千年后美国经济进入低谷,精简指令的工作站的市场一落千丈,太阳公司的股票跌掉了百分之九十几。放眼处理器市场,全是英特尔和 AMD 的天下了。AMD 这次主动出击,利用它提早开发出 64 位处理器的优势,率先在高端市场挑战英特尔,并一举拿下了服务器市场的不少份额。前几年,因为微软迟迟不能推出新的操作系统 Vista,因此个人用户没有动力去更新微机;而同时,因为互联网的发展,网络服务器市场增长很快,对 64 位高端处理器芯片需求大增。这样在几年里,AMD 的业绩不断上涨,一度占有 40% 左右的处理器市场,并且挑起和英特尔的价格战。AMD 同时在世界各地,状告英特尔的垄断行为。到去年年初,AMD 不仅在业绩达到顶峰,而且在对英特尔的反垄断官司上也颇有收获,欧盟等国开始约束英特尔。这样一来,英特尔就不能太小觑 AMD 这个小兄弟了。它决定给 AMD 一些颜色看看。在接下来的一年里,英特尔千呼万唤始出来的酷睿双核处理器终于面世了,性能高于 AMD 同类产品,英特尔重新恢复了它在产品上的领先地位。同时,英特尔在过去的几年里将生产线移到费用比硅谷低得多的俄罗冈州和亚利桑那州,以降低成本,然后,英特尔开始回应价格战。价格战的结果是,英特尔的利润率受到了一些影响,但是 AMD 则从盈利到大幅度亏损。英特尔重新夺回了处理器市场的主动权。现在,两家都是采用 65 纳米的半导体技术。在未来的几年里,英特尔因为在最新的 45 纳米技术上明显领先于 AMD,并且已经开始研发集成度更高的 32 纳米的芯片,它将对 AMD 保持绝对的优势。

我认为,总的来讲,英特尔并没有想彻底把 AMD 打死。因为留着 AMD 对它利大于弊。首先,它避免了反垄断的很多麻烦。今天 AMD 的股值只有英特尔的 5%,后者靠手中的现金就足以买下前者。但是,英特尔不能这么做,否则会有反垄断的大麻烦。其次,留着 AMD 这个对手对英特尔自身的技术进步有好处。柳宗元在他的“敌戒”一文中指出,“秦有六国,兢兢以强;六国既除,訑訑乃亡”。这条规律对于英特尔也适用。英特尔从 1979 年至今,将处理器速度,(如果以小数运算速度来衡量),提高了二十五万倍。如果没有诸多竞争对手的话,它是做不到这一点的。现在它的主要对手只有 AMD 了,从激励自己的角度讲也许要留着它,毕竟,AMD 在技术上不象当年的摩托罗拉和 IBM 那么让英特尔头疼。流传着这么一个玩笑,英特尔的人一天遇到了 AMD 的同行,便说,你们新的处理器什么时候才能做出来,等你们做出来了,我们才会有新的事做。

5. 天步艰难

谷歌研究院院长、美国“人工智能”教科书的作者彼得.诺威格博士有一句很经典的话在业界广为流传:当一个公司的市场份额超过 50% 以后,就不用再想去将市场份额翻番了。言下之意,这个公司就必须去挖掘新的成长点了。在 2000 年后,英特尔公司就是处于这样一个定位。现在,它已经基本上垄断了通用处理器的市场,今后如何发展是它必须考虑的问题。

虽然英特尔在整个半导体工业中仍然只占了一小块,但是,很多市场,尤其是低端的市场、比如存储器市场英特尔是进不去的,也没有必要进去,因此它的成长空间并没有想象的那么大。英特尔的特长是在处理器和与 PC 相关的芯片制造上,因此它很容易往这两个市场发展。但是,迄今为止,它在微机处理器之外的芯片开发上不很成功。比如,前几年,它花了好几个亿开发 PC 的外围芯片,最后以失败告终,现在不得不采用 Marvell 公司的芯片集(chip set)。除了计算机,现在许多电器和机械产品都需要用到处理器,比如,一辆中高档的奔驰轿车里面有上百个各种有计算功能的芯片,而手机对处理器芯片的需求就更不用说了。英特尔一度进入了高端手机处理器的市场,但是,由于英特尔公司开发费用太高,这个部门一直亏损,不得不于去年卖给了 Marvell 公司。至此,英特尔公司在微机处理器以外的努力全部失败。

英特尔公司的商业模式历来是靠大投入大批量来挣钱,同一代的芯片,英特尔的销量可是太阳公司的十倍甚至更多,因此,它可以花几倍于其他公司的经费来开发一个芯片。但是,当一种芯片市场较小时,英特尔公司很难做到盈利。现在,这是它面临的最大问题。

英特尔公司要做的第二件事就是防止开发精简指令集处理器公司例如 IBM 的死灰复燃。虽然在个人微机的市场上,英特尔 x86 系列的处理器在很长的时间内是不可替代的,因为有微软在操作系统中为它保驾。但是在服务器市场却不一定,因为,现在服务器主要的操作系统是开源的 Linux,而 Linux 在什么处理器上都可以运行,因此只要有一种处理器各方面性能明显优于英特尔的,购买服务器的客户就会考虑采用非英特尔的处理器。在能源紧缺的今天,服务器厂家对处理器最关心的已经不单单是速度,而是单位能耗下的速度。现在,一个酷睿处理器如果昼夜不停使用,一年的耗电量已经等同于它的价格。因此,今后处理器设计必须考虑能耗。虽然这两年英特尔已经开始重视这个问题,但是总的来讲,英特尔复杂指令的芯片不如精简指令的处理器设计简单,相对比较难做到低能耗。这样,精简指令集的处理器,有可能在服务器市场上和英特尔一争,虽然这不会动摇英特尔的根基。我个人认为,在个人微机以外,今后最重要的市场是游戏机市场。现在的游戏机早已不单单是为玩游戏设计的了,它们成为每个家庭的娱乐中心。IBM 等公司至少在目前在这个领域是领先的。IBM 已经垄断了任天堂、Sony 和微软三大游戏机的处理器市场。实际上,现在这些采用精简指令处理器的游戏机无论是从计算速度还是图形功能上讲,都已经超过了基于英特尔处理器的个人电脑。如果下一次技术革命发生在每个家庭的客厅,那么,IBM 无疑已经拔了头筹。

英特尔虽然雄霸个人电脑处理器市场,但随着个人微机市场的饱和,它远景不容乐观。从某种程度上讲,它是反摩尔定理最大的受害者,因为处理器的价格在不断下降。同时,它在新市场的开拓上举步艰难,很难摆脱“诺威格效应”的阴影。好在英特尔同时也是安迪-比尔定理的直接受益者,在可以预见的将来,它的发展很大程度上必须依赖于微软等公司软件的更新。

结束语

在个人微机时代,组装甚至制造微机是一件非常容易的事,连我本人都攒PC机卖过。因此,二十几年来,出现了无数的微机品牌,小到中关村攒出来的自己贴牌子的兼容机,大到占世界绝大部分市场的所谓品牌机,如戴尔、惠普和联想。虽然这些计算机配置和性能大相庭径,但是它们都使用微软的操作系统和英特尔系列的处理器。从这个角度讲,微机时代的领导者只有两个,软件方面的微软和硬件方面的英特尔。有人甚至把 PC 机行业称为英特尔/微软体制。

英特尔对世界最大的贡献在于,它证明了处理器公司可以独立于计算机整机公司而存在。在英特尔以前,所有计算机公司都必须自己设计处理器,这使得计算机成本很高,而且无法普及。英特尔不断地为全世界的各种用户提供廉价的、越来越好的处理器,直接地使个人微机得以普及。它大投入、大批量的做法成为当今半导体工业的典范。它无疑是过去二十年信息革命大潮中最成功的公司之一,但是今后除非它能找到新的成长点,否则它会随着 PC 时代的过去而进入自己平和的中老年期。

发表者:Google(谷歌)研究员 吴军

第四章 计算机工业的生态链(zz)

目录
1. 摩尔定理(Moore’s Law)
2. 安迪-比尔定理 (Andy and Bill’s Law)
3. 反摩尔定理 (Reverse Moore’s Law)

整个信息技术(Information Technologies,简称 IT)产业包括很多领域、很多环节,这些环节之间都是互相关联的。和世界上任何事物同样, IT 产业也是不断变化和发展并且有着它自身发展规律的。这些规律,被 IT 领域的人总结成一些定理,称为 IT 定理(IT Laws)。我们结合一些具体的例子,分几次介绍这些定理。在这一章中,我们将介绍摩尔定理、安迪-比尔定理和反摩尔定理。这三个定理和在一起,描述了 IT 产业中最重要的组成部分 — 计算机行业的发展的规律。


1. 摩尔定理(Moore’s Law)

科技行业流传着很多关于比尔•盖茨的故事,其中一个是他和通用汽车公司老板之间的对话。盖茨说,如果汽车工业能够像计算机领域一样发展,那么今天,买一辆汽车只需要 25 美元,一升汽油能跑四百公里。通用汽车老板反击盖茨的话我们暂且不论,这个故事至少说明计算机和整个 IT 行业的发展比传统工业要快得多。

最早看到这个现象的是英特尔公司的创始人戈登•摩尔(Gordon Moore)博士。早在 1965 年,他就提出,在至少十年内,集成电路的集成度会每两年翻一番。后来,大家把这个周期缩短到十八个月。现在,每十八个月,计算机等 IT 产品的性能会翻一番;或者说相同性能的计算机等 IT 产品,每十八个月价钱会降一半。虽然,这个发展速度令人难以置信,但几十年来 IT 行业的发展始终遵循着摩尔定理预测的速度。

一九四五年,世界上第一台电子计算机 ENIAC 的速度是能在一秒钟完成 5000 次定点的加减法运算。这个三十米长、两米多高的庞然大物,重 27 吨,耗电十五万瓦。今天,使用英特尔酷睿的个人电脑计算速度是每秒 500 亿次浮点运算,至少是 ENIAC 的一千万倍,体积耗电量就更不用比了。而当今(2007 年 6 月)世界上最快的计算机 IBM 的蓝色基因(BlueGene/L),速度高达每秒钟三百六十七万亿次浮点运算,是 ENIAC 的七百三十四亿倍,正好是每二十个月翻一番,和摩尔定理的预测大致相同。尽管计算机的速度如此,存储容量的增长更快,大约每十五个月就翻一番。1976 年,苹果计算机的软盘驱动器容量为 160KB,大约能存下 80 页的中文书。今天,同样价钱的台式个人电脑硬盘容量可以到 500GB,是当时苹果机的三百万倍,可以存得下北京大学图书馆藏书的全部文字部分。不仅如此,这十几年来,网络的传播速度也几乎是按摩尔定理预测的速度在增长。十三年前,我有幸成为中国第一批上网的用户,那时还是通过高能物理所到斯坦福大学线性加速实验室的一根专用线路和互联网相联,当时电话调制解调器的速度是 2.4K,如果下载谷歌拼音输入法需要八个小时。现在,商用的 ADSL 通过同样一根电话线可以做到 10M 的传输率,是十三年前的四千倍,几乎每年翻一番,下载谷歌拼音只要十秒钟左右。在世界经济的前五大行业中,即金融、信息技术(IT)、医疗和制药、能源和日用消费品,只有 IT 一个行业可以以持续翻番的速度进步。

人们多次怀疑摩尔定理还能适用多少年,就连摩尔本人一开始也只认为 IT 领域可以按这么高的速度发展十年。而事实上,从二战后至今,IT 领域的技术进步一直是每一到两年翻一番,至今看不到停下来的迹象。在人类的文明史上,没有任何一个其它行业做到了这一点。因此,IT 行业必然有它的特殊性。

和任何其它商品相比,IT 产品的制造所需的原材料非常少,成本几乎是零。以半导体行业为例,一个英特尔的酷睿双核处理器集成了二点九亿个晶体管,三十年前的英特尔 8086 处理器仅有三万个晶体管。虽然二者的集成度相差近一万倍,但是所消耗的原材料差不太多。IT 行业硬件的制造成本主要是制造设备的成本。据半导体设备制造商 Applied Materials 公司介绍,建一条能生产 65 纳米工艺酷睿双核芯片的生产线,总投资在 20 到 40 亿美元。去年,英特尔公司的研发费用为六十亿美元。当然,我们不能将它全部算到酷睿的头上,但是英特尔平均一年也未必能研制出一个酷睿这样的产品,所以它的研发费用应当和英特尔一年的预算相当。假如我们将这两项成本平摊到前一亿片酷睿处理器中,平均每片要摊上近一百美元。这样,当英特尔公司收回生产线和研发两项主要成本后,酷睿处理器就可以大幅度降价。去年英特尔处理器销量在两亿片左右,因此,一种新的处理器收回成本的时间不会超过一年半。通常,用户可以看到,一般新的处理器发布一年半以后,价格会开始大幅下调。当然,英特尔的新品此时也已经在研发中。

摩尔定理主导着 IT 行业的发展。首先,为了能使摩尔定理成立,IT 公司必须在比较短的时间内完成下一代产品的开发。这就要求,IT 公司在研发上必须投入大量的资金,这使得每个产品的市场不会有太多的竞争者。在美国,主要 IT 市场大都只有一大一小两个主要竞争者。比如,在计算机处理器芯片方面,只有英特尔和 AMD;在高端系统和服务方面,只有 IBM 和太阳;在个人电脑方面,是惠普和戴尔(戴尔这个有点奇怪,它的研发投入大么?)。其次,由于有了强有力的硬件支持,以前想都不敢想的应用会不断涌现。比如,二十年前,将高清晰度电影(1920 x 1080 分辨率)数字化的计算量连 IBM 的大型机也无法胜任;现在,一台笔记本大小的 Sony 游戏机就可以做到。这就为一些新兴公司的诞生创造了条件。比如,在十年前,不会有人去想办一个 YouTube 这样的公司,因为那时候网络的速度无法满足在网上看录像的要求;现在 YouTube 已经融入了老百姓的生活。同样,现在的研发必须针对多年后的市场。我们不妨往后看十年,如果我现在提出十年后每家上网的速度将提高一千倍,也许有人觉得我疯了。事实上,这是一个完全能够达到的目标。如果做到了这一点,我们每个家庭可以同时点播三部高清晰度、环绕立体声的电影,在三个不同的电视机上收看。还可以随时快进和跳跃到下一章节,在任何时候停下来后,下次可以接着看。在看三部电影的同时,我们可以把自己的照片、录像和文件等信息存到一个在线的服务器上,从家里访问起来就如同存在自己本机上一样快。这并不是我自己杜撰出来的幻想,而是思科(Cisco)和微软等公司实施的 IP TV 的计划。再次,现有的 IT 公司必须有办法消除摩尔定理带来的不利因素,即每十八个月价格降一半。这一点,我们在接下来的两节中在讨论。

2. 安迪-比尔定理 (Andy and Bill’s Law)

摩尔定理给所有的计算机消费者带来一个希望,如果我今天嫌计算机太贵买不起,那么我等十八个月就可以用一半的价钱来买。要真是这样简单的话,计算机的销售量就上不去了。需要买计算机的人会多等几个月,已经有计算机的人也没有动力更新计算机。其它的 IT 产品也是如此。

事实上,在过去的二十年里,世界上的个人微机销量在持续增长。2004 年,英特尔公司估计,五年内,即到 2009 年,世界上 PC(包括个人机和小型服务器)的销量会增长 60%,远远高于经济的增长。那么,是什么动力促使人们不断地更新自己的硬件呢?IT 界把它总结成安迪-比尔定理,即比尔要拿走安迪所给的(What
Andy gives, Bill takes away)。

安迪是原英特尔公司 CEO 安迪•格鲁夫(Andy Grove),比尔就是微软的创始人比尔•盖茨。在过去的二十年里,英特尔处理器的速度每十八个月翻一番,计算机内存和硬盘的容量以更快的速度在增长。但是,微软的操作系统等应用软件越来越慢,也越做越大。所以,现在的计算机虽然比十年前快了一百倍,运行软件感觉上还是和以前差不多。而且,过去整个视窗操作系统不过十几兆大小,现在要几千兆,应用软件也是如此。虽然新的软件功能比以前的版本强了一些,但是,增加的功能绝对不是和它的大小成比例的。因此,一台十年前的计算机能装多少应用程序,现在的也不过装这么多,虽然硬盘的容量增加了一千倍。更糟糕的是,用户发现,如果不更新计算机,现在很多新的软件就用不了,连上网也是个问题。而十年前买得起的车却照样可以跑。

这种现象,乍一看来是微软在和大家做对。实际上,盖茨本人和其它厂商也不想把操作系统和应用程序搞得这么大。据了解,盖茨本人多次说,他过去搞得 BASIC 只有几十 K,你们(微软工程师们)搞一个.NET 就要几百兆,其中一定可以优化。当然,我们知道微软现在的.NET 比二十年前的 BASIC 功能要强的多,但是否强了一万倍,恐怕没有人这么认为。这说明,现在软件开发人员不再像二十年前那样精打细算了。我们知道,当年的 BASIC 解释器是用汇编语言写成的,精炼得不能再精炼了,否则在早期的 IBM-PC 上根本运行不了。但是,要求软件工程师使用汇编语言编程,工作效率是极低的,而且写出的程序可读性很差,不符合软件工程的要求。今天,由于有了足够的硬件资源,软件工程师做事情更讲究自己的工作效率,程序的规范化和可读性等等。另外,由于人工成本的提高,为了节省软件工程师写程序和调程序的时间,编程的语言越来越好用,同时效率却越来越低。比如,今天的 Java 就比 C++ 效率低得多,C++ 又比二十年前的 C 效率低。因此,即使是同样功能的软件,今天的比昨天的占用硬件资源多是一件在所难免的事。

虽然用户很是烦恼新的软件把硬件提升所带来的好处几乎全部用光,但是在 IT 领域,各个硬件厂商恰恰是靠软件开发商用光自己提供的硬件资源得以生存。举个例子,到去年上半年为止,因为微软新的操作系统 Vista 迟迟不能面市,从英特尔到惠普、戴尔等整机厂商,再到 Marvell 和 Seagate 等外设厂商,全部销售都受到很大的影响,因为用户没有更新计算机的需求。这些公司的股票不同程度地下跌了 20% 到 40%。去年底,微软千呼万唤始出来的 Vista 终于上市了,当然微软自己的业绩和股票马上得到提升,萧条了一年多的英特尔也在今年初扭转的颓势,当然惠普和戴尔也同时得到增长。今年,这三家公司的股票都有大幅度上涨。接下来不出意外的话,该轮到硬盘、内存和其它计算机芯片的厂商开始复苏了。Vista 相比前一个版本 XP,也许多提供了 20% 的功能,但是它的内存使用几乎要翻两番,CPU 使用要翻一番,这样,除非是新机器,否则无法运行 Vista。当然,用户可以选择使用原来的操作系统 XP,但是很快的,微软和其它软件开发商会逐渐减少对 XP 系统的支持,这样就逼着用户更新机器。

我们可以看出,个人电脑工业整个的生态链是这样的:以微软为首的软件开发商吃掉硬件提升带来的全部好处,迫使用户更新机器让惠普和戴尔等公司收益,而这些整机生产厂再向英特尔这样的半导体厂订货购买新的芯片、同时向 Seagat e等外设厂购买新的外设。在这中间,各家的利润先后得到相应的提升,股票也随着增长。各个硬件半导体和外设公司再将利润投入研发,按照摩尔定理制定的速度,提升硬件性能,为微软下一步更新软件、吃掉硬件性能做准备。华尔街的投资者都知道,如果微软的开发速度比预期的慢,软件的业绩不好,那么就一定不能买英特尔等公司的股票了。

对用户来讲,现在买一台能用的计算机和十年前买一台当时能用的计算机,花出去的钱是差不多的,如果不是“中国制造”效应的影响,还会因为通货膨胀略有提高。(这句话是不是应该是这样:如果不是“中国制造”效应的影响,对用户来讲,现在买一台能用的计算机和十年前买一台当时能用的计算机,花出去的钱是差不多的,甚至还会因为通货膨胀略有提高。原来的意思是现在同原来没有什么差别,因为我自己感觉是便宜了。修改后的结果是因为中国制造,现在比原来便宜了。)当然,微软和其它软件开发商在吃掉大部分硬件提升好处的同时,或多或少地会给用户带来一些新东西。

如果说在美国,始于二十年前的信息革命是基于个人电脑和互联网的,那么在亚洲,主流则是手机和移动通信。今天的手机一般都有两个处理器,一个数字信号处理器(DSP)和一个与微机处理器类似的通用处理器(CPU)今天,一个中档手机的计算性能,超过了五年前的个人微机,而且还按着摩尔定理预计的速度在增长。虽然在手机行业,并没有一个类似微软的通用操作系统公司存在,但是手机制造商自己、运营商和增值服务商加在一起起到了微软的作用。它们在提供新的但是越来越消耗资源的服务,使得用户不得不几年更新一次手机。

就这样,安迪-比尔定理把原本属于耐用消费品的电脑、手机等商品变成了消耗性商品,刺激着整个 IT 领域的发展。

3. 反摩尔定理 (Reverse Moore’s Law)

Google(谷歌)的 CEO 埃里克•施密特在一次采访中指出,如果你反过来看摩尔定理,一个 IT 公司如果今天和十八个月前卖掉同样多的、同样的产品,它的营业额就要降一半。IT 界把它称为反摩尔定理。反摩尔定理对于所有的 IT 公司来讲,都是非常可悲的,因为一个 IT 公司花了同样的劳动,却只得到以前一半的收入。反摩尔定理逼着所有的硬件设备公司必须赶上摩尔定理规定的更新速度。事实上,所有的硬件和设备生产厂活得都是非常辛苦的。下表中列举了各个领域最大的公司今天的股值和他们最高值地比例。

IBM: 82%.
CISCO: 40%
Intel: 33%
AMD: 30%
Marvel: 60%
HP: 70%
Dell: 35%
Sun Microsystems: 10%
Motorola: 33%

这里面,除了 IBM 不单纯是硬件厂商,而有很强的服务和软件收入得以将股票维持在较高的水平,其余的公司和它们最好水平相去甚远。而今天,美国股市几乎是在历史最高点。这说明,以硬件为主的公司因为反摩尔定理的影响,生计之艰难。如果有兴趣读一读这些公司财报的话,就会发现,这些公司的发展波动性很大,一旦不能做到摩尔定理规定的发展速度,它们的盈利情况就会一落千丈。有的公司甚至会有灭顶之灾,比如十年前很红火的 SGI 公司。即使今天它们发展的不错,却不能保证十年以后仍然能拥有翻番进步,因此,投资大师巴菲特从来不投这些 IT 公司。

事实上,反摩尔定理积极的一面更为重要,它促成科技领域质的进步,并为新兴公司提供生存和发展的可能。和所有事物的发展一样,IT 领域的技术进步也有量变和质变两种。比如说,同一种处理器在系统结构(Architecture)没有太大变化,而只是主频提高了,这种进步就是量变的进步。当处理器由十六位上升到三十二位,再到六十四位时,就有了小的质变。如果哪一天能用到纳米技术或者生物技术,那么就做到了质的飞跃,半导体的集成度会有上百倍的提高。为了赶上摩尔定理预测的发展速度,光靠量变是不够的。每一种技术,过不了多少年,量变的潜力就会被挖掘光,这时就必须要有革命性的创造发明诞生。

在科技进步量变的过程中,新的小公司是无法和老的大公司竞争的,因为后者在老的技术方面有无以伦比的优势。比如,木工厂出身的诺基亚在老式的模拟手机上是无法和传统的通信设备老大摩托罗拉竞争的。但是,在抓住质变机遇上,有些小公司会做得比大公司更好而后来居上,因为它们没有包袱,也比大公司灵活。这也是硅谷出现了众多的新技术公司的原因。

十三年前,我最早上网时用的是一个 2.4千 波特率(Kbps)的调制解调器。两年后,我的一个同学,中国最早的互联网公司东方网景的创始人送了我一个当时最新的 14.4 Kbps 的调制解调器,我马上感觉速度快多了。由于我们今天数字电话传输率本身限制在 64Kbps,因此调制解调器的传输率最多到 56Kbps,所以到 1995 年,我的几个同事就预言用电话线上网速度超不过这个极限。如果停留在用传统的方法对调制解调器提速,确实要不了几年摩尔定理就不适用了。但是到了九十年代,出现了 DSL 技术,可以将电话线上的数据传输速度提高近二百倍。DSL 技术虽然最早由贝尔核心实验室发表,但真正把它变为实用技术的是斯坦福大学的约翰•查菲教授。查菲教授三十几岁就成为了 IEEE 的资深会员(Fellow),刚四十岁就成为了美国工程院院士。1991 年,他带着自己的几个学生,办起了一家做 DSL 的小公司 Amati。1997 年,他把 Amati 公司以四亿美元的高价卖给了德州仪器(TI)。这是硅谷新技术公司典型的成功案例。在调制解调器发展的量变阶段,就不会有 Amati 这样的小公司出现,即使出现了,也无法和德州仪器竞争。但是,一旦调制解调器速度接近原有的极限时,能够突破这个极限的新兴公司就有机会登上历史的舞台。

反摩尔定理使得 IT 行业不可能像石油工业或者是飞机制造业那样只追求量变,而必须不断寻找革命性的创造发明。因为任何一个技术发展赶不上摩尔定理要求的公司,用不了几年就会被淘汰。大公司们,除了要保持很高的研发投入,还要时刻注意周围和自己相关的新技术的发展,经常收购有革命性新技术的小公司。它们甚至出钱投资一些有希望的小公司。在这方面,最典型的代表是思科公司,它在过去的二十年里,买回了很多自己投资的小公司。

反摩尔定理同时使得新兴的小公司有可能在发展新技术方面和大公司处在同一个起跑线上。如果小公司办得成功,可以像 Amati 那样被大公司并购(这对创始人、投资者以及所有的员工都是件好事)。甚至它们也有可能取代原有大公司在各自领域中的地位。例如,在通信芯片设计上,广通(BroadCom)和 Marvell 在很大程度上已经取代了原来的朗讯的半导体部门,甚至是英特尔公司在相应领域的业务。

当然,办公司是需要钱的,而且谁也不能保证对一个新兴公司的投资一定能够得到收益。有些愿意冒风险而追求高回报的投资家将钱凑在一起,交给既懂得理财又懂得技术的专业人士打理,投给有希望的公司和个人,这就渐渐形成了美国的风险投资机制。办好一个高科技公司还需要有既志同道合又愿意承担风险的专业人才,他们对部分拥有一个公司比相对高的工资更感兴趣,因此就有了高科技公司员工的期权制度。

IT 行业发展至今,自有它的生存发展之道。它没有因为价格的不断下降而萎缩,而是越来越兴旺。我们以后还会陆续介绍它的发展规律。

发表者:Google(谷歌)研究员 吴军

常用符号的英文读音

English Symbol:
\ backslash
/ slash (solidus)
{ left curly brace
} right curly brace
! exclamation mark
" quotation mark
% percent sign
& ampersand
( left parenthesis
) right parenthesis
* asterisk (star)
, comma
- hyphen
. period (fullstop)
# number sign
$ dollar sign
' apostrophe
: colon
; semicolon
< less than
= equals sign
> greater than
? question mark
@ commercial at
[ left square bracket
] right square bracket
^ caret
_ underscore (horizontal bar)
` acute accent
~ tilde
| vertical bar

Latin characters
α.Α.alpha β.Β.beta γ.Γ.gamma δ.Δ.delta
ε.Ε.epsilon ζ.Ζ.zeta η.Η.eta θ.Θ.theta
ι.Ι.iota κ.Κ.kappa λ.Λ.lambda μ.Μ.mu
ν.Ν.nu ξ.Ξ.xi ο.Ο.omicron π.Π.pi
ρ.Ρ.rho σ.Σ.sigma τ.Τ.tau υ.Υ.upsilon
φ.Φ.phi χ.Χ.chi ψ.Ψ.psi ω.Ω.omega

2007年10月25日星期四

感冒琐记(I catch a cold)

上周天气变化,可还是不愿意大早的就穿上冬装,于是毫无意外的就感冒了。头几天没在意,结果周六突然加重,卷纸不离手。遂重视,去药店买药,还不放心,又去校医院看病,着实被忽悠了一下(看感冒去五官科,没见识过吧)。后来想开了,自愈吧。又适逢考试,不能不准备。好在考试当天状况虽未好转,但亦没恶化。题目还在范围之内,感觉时间过的好快,中间碰到一个ping不通的问题,可是惊出了一身冷汗,好在马上发现错误的原因。事到临头光紧张是没用的,哪怕只有几分钟也要利用起来。早二十分钟交卷和早五秒钟交卷的效果是一样的。
千里之外的老爸老妈可就舒心多了,这周六又要去浙江普陀山游玩,在此祝他们旅途愉快。

2007年10月14日星期日

十一国庆纪实(Trip on National Day)

忍着十九小时的硬座,终于回到了家中,好好享受这个十一假期。
假期旅游的主要目标是南京,在驻地太阳宫和老爸游游泳。第二天出发去总统府,顺带着参观当年周总理呆过的梅园,下午陪老妈去夫子庙,顺便看看过去“高考”的“考场”,尝尝那里的小吃。

2007年9月4日星期二

VS.NET连SourceOffSite

SourceOffSite是一款基于SourceSafe的源代码管理工具。首先在装好客户端,在VS中选择
Tools ->Options ->Source Control -> Current source control plug-in: 通常为None,改为SourceOffSite。顺便吧Environment中的Checked-in item behavior下的选项改为Prompt for check out,以符合VC6下的修改习惯。
如果还有部分包连不上,查看File ->Source Control -> Change Source Control: 里面没连上的包会显示<no server>,手工把它Bind到服务器上对应的目录就行。

又要重新开始编代码了,这次的平台移回到了.NET。还得适应一段,莫名的资源高消耗,机子慢得不行。

如何获取和管理专利文献

这是一篇从网上收集来的文章,讲的东西虽然Google一下都有,不过整理过的便于收藏。

互联网上的专利宝藏

从事科研工作,离不开科技文献,而一类重要的科技文献就是专利文献。专利文献是技术情报、法律情报和经济情报的重要来源。通过专利,我们可以了解最新科研动态,研究课题开发现状、技术水平和法律状态,少走弯路,极大缩短科研工作进度,避免无谓的损失。

随着互联网的发展,各个国家的专利局和国际专利组织均开辟网站,免费提供该国或该组织的专利文献检索与下载服务。在当今社会,利用专利网站检索下载专利文献指导自己的工作,是一个技术人员的基本功。可以这样说,互联网上的免费专利文献,是一个巨大的宝藏,而我们的目的,是从这个巨大的宝藏中,找到属于自己的珍宝。

如何从网上检索专利

最常使用的专利文献检索网站有:中国知识产权局网站、美国商标专利局网站、欧洲专利局网站和世界知识产权组织网站,如果要检索日文专利,则日本特许厅网站不容错过。

1. 中华人民共和国国家知识产权局(SIPO)

网址为:http://www.sipo.gov.cn/sipo/default.htm
检索专利的入口网址为:http://www.sipo.gov.cn/sipo/zljs/default.htm

这里是检索中国专利的必到之处,可以对1985年以来已经公开的中国专利文献进行检索、下载。专利文献为TIFF图像格式,需要下载专门的TIFF浏览器插件即可在IE浏览器中直接阅读专利文献,若要保存该页文献,在图片上点击右键,选择另存即可。

检索入口提供了专利号、名称、摘要、申请日、申请人等16个检索项,并可选择发明、实用新型、外观设计还是全部专利进行检索,非常方便。检索系统支持逻辑式“and”和“or”,还提供了模糊检索功能,使用符号%。比如,如果想检索专利名称中包括“照相机”,则直接在专利名称中输入“照相机”,如果想找到专利名称包括“照相机”和“快门”而且照相机在快门的前面,只要在专利名称检索项中输入“照相机%快门”便可。

2. 美国专利商标局(USPTO)

网址为:http://www.uspto.gov
检索专利的入口网址为:http://www.uspto.gov/patft/index.html

美国是当今经济与科技最发达的国家之一,因此,也是重要的专利文献检索目标国。专利数据库中包括了美国1790年7月31日以来的所有授权专利。其中, 1790年至1976年的专利只有图像格式,1976年1月以后的授权专利可以进行全文检索,还可以查询2001年3月15日以后公开的专利申请文件。 1976年后的专利文献的格式为HTML格式,用IE浏览器直接阅读即可,也可直接另存,但其缺点为仅有文字内容,没有图像。若需要专利所附的图像,则需要点击该页面上的“IMAGE”按钮,可下载TIFF格式的专利文献。若安装了TIFF浏览器插件,也可直接在浏览器中阅读。

专利数据库每周二更新一次,该专利数据库的特点是专利文献提供引用专利链接,可以立即从某个专利直接链接到其引用的专利,方便追踪技术发展。

数据库提供三种检索模式:快速检索(Quick Search)、高级检索(Advanced Search)、专利号检索(Number Search)。1790-1976年的专利只能从专利号、美国专利分类号进行检索。
快速检索模式通过关键词和逻辑式“and”“or”“not”进行,高级检索通过搜索项代码和关键词组合,中间加上斜杠进行检索,例如,申请人的搜索项代码为AN,关键词为微软microsoft,则搜索语句为:AN/microsoft,经检索发现,微软公司自1976年以来,一共获得了3811项专利。而专利号检索则比较简 单,知道专利号,直接从这个模式进行检索最方便快捷。

3. 欧洲专利局(EPO)
网址为:http://www.european-patent-office.org
专利文献检索和阅读的入口网址为:http://ep.espacenet.com

欧洲专利文献数据库除了能检索阅读欧洲专利,还可检索美国、日本、PCT等50多个国家和专利组织的专利文献,并能免费获取20多个国家的专利文献。文献格式为PDF格式,可按页下载保存,用免费软件Adobe Acrobat Reader打开阅读。该专利文献数据库是科技人员最常用的数据库。

该专利数据库的最大特点可以查询同族专利(同一个专利在不同国家申请的专利),这样,可以很方便地找到非英文专利的英文文本,便于克服语言障碍。

数据库提供四种检索模式,快速检索(Quick Search)、高级检索(Advanced Search)、专利号检索(Number Search)和分类号检索(Classification Search),支持逻辑式和通配符,比如,查询所有以micro打头的词,可以输入“micro*”进行检索。

除了使用该入口,欧专局专利文献检索还可以通过其组织的27个成员国的入口进行检索(27个成员国入口网址附后),这样,不仅仅提供了不同种语言的选择,还可以通过这些入口,检索到该成员国的专利申请文献。

4. 世界知识产权组织(WIPO)

网址为:http://www.wipo.int
专利文献检索和阅读的入口网址为:http://www.wipo.int/ipdl/en

世界知识产权组织的可以检索PCT专利申请文献,收录了1997年1月1日以来PCT公布的专利申请原始资料,包括了题录、文摘和扫描的图像,文献数据更新比较快,PCT专利申请公开后2-3天以后便可免费查询到全文。

数据库的检索模式与美国专利商标局数据库类似,也是以搜索项代码和关键词组合进行检索。该网站还可以申请免费账号,如果通过登录账号的模式进行检索,则可以保留检索历史和检索记录,方便日后的追踪。专利文献的格式为PDF格式,使用免费软件Adobe Acrobat Reader打开阅读。

5. 日本特许厅(JPO)

网址为:http://www.jpo.go.jp
专利文献检索英文入口网址为:http://www.ipdl.ncipi.go.jp/homepg_e.ipdl

日本是专利大国,对日本专利的研究非常重要。日本特许厅提供了日本专利的英文检索入口,方便了不懂日文的人员进行检索。当然,如果精通日文,使用日文进行检索是最好的选择。

日本的专利号使用了日本年号纪元,昭和年+25=公元年,平成年+88=公元年。英文入口提供了1976年以来的日本公开特许(也就是发明申请公开)英文文摘数据库,并自1993年1月开始包括了法律状态信息。英文检索结果可以链接到电脑翻译的专利公报全文,如果需要看日文原始文献,只需要点击日文按钮,便可以获得GIF图片格式的说明书。

快速获取专利文献

各个国家的专利文献全文下载非常不方便,主要表现为专利文献下载必须用鼠标逐页点击,按页保存,保存好的专利文件也是分成许多个文件,每个文件为专利文献的一页,阅读很不方便。因此,出现了许多专利下载和专利合并软件,大多为免费软件或者共享软件,用“专利下载软件”作为关键词在google上搜索可以获得许多这类软件。

在这里,只介绍一个较为优秀的专利下载共享软件GetIPDL,它解决了下载的麻烦,只要输入专利号,然后点击下载,即可由该软件自动将相应专利全文下载到本地,并将下载后的多个文件,合并成一个文件。使用该软件,既加快了下载的速度,也便于日后的使用和管理。

GetIPDL为日本人编写的专利下载共享软件,其英文版下载地址为:http://www.ujihara.jp/GetIPDL/en/,目前最新版本2.14.19。下载后,安装文件大小为4.6M。

GetIPDL支持世界上多个专利局专利文献的下载,包括日本特许厅(JPO)、美国专利商标局(USPTO)、欧洲专利局(EPO)、中国知识产权局(SIPO)等9个专利局。专利文件的下载非常简单,只要把检索到需要下载的专利文献的专利号复制到软件Patent Numbers区域,并选择相应专利局服务器,点击“Download”按钮,软件便自动进行专利文献下载,并自动合并为一个TIFF、PDF或者 HTML文件。

GetIPDL软件的Search菜单内置了该软件支持的多个专利局检索入口链接,也方便了用户对专利进行检索。Tools菜单中可设置一些下载的选项,包括下载目录、起始时间等等。

该软件使用方便,加快了专利的检索与下载速度,方便科技工作者对下载专利文献的管理、阅读与使用。唯一的遗憾是,该软件为共享软件,注册费89美元。未注册版本与注册版本的区别是,未注册版本只能下载不超过10页的专利,且不能同时下载多篇专利。

附录

1. 其他重要的专利检索入口

加拿大专利检索 http://patents1.ic.gc.ca/intro-e.html
台湾专利检索 http://www.patent.org.tw/
韩国专利检索 http://www.kipris.or.kr/new_kipris/index.jsp 需要注册
Delphion 专利检索 http://www.delphion.com/simple 仅提供美国专利免费检索
Derwent专利检索 http://thomsonderwent.com/products/patentresearch/dwpi/ 需付费
德国专利检索 http://publikationen.dpma.de/set_lng.do?loc=en" TARGET=_blank> http://publikationen.dpma.de/set_lng.do?loc=en
法国专利检索 http://www.boutique.inpi.fr/inpiboutic/index_anglais.htm
俄罗斯专利检索 http://www.fips.ru/ensite/

2. 欧洲专利局各国专利检索入口

国家 网址 支持语言
奥地利 http://at.espacenet.com/ 德语
比利时 http://be.espacenet.com/ 荷、法、德、英语
保加利亚 http://bg.espacenet.com/ 保加利亚语
塞浦路斯 http://cy.espacenet.com/ 希腊语、英语
捷克 http://cz.espacenet.com/ 捷克语
丹麦 http://dk.espacenet.com/ 丹麦语
爱沙尼亚 http://ee.espacenet.com/ 爱沙尼亚语
芬兰 http://fi.espacenet.com/ 芬兰语
法国 http://fr.espacenet.com/ 法语
德国 http://de.espacenet.com/ 德语
希腊 http://gr.espacenet.com/ 希腊语
匈牙利 http://hu.espacenet.com/ 匈牙利语
爱尔兰 http://ie.espacenet.com/ 英语
意大利 http://it.espacenet.com/ 意大利语
列支敦士登 http://li.espacenet.com/ 法、德、意大利语
卢森堡 http://lu.espacenet.com/ 法语
摩纳哥 http://mc.espacenet.com/ 法语
荷兰 http://nl.espacenet.com/ 荷兰语
葡萄牙 http://pt.espacenet.com/ 葡萄牙语
罗马尼亚 http://ro.espacenet.com/ 罗马尼亚语
斯洛文尼亚 http://sk.espacenet.com/ 斯洛文尼亚语
西班牙 http://es.espacenet.com/ 西班牙语
瑞典 http://se.espacenet.com/ 瑞典语
瑞士 http://ch.espacenet.com/ 德、法、意大利语
土耳其 http://tr.espacenet.com/ 土耳其语
英国 http://gb.espacenet.com/ 英语

3. 阅读专利文献所用软件
AlternaTIFF
下载地址:http://www.alternatiff.com/install/

Adobe Acrobat Reader中文版
下载地址:http://www.chinese-s.adobe.com/products/acrobat/readstep2.html

4. 其他专利下载软件

Patsee pro 4.10 http://www.imageapps.com/software.html 可下载欧专局、美国、德国、加拿大专利文献,注册费250英镑。
PatentOrder 2.0 http://www.patentorder.com/ 可下载欧、美、法、荷、德、加、日、中等多个国家专利文献,试用版可免费全功能使用7天。注册费约800美元左右。
Patmate 2.01 http://www.patmate.com/ 支持欧、荷、美、日、韩专利下载,注册费99美元。
PatentHunter 3.0 http://www.patenthunter.com/ 美、欧专利检索下载,注册费每年69美元。
专利下载器 1.6 http://www.chemdocs.com/ 中文软件,支持欧、美、中、日专利文献下载,注册费60人民币。
InterneTIFF 5.5 http://www.internetiff.com/ 下载美国专利图形文档软件,注册费59.95美元。
随愿专利下载器 2.5.442 http://www.suiyuannet.com/PatentDown/ 中文软件,多个专利局的检索与下载,注册费300元人民币。
ipMAGNET 2.5 http://www.mayamiya.com/ 美、欧、德、加专利文献下载,注册费99美元。

2007年9月3日星期一

#pragma指令解析

转自CSDN
在所有的预处理指令中,#Pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作。#pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的情况下,给出主机或操作系统专有的特征。依据定义,编译指示是机器或操作系统专有的,且对于每个编译器都是不同的。
其格式一般为: #Pragma Para 其中Para 为参数,下面是一些常用的参数。

(1)message 参数。 Message 参数能够在编译信息输出窗口中输出相应的信息,这对于源代码信息的控制是非常重要的。其使用方法为:
#Pragma message(“消息文本”)
当编译器遇到这条指令时就在编译输出窗口中将消息文本打印出来。
在程序中定义了许多宏来控制源代码版本的时候,我们自己有可能都会忘记有没有正确的设置这些宏,此时可以用这条指令在编译的时候就进行检查。假设我们希望判断自己有没有在源代码的什么地方定义了_X86这个宏可以用下面的方法
#ifdef _X86
#Pragma message(“_X86 macro activated!”)
#endif
当定义了_X86这个宏以后,应用程序在编译时就会在编译输出窗口里显示“_X86 macro activated!”。就不会因为不记得自己定义的一些特定的宏而抓耳挠腮了。

(2)另一个使用得比较多的pragma参数是code_seg。格式如:
#pragma code_seg( ["section-name"[,"section-class"] ] )
它能够设置程序中函数代码存放的代码段,当我们开发驱动程序的时候就会使用到它。

(3)#pragma once (比较常用)
只要在头文件的最开始加入这条指令就能够保证头文件被编译一次,这条指令实际上在VC6中就已经有了,但是考虑到兼容性并没有太多的使用它。

(4)#pragma hdrstop表示预编译头文件到此为止,后面的头文件不进行预编译。BCB可以预编译头文件以加快链接的速度,但如果所有头文件都进行预编译又可能占太多磁盘空间,所以使用这个选项排除一些头文件。
有时单元之间有依赖关系,比如单元A依赖单元B,所以单元B要先于单元A编译。你可以用#pragma startup指定编译优先级,如果使用了#pragma package(smart_init) ,BCB就会根据优先级的大小先后编译。

(5)#pragma resource "*.dfm"表示把*.dfm文件中的资源加入工程。*.dfm中包括窗体外观的定义。

(6)#pragma warning( disable : 4507 34; once : 4385; error : 164 )
等价于:
#pragma warning(disable:4507 34) // 不显示4507和34号警告信息
#pragma warning(once:4385) // 4385号警告信息仅报告一次
#pragma warning(error:164) // 把164号警告信息作为一个错误。
同时这个pragma warning 也支持如下格式:
#pragma warning( push [ ,n ] )
#pragma warning( pop )
这里n代表一个警告等级(1---4)。
#pragma warning( push )保存所有警告信息的现有的警告状态。
#pragma warning( push, n)保存所有警告信息的现有的警告状态,并且把全局警告等级设定为n。
#pragma warning( pop )向栈中弹出最后一个警告信息,在入栈和出栈之间所作的一切改动取消。例如:
#pragma warning( push )
#pragma warning( disable : 4705 )
#pragma warning( disable : 4706 )
#pragma warning( disable : 4707 )
//.......
#pragma warning( pop )
在这段代码的最后,重新保存所有的警告信息(包括4705,4706和4707)。
(7)pragma comment(...)
该指令将一个注释记录放入一个对象文件或可执行文件中。
常用的lib关键字,可以帮我们连入一个库文件。如
#pragma comment(lib, "EsMathD.lib")

2007年9月2日星期日

第三章 “水果”公司的复兴(Apple)(zz)

目录
1. 传奇小子
2. 迷失方向
3. 再创辉煌
4. 大难不死

看过汤姆·汉克斯主演的电影 “阿甘正传”的读者,也许还记得那么一个镜头。傻人有傻福的阿甘最后捧着一张印有苹果公司标志的纸说,我买了一个水果公司的股票,有人说我这一辈不用再为钱发愁了。那是九十年代初的电影,导演挑中了苹果公司,因为它的股票确实在几年间涨了十倍。

几年前,我在硅谷的库帕蒂诺市(Cupertino)找房子,有一次来到了一个办公楼和公寓混杂的社区,那里到处是各种颜色的、被咬了一口的苹果标志。那里就是今天大名鼎鼎的 iPod 和 iPhone 的制造者苹果公司的总部了。那时苹果公司还不太景气,想把办公楼租给刚刚开始腾飞的 Google(谷歌)。幸好这笔生意没有谈成,否则,那片狭小的社区无论如何是容不下当今两个发展最快的公司。

生于六七十年代的人,可能对世界上最早的个人电脑苹果机还有印象。而生于八九十年代的人,可能对很酷的 iPod 影响更深。苹果最初是便宜的低端品牌,现在成了高端的时尚品牌,这看似矛盾的两方面,通过苹果的创始人史蒂夫·乔布斯很好地结合了起来。

1. 传奇小子

在硅谷,可能没有人比史蒂夫·乔布斯更具有传奇色彩了。乔布斯可能是美国工程院唯一一个没有在大学读完一年书的院士。比尔·盖茨虽然没有大学毕业,毕竟正儿八经地上了两年。乔布斯只读了半年大学,又旁听了一段时间,然后就彻底离开了学校。他入选院士的原因是“开创和发展个人电脑工业”(For contributions to creation and development of the personal computer industry)。

乔布斯的生母是一名年轻的未婚在校研究生,因为自己无法在读书的同时带孩子,她决定将乔布斯送给别人收养。她非常希望找一个有大学学历的人家。先开始,她找了一对律师夫妇,但是那对夫妇想要个女孩。就这样,乔布斯就被送到了他的养父母家。但是,乔布斯的生母后来发现不仅他的养母不是大学毕业生,养父甚至连中学都没有毕业,于是她拒绝在最后的收养文件上签字。后来,乔布斯的养父母许诺日后一定送他上大学,他的生母也就答应了。

乔布斯高中毕业后进了一所学费很贵的私立大学。他贫困的养父母倾其所有的积蓄为他付了大学学费。读了半年,乔布斯一方面觉得学非所用,另一方面不忍心花掉养父母一辈子的积蓄,就退了学。但是,他并没有离开学校,开始旁听他感兴趣的、将来可能对他有用的课。乔布斯没有收入,靠在同学宿舍地板上蹭块地方睡觉,同时靠捡玻璃瓶、可乐罐挣点小钱。每星期天,为了吃一顿施舍的饭,他要走十公里到一个教堂去。当时,乔布斯只做自己想做的事。他所在的大学书法很有名,他也迷上了书法。虽然当时他还不知道书法以后有什么用,但是后来事实证明,乔布斯的艺术修养使得苹果公司所有的产品设计得非常漂亮。比如,以前的计算机字体很单调,乔布斯在设计苹果的 Macintosh 计算机时,一下子想到了当年漂亮的书法,为这种个人电脑设计了很漂亮的界面和字体。

1976 年,乔布斯二十岁时,和斯蒂芬·沃兹尼克(Steve Wozniak)以及韦恩(Wayne)三人在车库里办起了苹果公司,研制个人微机。后来韦恩退出,只剩下乔布斯和沃兹两人。当时一台计算机少说要上万美元,即使价钱降几倍也不可能进入老百姓家。在每一次技术革命中,新技术必须比老的有数量级的进步才能站住脚。乔布斯很清楚这一点,他必须让计算机价钱降几十倍、甚至上百倍才会有人要。为了降低成本,Apple-I 除了有一个带键盘的主机之外,什么外设都没有。但是,它有一个可以接家用电视的视频口,和一个接盒式录音机的接口,保证数据和程序可以存在一般的录音带上。而电视机和录音机在美国几乎家家都有。同年,两人研制出了世界上第一台通用的个人电脑 Apple-I。老百姓花上几百美元就可以买到。十年后,中国的电子工业部主持清华大学等几家单位攻关,研制出了被称为中华学习机的 Apple 的兼容机,当时售价也只有 400 人民币,而当时一台 IBM PC 要两万人民币,所以中华学习机不到两年就卖掉了十万台,超过其它微机同期在中国销售的总和。很遗憾,中国的这家公司,也是我工作的公司,非常不会经营,作风上很像个政府机关而不是商业公司,从来就没有发展起来。当然这是题外话了。

最早的苹果机实际上做不了什么事,只能让学计算机的孩子练习一下简单的编程和玩一点简单的诸如警察抓小偷的游戏。苹果机的操作也很不方便,一般老百姓是不会喜欢用它的。因此,它象征性的意义远比它实际意义要大得多,那就是计算机可以进入家庭。以前,DEC 的总裁认为,计算机进入家庭是最不切实际的假想。现在,乔布斯和他的同事做到了这一点。DEC 为他们的傲慢与偏见付出了代价。个人电脑的出现,强有力地冲击了 DEC 的小型机市场,1988 年,长期亏损的 DEC 终于支撑不下去了,被个人电脑公司康柏(Compaq)收购。乔布斯很清楚,像早期苹果机这样的玩具是无法让广大消费者长期喜欢的。事实上,当 IBM 推出了一款真正能用的 PC 后,一下就抢掉了苹果四分之三的市场。因此,乔布斯开始致力于研制一种真正能用的个人计算机。1984 年,第二代苹果机麦金托什(Macintosh)诞生了。

麦金托什是世界上第一种可以买得到的、拥有交互式图形界面并且使用鼠标的个人电脑。它的硬件部分性能略优于同期的 IBM PC 机,而它的操作系统领先当时 IBM-PC 的操作系统 DOS 整整一代。后者是命令行式的操作系统,用户必须记住所有的操作命令才能用计算机。今天,当我们已经习惯了使用交互式图形界面的 Windows 时,如果要我们退回到 DOS,我们会觉得很别扭。麦金托什和 IBM-PC 当年的差别就有 Windows 和 DOS 那么大。除了界面上的差别,麦金托什操作系统在内存管理上有 DO S不可比拟的优势,因为后者实际可用的内存始终局限在 640K,而前者没有任何限制。麦金托什一出来就卖得很好,因此无论从技术上讲还是从商业上讲,都是一个巨大的成功。

谈到麦金托什,必须提两点,第一,它的交互式图形窗口界面最早是从施乐(Xerox)公司帕洛阿图(Palo Alto,斯坦福大学所在地)实验室(Parc)研制出来的。帕罗阿图实验室可能是世界上最有创新同时也是最不会将发明创造变成商品的地方。它另一个改变了世界但是没有为施乐带来任何好处的发明是今天每个人都用的以太网。虽然苹果公司在图形界面用于操作系统上做出了卓越的贡献,但由于它毕竟最先由施乐发明,因此苹果在后来对微软的官司上并没有赚到便宜。第二,苹果走了一条封闭的道路,它不允许别人造兼容机,以便独吞 PC 市场。如果苹果开放了麦金托什的硬件技术,允许其他硬件厂商进入市场,我们今天可能使用的就不是 IBM PC 系列,而是苹果系列了。但是,因为苹果可能在硬件上竞争不过兼容机厂商,因此它只能扮演一个像微软一样的以操作系统为核心的软件公司角色。这时,两种系列的个人电脑胜负的关键就要看苹果和微软在操作系统上的决斗了。在没有兼容机帮忙的情况下,苹果无法挑战微软,虽然它努力试过,但最终败了下来。

到 1985 年为止,苹果发展顺利,拥有四千员工,股票市值高达 20 亿美元。乔布斯个人也很顺利,名利双收。但接下来,乔布斯遇到了别人一辈子可能都不会遇到的两件事—被别人赶出了自己创办的公司,然后又去鬼门关走了一遭。而苹果公司,也开始进入了长达十五年的低谷。

2. 迷失方向

1983 年,乔布斯说服了百事可乐公司的总裁斯库利(John Sculley)到苹果出任 CEO。斯库利以前在百事可乐工作了十几年,并成功地推广了百事可乐的品牌。以前,人们普遍认为可口可乐就是比其它的可乐好喝。斯库利发现大家有先入之见,他采用了双盲对比评测 — 发给大量测试者两瓶没有标签的可乐。结果更多的人认为百事好喝,斯库利打赢了市场之战。乔布斯请他来为苹果开拓市场,并负责苹果日常工作,自己则退出第一线专注于麦金托什的技术。如果说斯库利是统筹全局的宰相,乔布斯则是运筹帷幄的元帅。

斯库利一到苹果就试图让苹果成为 PC 机市场的主流。为了迎合市场的需要,斯库利在苹果搞出了无数种机型,同时提高了销售价格,将利润用来发展苹果新的成长点—Newton PDA(苹果的牛顿 PDA),最早的掌上机。乔布斯和斯库利头一年合作得很好;第二年,将相就开始失和了。乔布斯和斯库利之争持续了一年多,董事会最后站在了斯库利的一边。1985 年,斯库利胜利了,同时乔布斯被踢出他自己创办的苹果公司。那一年,乔布斯刚三十岁。一般的创业者三十岁时还未必能创建自己的公司,乔布斯这一年已经被自己的公司开除了。乔布斯一气之下,卖掉了他所有的苹果的股票。当时工作站很红火,乔布斯创立了一个做工作站的公司 NeXT,不是很成功。NeXT 工作站的图形功能很强,使得乔布斯想在动画制作上发展。于是他用五百万美元买下了电影“星球大战”导演卢卡斯创办的一个极不成功的动画制作室,并把它重构成一个用图形工作站做动画的工作室 Pixar 公司,这是今天世界上最好的动画工作室,后来被迪斯尼公司以七十四亿美元的高价收购,很多很好的动画片都是 Pixar 制作的。事实上,乔布斯从 Pixar 挣到的钱比他从苹果挣的还多。

斯库利在赶走乔布斯以后,让麦金托什顺着个人电脑的技术潮流向前飘了七八年。斯库利很清楚,以苹果领先的技术,即使不做任何事,也可以挣十年钱。他始终致力于开发新产品,努力为公司找新的成长点。但始终不得要领。到后来,不太大的苹果公司居然有上千个项目,大大小小的各级经理,为了提高自己的地位,到处招兵买马,上新项目。这些项目中,90% 都是没用的。事实证明,所有的项目中最后只有苹果新的操作系统是成功的。就连斯库利寄予厚望的牛顿 PDA 也没有形成什么气候。苹果的股票九十年代开始是上升的,这就是电影中的阿甘觉得持有了苹果的股票就不用为钱发愁的原因。如果那个电影晚拍几年,导演就不得不找另一家公司的股票给阿甘了。在斯库利当政的后期,麦金托什的市场占有率渐渐被微软挤得越来越小,而摊子却越铺越大,苹果公司开始亏损,斯库利不得不下台。斯库利的两个继任者也是回天无力。苹果被微软打得一塌糊涂,差点被卖给 IBM 和太阳公司(Sun Microsystems),但这两公司谁也看不上苹果这个市场不断萎缩的 PC 制造商。如果卖成了,今天大家就没有 iPod 了。

九十年代,苹果和微软还未就 Windows 侵权苹果的操作系统一事,打那好几年的官司。在微软推出 Windows 3.1 以后,IBM PC 机的用户也可以享受图形界面了,苹果的市场迅速萎缩。苹果公司将微软告上了法庭,因为 Windows 的很多创意实实在在是复制苹果的操作系统。在法庭上,微软的盖茨指出苹果的窗口式图形界面也是抄施乐的。盖茨说,凭什么你能破窗而入去施乐拿东西,我不可以从门里走到你那里拿东西呢?最后,法庭还是以 Windows 和苹果的操作系统虽然长得像,但不是一个东西为由,驳回了苹果的要求。那时硅谷的公司不但在商业竞争中被微软压着一头,连打官司也打不赢微软,十几年来硅谷一直梦想着有一个可以和微软抗衡并且占到上风的公司。

1998 年,苹果走投无路的董事会不得不把他们十三年前赶走的乔布斯请回来,执掌用乔布斯的话说“底下有个大洞的船”。在美国,董事会赶走一个公司创始人的情况虽然不常见,但还是发生过的。但是,再把那个被赶走的创始人请回来执掌公司,不仅以前没听说过,以后也很难再有。

3. 再创辉煌

苹果董事会起先对乔布斯的能力也没谱,便给了他一个临时 CEO 的职务。乔布斯也不在乎这个,他甚至答应一年只拿一块钱的工资。毕竟苹果公司是他的亲儿子,只要让他回苹果就什么都好说。我和硅谷很多创业者聊过,发现他们对自己的公司,哪怕再小的公司,在感情上也象对自己的孩子一样亲。乔布斯上台后推出了一些样子很酷的 PC 机,那时苹果机已经比 IBM 兼容机贵了很多,成了高端的产品,用户主要是很多搞艺术的人—他们很喜欢苹果优于其它个人电脑的图形功能——和一些赶时髦的学生和专业人士。乔布斯自己也更像一个才华横溢的艺术家,而不是一个严谨的工程师。既然苹果在微机领域已经不可能替代兼容机和微软的地位了,他干脆往高端发展,讲究性能、品味和时尚。慢慢地,苹果的产品成了时尚的东西。

乔布斯的运气很好,一上台就赶上了网络泡沫时代,那时什么公司的业绩都上涨,苹果也跟着上涨。由于苹果已经将自己定位在很窄的高端市场,就避免了与微软、戴尔和惠普的竞争。加上微软当时正被反垄断官司搞得焦头烂额,也无暇顾及苹果这个小弟弟了。苹果在乔布斯接手的两年里恢复得不错,董事会也在一年后将乔布斯扶正,任命他为正式的 CEO。

好景不长,随着网络泡沫的破碎,苹果公司的发展面临再次受到阻碍的可能。当然只要它老老实实地固守自己的高端市场,随着经济的复苏,苹果还会慢慢好起来,成为高端PC的制造商。如果只是这样的话,苹果就不值得我们在此大写特写了;而乔布斯也就不是乔布斯了。乔布斯的超人之处在于他善于学习,并且能把得准时代的脉搏。经过十几年磨练的乔布斯已经不是当年那个毛头小伙子了。他已经认识到了苹果封闭式的软硬件,从成本上讲,无法和微软加兼容机竞争,也无法为用户提供丰富的应用软件。乔布斯做了两件事,他在苹果的微机中逐渐采用了英特尔的通用处理器,同时采用 Free BSD 作新的苹果操作系统的内核。这样相对开放的体系使得全社会大量有兴趣的开源工程师很容易地为苹果开发软件。但是,至关重要的是如何为苹果找到 PC 以外的成长点,实际上,他已经接受了当年斯库利的观点。

斯库利明白新成长点的重要,但是他没有找到,苹果历任 CEO 都想做这件事而没有做到的。斯库利搞的个人助理想法不错,但是时机不成熟,因为那时无论是手机、电话还是互联网都没有发展起来,很少有人愿意花几百美元买一个无法联网的高级记事本。因此,这个产品的市场即使存在,也不过是一个很窄的市场,这样的产品不可能掀起一个潮流。斯库利的运气不太好,因为在他执掌苹果的年代,移动通信和互联网还没有发展起来以前,除了微机的发展形成了一种潮流,没有别的潮流。虽然苹果本来有可能成为微机领域的领导者,但它封闭式的做法,使得它战胜微软的可能性几乎是零。乔布斯比较幸运,他再次接掌苹果时,已经进入了到了网络泡沫时代。雅虎似乎代表了一种潮流,很多公司在跟随着雅虎,但事实证明,他们都面对着网络泡沫而且因此会面临严重的危机。乔布斯在网络泡沫时代,能高屋建瓴,不去趟互联网这滩浑水,而是看到了网络大潮下面真正的金沙。

上个世纪最后的十年,以互联网和多媒体技术为核心的一场技术革命开始了。互联网是信息传播的渠道,多媒体技术则提供了数字化的信息源。原来的录音带和录像带很快被激光唱盘和 DVD 代替,随着声音和图像压缩技术的出现,这些数字化了的音乐和录像很容易在互联网上传播。到九十年代末,互联网上充斥了各种盗版的音乐和电影。以前,音乐唱盘属于一个垄断的暴利行业,这个行业的一位朋友告诉我,音乐 CD 平均一张十美元左右,而除去版税后的制作成本总共只有十几美分到几十美分,视批量而定。现在网上有了不要钱的,音乐下载很快占整个互联网流量的四分之一,广大网民一下子学会了听下载的音乐、看下载的录像。同时,市场上出现了一些小的音乐播放器,但做的都不是很理想。虽然唱片公司集体告赢了帮助提供盗版音乐的 Napster 公司,盗版的音乐和录像很快从互联网中消失了。但是,用户用一个小播放器听音乐和歌曲的习惯已经养成了。

乔布斯看到了两点最重要的事实,第一,虽然已经有了不少播放器,但是做的都不好,尤其是当音乐数量多了以后,查找和管理都很难。要知道,从一千首歌里面顺序找到自己想听的可能要花几分钟时间。另外,要把自己以前买的几十张 CD 上的歌倒到播放器上更是麻烦;第二,广大用户已经习惯戴着耳机从播放器中听歌而不是随身带着便携的 CD 唱机和几十张光盘。因此,它不需要花钱和时间培养出一个市场。基于这两点的考虑,乔布斯决定开发被称为 iPod 的音乐和录像播放器。

苹果公司很好地解决了上面提到的两个技术问题。他们在播放器上设计了一个用手转圈划的音乐查找手段,使用户可以非常快地找到自己要听的歌。同时他们设计了一种叫 iTune 的软件装在个人电脑上,可以自动地把电脑上和光盘中的歌曲音乐传到 iPod 中。另外,iPod 的电池一次充电后的可播放的时间高达十个小时,比以往的各种播放器都长得多。同时,苹果 iPod 的外观设计非常漂亮,所以,从它在 2001 年一推出来,就很受爱听音乐的年轻人喜欢。仅一年,iPod 的销售就突破一亿美元。又过了一年多,iPod 的销售额接近 10 亿美元,占公司营业额的 15%。去年,iPod 的销售额近八十亿美元,占整个苹果收入的四成。苹果公司的股票从 2003 年的最低点开始,至今已经涨了 20 倍。今天,iPod 已经不仅仅是一个简单的播放器,而是一个不小的产业。不同的厂家,从音箱生产厂到汽车公司,都在主动为 iPod 设计和制造各种配套产品,比如音箱、耳机、汽车音响,甚至是皮套等等。就有点像有无数软件公司在微软的操作系统上主动开发应用程序。神奇小子乔布斯终于再现辉煌。

4. 大难不死

从 2004 年到 2006 年,乔布斯和苹果都经历的两场大的劫难,但都奇迹般地生存下来。

2004 年,乔布斯患上癌症,医生估计他最多还能活 3 到 6 个月。医生建议他回去把一切都安排好,其实就是在暗示他"准备后事"。医生马上给他做了手术,很幸运的是,那是一种少见的可治愈的恶性肿瘤。手术后,他很快就好了。这次经历,使乔布斯对死亡有了真正的认识。他认为,死亡推动着生命进化和变迁,旧的不去,新的不来。现在,新的人和新的技术,在不久的将来,也会逐渐成为旧的,也会被淘汰。苹果没有沉浸在 iPod 的成功中,加紧了新品的开发。

苹果公司这两年也不太顺,经历了产品受阻和期权风波。

华尔街总是期望上市公司不断创造营收的奇迹。为了获得进一步增长,在垄断了播放器市场后,2003 年苹果开始寻求在高额利润的音乐市场上分一杯羹。世界上整个音乐市场当时被五家大的唱片公司百代(EMI)、环球(Universal)包括下属的宝丽金、华纳兄弟(Warner Brothers)、Sony 和 BMG 垄断。后两家今天已经合并。这五家基本上各自签约不同的艺术家、各卖各的音乐,共同维持着一个高利润的市场。大部分听众可能都有一个体验,就是每个人可能只喜欢一张唱片中的一两首曲子而不是全部,但是,买 CD 时必须整张 CD 一起买。苹果建议唱片公司和它一起开发音乐付费下载市场,把一个专辑拆成一首首的曲子来卖,这样听众可以只选择自己喜欢的来下载。这个主意当然很好,问题是唱片公司和苹果如何分成,当然谁都想多得一些。乔布斯是个非常优秀的谈判高手,他把在价格上最强硬的 Sony 放在最后,他和其它四家公司共同达成了协议,Sony 只好就范,否则就永远被隔离在广大的 iPod 用户群以外。苹果推出音乐付费下载以来,下载量远比想象的要增长得慢。整个 2006 年,苹果公司在股市上的表现都不好,这时,苹果又爆出了期权风波,更是雪上加霜。关于这个风波媒体上报道很多,大致情况如下:

想了解美国的高科技公司,必须了解它的股票期权制度。在传统的公司里,一个员工的收入和福利包括奖金和退休金等现金。一般员工并不拥有公司的一部分。很多高科技公司,为了将员工的利益和公司的前途绑在一起,发给员工一些股票的期权(Stock Option)。所谓期权就是在一定时间,比如十年内,按一定价格,比如当前市场价购买股票的权利。获得期权的员工,会对公司有主人翁的责任感。如果公司的股票上涨,那么拥有股票期权的人可以以过去低的价格买进股票,即所谓的 exercise,然后以现在高的价钱卖出,从中赚到差价。股权只有当公司股票不断上涨时才有意义。遗憾的是,没有一个公司的股票只涨不落,因此股权有时会变得毫无意义。一些公司为了让股权变得有意义,在中间做手脚,修改股权授予时间,用最低的价钱将股票授予管理层和员工。苹果公司就是在这件事上栽了跟头。2006 年,美国证监会开始调查苹果公司这一行为。经过长期调查,证监会掌握了确凿的证据,苹果公司终于低头了,并交了罚款。最后,苹果公司首席财务官安德森(Fred Anderson)为此受罚。

从后来的情况发展看,这位被解雇的财务官觉得委屈,跑到《华尔街日报》去鸣冤。乔布斯一手对付证监会的调查,一手开发新品。2006 年底,苹果公司推出了 Apple TV。Apple TV 不是任何意义上的电视机,而是一个豆腐块大小的计算机,这个盒子可以存储几千小时的音乐或者几十小时的电影。它一头可以和互联网连接,下载音乐和电影,另一头,和家里的电视机和音响连接,播放出环绕立体声、高清晰度的音像。别小看了这个价格和 iPod 差不多的豆腐块,它很有可能成为未来每一个家庭客厅的娱乐中心。很多人认为,在个人电脑之后,家庭的娱乐中心将成为一个新的产业。事实上,十年前,盖茨在他的"未来之路"中预言音像制品将数字化,可以根据用户特殊需求下载并存在一个服务器中,这个服务器可以管理和控制所有的家电。现在盖茨的这个梦想快实现了,但是却让苹果抢先了一步。现在,在这个领域有三个候选者,苹果、微软和 Sony,后两者靠各自的游戏机作为家庭娱乐中心。苹果拥有最大的 iPod 用户群,微软有很强的技术储备,Sony 有领先的蓝光(Blu-Ray)DVD 技术,谁能笑到最后还不知道。

苹果的第二个新的拳头产品就是前不久刚上市的 iPhone 手机。我有幸在第一时间目睹和试用了这个革命性的产品。说实话,这是我见到的最好的手机。它已经超出一个普通的手机加 iPod 播放器,它还具有了一个完整的、联网的计算机和一般电视机的主要功能。用它上网查邮件和冲浪的体验和用一般手机是不同的。至于其它很酷的功能,各种新闻已经有了很多报道,我就不再赘述了。虽然它六百美元的价格实在贵了点,但是根据电器十八个月降一半价钱的规律,iPhone 很有可能成为今后普及的手机,成为苹果即 iPod 以后新的成长点,它甚至会冲击传统的手机行业。

如果稍微比较一下苹果十年前的产品和现在的产品,我们很容易发现,苹果早已经不是一个单纯的个人电脑生产厂商,因为它有大量类似家电的产品,比如 iPod、Apple TV 和 iPhone。因此,一些专家认为,苹果正在从计算机公司像家电公司过度。但是,这些产品和传统的家电又不一样,每样东西都给人耳目一新的感觉,让 人看了后,不由地发出感慨—原来这东西还可以这么玩儿。今天,苹果已经成为一种时尚家电的品牌。如果要问什么是创新,这就是创新!

结束语

三十年来,苹果公司经历了从波峰到低谷再回到浪尖之巅的过程。它的兴衰和它创始人的沉浮完全重合。从苹果公司诞生到它开发出麦金托什,可以认为是它的第一个发展期,麦金托什的出现,使得它领先于微软而站在了浪尖上。中间的近二十年,苹果到了几乎被人遗忘的地步。好在它像艺术家一般的创新的灵魂未死,并且在它的创始人再次归来之后,得到再生和升华。乔布斯送给年轻人两句话,永远渴望、大智若愚(Stay Hungry. Stay Foolish),愿与诸君共勉。

发表者:Google(谷歌)研究员 吴军

重读TC++PL

这两天又重新看起了Stroustrup的经典名著The C++ Programming Language,或许是受到网上各种C++经典、必读之类的书单刺激吧——你再牛能牛过这本么?
以前看的都是前面的语法部分,的确学术味道比较浓。这次直接翻到了最后一部分Design using C++,看了一章多,感觉除了佩服还是佩服,作者在语言设计之初就有那样先进的想法,其中有些甚至后来直接成为一个专门的研究学科,而这些学科在发展伊始就已经有了现成的技术上的支持。
这本书被称为“C++百科全书”,容量非常之大,设计多个方面,除C++基本语义之外,还涉及到算法、模板、STL、设计模式、软件工程等多个方面,每一个专题都可以单独再写成一本书。书中的每字每句,都值得好好琢磨,体会作者言外的真意。看这本书时不能想着是在看一本书,而要想成是在看一套书,这样心理上会好过一点。
手中的这本书记得还是当年表姐不远万里,远涉重洋寄过来的,可惜当时没有把握这个稀缺优势,直到后来满大街都是时才开始读起来。这种事没少干。不过知识只在于学没学会,而不在于什么时候学会,不是么?