写代码的人

Archive for 三月, 2011

iOS、 Android、 WP7均是浮云 移动互联网将是胜出者

知名技术专家Jacques Mattheij(ww.com创始人)近日在个人博客jacquesmattheij.com上发表了一篇博文《iOS,Android,WP7-Who cares?》,文中指出在当前移动操作系统领域,各大厂商正在激烈地争夺着霸主地位。在他看来,随着移动互联网的发展,用户通过移动互联网来访问自己所需的应用程序将是一种趋势,用户也将不必担心此应用与手机操作系统是否兼容的问题。基于Web的应用程序对操作系统的倚赖程度不高,届时人们对移动操作系统的关注程度也会随之降低。现对全文进行了编译,全文如下:

在移动操作系统领域,为了抢占霸主地位移动厂商之间正进行着一场激烈的战争。他们坚信谁占有了移动平台谁就拥有了世界。这样的情景以前似曾见过?

对,此类情景曾在桌面领域发生过。曾在过去某段时间里,至少有5款桌面操作系统在竞争桌面领域的霸主地位(其中的两个主阵营是微软Windows系列和苹果Mac OS系列)。你购买了一台电脑,希望在上面安装你所想要的软件。你无论是Office还是Exchange软件的用户,此时选择装有Windows系列操作系统的电脑比较合适。而对于使用Photoshop的设计者来说,选择购买苹果电脑将是最好的选择,虽然Photoshop也可以运行在Windows系列操作系统上。

现在一切都改变了。Web应用程序已经淡化了平台所带来的差异,趋向于突出用户体验,不再关注巨大的技术差异或技术优势。现在我们可以在浏览器中运行SpreadSheet和Word应用程序,甚至像Photoshop这样的图形处理软件也正试图嵌入到Web页中。现在我们已经可以看到基于Web页的CAD软件和其他基于Web页的特殊软件。将应用程序嵌入到网页中,这是几年前所无法想象到的事。当然,这还远远没有结束,但它却是一个显而易见的发展趋势。

互联网,最初只是包含各种图片的众多页面互联的一个集合体,现在已经发展成为一个成熟的可以发布各种应用程序的平台,并天天发展强大起来。虽然现在有些Web开发技术还很混乱、不成熟,但随着新库的发布,其中一些让人痛苦的技术点将会被去掉,取而代之的是简单的方法调用。jQuery技术就是一个很好的例子。现在就单单jQuery一项技术就能为开发人员省去很多开发时间。

我认为整个“移动领域的战争”也会以桌面领域之争结束的方式结束。Web标准、移动电话和浏览器将使“人人时时处处在线”成为现实,其中所有的内容传输(包括声音)都是数据的传输,所有的应用程序均可通过互联网来访问,而不必先从某个应用程序商站下载安装后再来使用。一些开发商可能会最终赢得这场战争,但他获胜的原因肯定是他为用户提供了通过浏览器便可轻松访问的应用、服务,用户不必担心此应用与手机操作系统是否兼容的问题。

这场移动操作系统领域的战争,正如一部已看过的电影,虽然我们已经了解了它的结局,但这并不能阻止各大厂商为获取其控制权而进行的抢夺之战,因为这块蛋糕太美味了,大家甚至都忘记了开放标准和协议的好处,就连微软也增强了在移动领域的扩张和控制。

相信在未来一段时间后,这场战争将会退出舞台,并被移动互联网领域之争所代替。那才是真正赚钱的时代。

到那时,我们便可以吃着爆米花观战,或者对其中一方进行下注。财富可能会增多或减少,但最终移动互联网会获胜。

编者按:HTML5是移动互联网制胜的利剑,各浏览器厂已经在实现各种HTML5功能。但当前HTML5标准还在制定阶段,完成时日尚不确定。看来移动互联网时代的到来还需要很长一段路要走,何时到来?让我们翘首以待。

原文链接:iOS,Android,WP7-Who cares?


酷壳陈皓:如何学好C语言

导读:本文作者陈皓在csdn上发表博客讲述《Java NIO类库Selector机制解析》。以下是他列举学习C语言的一些建议:

有人在酷壳的留言版上询问下面的问题

 

keep_walker :今天晚上我看到这篇文章。

http://programmers.stackexchange.com/questions/62502/small-c-projects

我也遇到了和提问的老外一样的问题。。能给像遇到这样烦恼的程序员一点建议嘛?谢谢!

 

我相信,这可能是很多朋友的问题,我以前也有这样的感觉,编程编到一定的时候,发现能力到了瓶颈,既不深,也不扎实,半吊子。比如:你长期地使用Java和.NET ,这些有虚拟机的语言对于开发便利是便利,但是对于程序员来说可能并不太好,原因有两个:

1.虚拟机屏蔽了操作系统的系统调用,以及很多底层机制。

2.大量的封装好的类库也屏蔽了很多实现细节。

一段时间后,你会发现你知其然,不知所以然。。我以前在CSDN上写过一篇《Java NIO类库Selector机制解析》,在那篇文章中我说提到过(有讥讽的语气)Java的程序员不懂底层实现,所以很难把技术学得更扎实。此时,一部分程序员会不自然地想学学底层的技术,很自然的,C语言就被提了上来。

下面是我给这位朋友的一些建议:

鼓励并为你叫好。我鼓励你想要去学C语言的想法和精神,很多人都觉得C语言好学,其实并不然,现在的这个社会更多地去关注那些时髦的技术,而忽略了这个流行了40+年的C语言。一门技术如果能够流行40多年,这才是你需要去关注和学习的技术,而不是那些刚出来的技术(过度炒作的技术,Windows编程史)。这才是踏踏实实的精神。

不要找借口。这一条路走下来并不容易,不要给自己找借口。我最不喜欢听到的就是“很忙,没有时间”这样的借口。我以前在银行做项目,早9点到晚10点,周一到周六,我一样可以每天抽1个小时来看书和专研,一年下来也能精读5、6本书。我现在的工作项目和招聘任务很紧张,刚生的小孩只有自己和老婆两人带,还需要准备讲课,但是我还是能够找到时间看文章写文章维护酷壳。所以,我可以告诉你,“时间就像乳沟,只要你肯挤,就一定会有”。

学好C语言和系统编程。我认为,学好编程有四个方面:语言、算法和数据结构、系统调用和设计。

语言。我可以告诉你C语言有两大主题你要好好学,一个是内存管理,一个是指针!这个世界上90%以上的C/C++出的严重性错误全是和这两个有关。不要看谭浩强的那本书,那本是本烂书。推荐这本书给你《C程序设计语言(第2版·新版)》

算法和数据结构。我认为,用C语言实现算法和数据结构莫过于最爽的事情。推荐你看这本书——算法:C语言实现(第1~4部分)基础知识、数据结构、排序及搜索(原书第3版)

系统编程。Windows下推荐两本书——《Windows 程序设计 》和《Windows核心编程》,Unix/Linux下推荐两本书——《Unix高级环境编程》和《Unix网络编程卷1,套接字》《Unix网络编程卷2,进程间通信》尤其是《Unix网络编程》这本书,一通百通,无论Windows还是Unix/Linux,都是一样的。

系统设计。关于设计方面,我全力推荐《Unix编程艺术》,看完以后,你就明白什么是真正的编程文化了。然后,当你看到Windows的Fans的某些言论时,你就知道什么叫一笑了之了。

如果你能在2-3年内精读完这些书,并全部融会贯通,那么你就明白什么是一览众山小的感觉了!我足足花了5年时间才算是真正全部读完这些书的。最后,祝你好运!努力!

原文链接:http://coolshell.cn/articles/4102.html

 

分析称谷歌可能跳过3.0,直接开源Android 3.1

去年的一些传闻消息暗示 Google 正在走两个 Android 的路子:Android 2.x 和 Android 3.0。后者是 Honeycomb,众所周知的在摩托罗拉 Xoom 上运行的 Android 版本。Google 似乎并不准备将 Android 3.0 的代码放到开源社区,也就是说很快只有 Open Handset Alliance(开源手机联盟)的成员才可以获得这些代码。

“Android 是一个开源项目。我们没有改变我们的策略”,Android 主管 Andy Rubin 告诉 Bloomberg。

如果你问我们,事实上,Android 3.1 将合并智能手机与平板软件,很可能意味着 Android 3.0 将永远不会在开源社区发布。不过根据 Andy Rubin 上面的描述,Android 3.1 将会。

此外,据 Bloomberg 称,Android 的主管已经告知 Google 可能会等待下一个版本来临时再考虑再作 Android 软件的开源分发,这个版本称为 Ice Cream(冰激凌)。Ice Cream 就是我们所说的 Android 3.1。

我 们相信 Android 3.1 将成为一个重要的里程碑,它的竞争对手,比如 Apple(苹果)等会有非常大的压力。另外事实上 Android 3.1 对第三方开发商(者)将是非常有利可图的,比如(据 CNET 报道的)Google 在测试音乐服务的传闻就说明了这一点。

这 听起来越来越像 Google 在谋划一个在今年晚些时候的大展宏图的 Android 3.1 发布计划。即将到来的由 Sprint 运营的 Nexus S 4G 将成为得到此更新的首批手机之一,不过我们猜还有待揭示的 Android 3.1 产品将成为这个特定版本的旗舰级产品。

对 于 Qualcomm(高通)的第三代 Snapdragon,TI 的 OMAP 4,Samsung(三星)的 Exynos 4210,以及 NVIDIA(英伟达)的 Tegra 2 3D,所有这各种芯片都将让今年夏季的手机变得超强,毫无疑问,第一款 Android 3.1 智能手机也将是很强大的。

即将推出的 HTC EVO 3D 是第一款正式宣布的高通第三代 Snapdragon 芯片手机,LG Thrill 4G 将运载 TI 新的 OMAP 4 芯片。三星 Galaxy S2 将带来 Exynos 4210 芯片组。

我 们还没有看到准备采用 NVIDIA 的 Tegra 2 3D 芯片组的产品,它还有待揭露。可能 AT&T,Google,Motorola(摩托罗拉)和 NVIDIA 正在密谋带有 4G LTE 的 Android 3.1 智能手机?只有时间才能揭晓这一切,我们坚信 Google 正在为今年夏天做一个 Android 3.1 + 4G LTE 的大计划!

文/谷安

 

一百年后,人类怎样编程?

很难预测一百年后的人类生活,只有少数几件事是可以确定的。那时,汽车将具备低空飞行能力,城市规划的法规将放宽,大楼可以造到几百层,大街上一天到晚看不见太阳,女性个个都学过防身术。本文只想讨论其中的一个细节:一百年后,人们使用什么语言开发软件?

为什么这个问题值得思考?原因不是我们最终会用上这些语言,而是幸运的话,我们从现在开始就能用上这些语言。

 

我认为,编程语言就像生物物种一样,存在一个进化的脉络,许许多多分支最终都会成为进化的死胡同。这种现象已经发生了。 Cobol语言曾经流行一时,但是现在看来没有任何后续语言继承它的思想。它就像尼安德特人 一样,进化之路已经走到了尽头。

我预言 Java也会如此。有人写信说:“你怎么能说 Java不会成功呢?它已经成功了。”我觉得这要看你的成功标准是什么。如果标准是相关书籍的出版量,或者是相信学会 Java就能找到工作的大学生数量,那么Java确实已经成功了。当我说 Java不会成功时,我的意思是它和 Cobol一样,进化之路已经走到了尽头。

这只是我的猜测,未必正确。这里的重点不是看衰 Java,而是提出编程语言存在一个进化的脉络,从而引导读者思考,在整个进化过程中,某一种语言的位置到底在哪里?之所以要问这个问题,不是为了一百年后让后人感叹我们曾经如此英明,而是为了找到进化的主干。它会启发我们去选择那些靠近主干的语言,这样对当前的编程最有利。

无论何时,选择进化的主干可能都是最佳方案。要是你不幸选错了,变成了一个尼安德特人,那就太糟了。你的对手克鲁马努人时不时就会来攻打你,把你的食物全部偷走。

这就是我想找出一百年后的编程语言的原因。我不愿意押错赌注。

 

编程语言的进化与生物学进化还是有区别的,因为不同分支的语言会发生聚合。比如, Fortran分支看来正在与 Algol 的继承者聚合。理论上,不同的生物物种也可能发生聚合,但是可能性很低,所以大概从来没有真正出现过。

编程语言之所以可能出现聚合,一个原因是它的概率空间 比较小,另一个原因是它的突变不是随机的。语言的设计者们总是有意识地借鉴其他语言的设计思想。

对于语言设计者来说,认清编程语言的进化路径特别有用,因为这样就可以照着样子设计语言了。这时,认清进化的主干就不仅有助于识别现存的优秀语言,还可以把它当作设计语言的指南。

 

任何一种编程语言都可以分成两大组成部分:基本运算符的集合(扮演公理的角色)以及除运算符以外的其他部分(原则上,这个部分可以用基本运算符表达出来)。

我认为,基本运算符是一种语言能否长期存在的最重要因素。其他因素都不是决定性的。这有点像买房子的时候你应该先考虑地理位置。别的地方将来出问题都有办法弥补,但是地理位置是没法变的。

慎重选择公理还不够,还必须控制它的规模。数学家总是觉得公理越少越好,我觉得他们说到了点子上。

你仔细审视一种语言的内核,考虑哪些部分可以被摒弃,这至少也是一种很有用的训练。在长期的职业生涯中,我发现冗余的代码会导致更多冗余的代码,不仅软件如此,而且像我这样性格懒散的人,我发现在床底下和房间的角落里这个命题也成立,一件垃圾会产生更多的垃圾。

我的判断是,那些内核最小、最干净的编程语言才会存在于进化的主干上。一种语言的内核设计得越小、越干净,它的生命力就越顽强。

 

当然,猜测一百年后人们使用什么编程语言,这本身就是一个很大的假设。也许一百年后人类已经不编程了,或者直接告诉计算机想做什么,计算机就会自动完成。

不过,到目前为止,计算机智能并没有取得太大进展。我猜测一百年后,人们还是使用与现在差不多的程序指挥计算机。可能有一些我们今天需要编程解决的问题,那时已经不需要编程了,但是我想,那时还会存在大量与今天一样的编程任务。

你可能认为只有那些自以为是的人才会去预言一百年后的技术。但是,请不要忘记,软件发展的历史已经走过了 50年。在这 50年中,编程语言的进化其实是非常缓慢的,因此展望一百年后的语言并不是虚无缥缈的想法。

编程语言进化缓慢的原因在于它们并不是真正的技术。语言只是一种书写法,而程序则是一种严格符合规则的描述,以书面形式记录计算机应该如何解决你的问 题。所以,编程语言的进化速度更像数学符号的进化速度,而不像真正的技术(比如交通或通信技术)的进化速度。数学符号的进化是缓慢的渐变式变化,而不是真 正技术的那种跳跃式发展。

 

无论一百年后的计算机是什么样子,我们基本上可以断定它们的运行速度一定会快得多。如果摩尔定律依然成立,一百年后计算机的运行速度将是现在的 74乘以 10的 18次方倍(准确地说是 73 786 976 294 838 206 464倍)。真是让人难以想象。不过实际上更现实的预测并不是速度会提高这么多,而是摩尔定律最终将不成立。不管是什么东西,如果每 18个月就增长一倍,那么最后很可能会达到极限。但那时的计算机比现在快得多大概是毫无疑问的。即使最后只是略微快了 100万倍,也将实质性地改变编程的基本规则。如果其他条件不变,现在被认为运行速度慢的语言(即运行的效率不高)将来会有更大的发展空间。

那时,依然会有对运行速度要求很高的应用程序。我们希望计算机解决的有些问题其实是计算机本身引起的。比如,计算机处理视频的速度取决于生成这些视频的另一台计算机。此外,还有一些问题本身就要求无限快的处理能力,比如图像渲染、加密 /解密、模拟运算等。

既然在现实中一些应用程序本身的效率较低,而另一些应用程序会耗尽硬件提供的所有运算能力,那么有了更快速的计算机就意味着编程语言不得不应付更多的极 端情况,涵盖更大范围的效率要求。我们已经看到这种情况发生了。要是以几十年前的标准衡量,有一些使用新语言开发的热门应用程序对硬件资源的浪费非常惊 人。

不仅编程语言有这种现象,这实际上是一种普遍的历史趋势。随着技术的发展,每一代人都在做上一代人觉得很浪费的事情。 30年前的人要是看到我们今天如此随意地使用长途电话,一定会感到震惊。 100年前的人要是看到一个普通的包裹竟然也能享受一天内从波士顿发件、途经孟菲斯、抵达纽约的待遇,恐怕就要更震惊了。

 

我已经预测了,一旦未来硬件的性能大幅提高将会发生什么事。新增加的运算能力都会被糟蹋掉。

在我学习编程的年代,计算机还是稀罕玩意。我记得当时使用的微机型号是 TRS-80,它的内存只有 4K,为了把 BASIC程 序装入内存,我不得不把源码中的空格全部删除。我一想到那些极其低效率的软件,不断重复某些愚蠢的运算,把硬件的计算能力全部占用,就感到无法忍受。但 是,我的这种反应是错的,我就像某个出身贫寒的穷孩子,一听到要花钱就舍不得,即使把钱用在重要场合(比如去医院看病)都觉得很难接受。

某些浪费确实令人厌恶。比如有人就很讨厌 SUV(运动型多用途车),即使它采用可再生的清洁能源也改变不了看法,因为 SUV来自一个令人厌恶的想法(如何使得小货车看上去更有男子汉气概)。但是,并非所有的浪费都是坏的。既然如今的电信基础设施已经如此发达,再掐着时间打长途电话就有点锱铢必较了。如果有足够的资源,你可以将长途电话和本地电话视为同一件事,一切会变得更轻松。

浪费可以分成好的浪费和坏的浪费。我感兴趣的是好的浪费,即用更多的钱得到更简单的设计。所以,问题就变成了如何才能充分利用新硬件更强大的性能最有利地“浪费”它们?

对速度的追求是人类内心深处根深蒂固的欲望。当你看着计算机这个小玩意,就会不由自主地希望程序运行得越快越好,真的要下一番功夫才能把这种欲望克制住。设计编程语言的时候,我们应该有意识地问自己,什么时候可以放弃一些性能,换来一点点便利性的提高。

 

很多数据结构存在的原因都与计算机的速度有关。比如,今天的许多语言都同时有字符串和列表。从语义上看,字符串或多或少可以理解成列表的一个子集,其中 的每一个元素都是字符。那么,为什么还需要把字符串单列为一种数据类型呢?完全可以不这么做。只是为了提高效率,所以字符串才会存在。但是,这种以加快运 行速度为目的、却使得编程语言的语义大大复杂的行为,很不可取。编程语言设置字符串似乎就是一个过早优化的例子。

如果我们把一种语言的内核设想为一些基本公理的集合,那么仅仅为了提高效率就往内核添加多余的公理,却没有带来表达能力的提升,这肯定是一件很糟的事。没错,效率是很重要,但是我认为修改语言设计并不是提高效率的正确方法。

正确做法应该是将语言的语义与语言的实现予以分离。在语义上不需要同时存在列表和字符串,单单列表就够了。而在实现上做好编译器优化,使它在必要时把字符串作为连续字节的形式处理。

对于大多数程序,速度不是最关键的因素,所以你通常不需要费心考虑这种硬件层面上的微观管理。随着计算机速度越来越快,这一点已经越发明显了。

 

语言设计时,对实现方式少作限制还会使得程序具备更大的灵活性。语言的规格发生变化不仅是无法避免的,也是合理的。通过编译器的处理,按照以前规格开发的软件就会照常运行,这就提供了灵活性。

essay(论文)这个词来自法语的动词 essayer,意思是“试试看”。从这个原始意义来说,论文就是你写一篇文章,试着搞清楚某件事。软件也是如此。我觉得一些最好的软件就像论文一样,也就是说,当作者真正开始动手写这些软件的时候,他们其实不知道最后会写出什么结果。

Lisp语 言的黑客早就明白数据结构灵活性的价值。我们写程序的第一版时,往往会把所有事情都用列表的形式处理。所以,这些最初版本可能效率低下得惊人,你必须努力 克制自己才能忍住不动手优化它们,这就好像吃牛排的时候必须努力克制自己才能不去想牛排是从哪里来的一样,至少对我来说是这样的。

一百年后的程序员最需要的编程语言就是可以让你毫不费力地写出程序第一版的编程语言,哪怕它的效率低下得惊人(至少按我们今天的眼光来看是如此)。他们会说,他们想要的就是很容易上手的编程语言。

效率低下的软件并不等于很烂的软件。一种让程序员做无用功的语言才真正称得上很烂。浪费程序员的时间而不是浪费机器的时间才是真正的无效率。随着计算机速度越来越快,这会变得越来越明显。

 

我觉得,放弃字符串类型已经是大家可以接受的想法了。 Arc语言已经这样做了,看上去效果不错。以前用正则表达式很难描述的一些操作,现在用回归函数可以表达得很简单。

这种数据结构的扁平化趋势会怎么发展?我极其努力地设想各种可能,得到的结果甚至令我自己都吓了一跳。比如,数组会不会消失?毕竟数组只是散列表的一个子集,其特点就是数组的键全部都是整数向量。进一步说,散列表本身会不会被列表取代呢?

还有比这更惊人的预言。在逻辑上其实不需要对整数设置单独的表示法,因为可以把它们也看作列表,整数n可以用一个 n元素的列表表示。这一样能完成数学运算,只是效率低得让人无法忍受。

编程语言会发展到放弃基本数据类型之一的整数这一步吗?我这样问并不是真的要你严肃思考这个问题,更多的是希望打开你对未来的思路。我只是提出一种假想 的情况:如果一股不可抗拒的力量遇到了一个不可移动的物体,会发生什么事。具体就本文而言:一种效率低得不可想象的语言遇到了性能强大得不可想象的硬件, 会发生什么事。我看不出放弃整数类型有什么不妥。未来相当漫长。如果我们想要减少语言内核中基本公理的数目,不妨把眼光放得远一点,想一想如果时间变量 t趋向无限会怎么样。一百年是一个很好的参考指标,如果你觉得某个想法在一百年后仍然可能是难以令人接受,那么也许一千年后它也依然难以令人接受。

让我说清楚,我的意思不是说所有的整数运算都用列表来实现,而是说语言的内核(不涉及任何编译器的实现)可以这样定义。在现实中,任何进行数学运算的程序可能都是以二进制形式表示数字,但是这属于编译器的优化,而不属于语言内核语义的一部分。

 

另一种消耗硬件性能的方法就是,在应用软件与硬件之间设置很多的软件层。这也是我们已经看到的一种趋势,许多新兴的语言就被编译成字节码 。比尔•伍兹曾经对我说,根据经验判断,每增加一个解释层,软件的运行速度就会慢一个数量级。但是,多余的软件层可以让编程灵活起来。

Arc语言 最初的版本就是一个极端的例子,它的层很多,运行速度非常慢,但是确实带来了相应的好处。Arc是一个典型的“元循环”( metacircular)解释器,在 Common Lisp的基础上开发,很像约翰•麦卡锡在他经典的 Lisp论文中定义的 eval函数。 Arc解释器一共只有几百行代码,所以很便于理解和修改。我们采用的 Common Lisp版本是 CLisp,它本身是在另一个字节码解释器的基础上开发的。所以,我们一共有两层解释器,最上面那层效率低下得惊人,但是语言本身是能用的。我承认只是勉强可用,但是确实能用。

 

即使是应用程序,使用多层形式开发也是一种很强大的技巧。自下而上的编程方法意味着要把软件分成好几层,每一层都可以充当它上面那一层的开发语言。这种方法往往会产生更小、更灵活的程序。它也是通往软件圣杯——可重用性( reusability)——的最佳路线。从定义上看,语言就是可以重用的。在编程语言的帮助下,你的应用程序越是采用这种多层形式开发,它的可重用性就越好。

可重用性这个概念多多少少与 20世纪 80年 代兴起的面向对象编程有些关联。不管怎样寻找证据,也不可能把这两件事完全分开。某些使用面向对象编程开发出来的软件确实具有可重用性,但是这不是因为它 使用了面向对象编程,而是因为它的开发方法是自下而上的。以函数库为例,它们具有可重用性,是因为它们属于语言的一部分,而不是因为它们采用面向对象或者 其他编程方法。

顺便说一句,我不认为面向对象编程将 来会消亡。我觉得,除了某些特定的领域,这种编程方法其实没有为优秀程序员带来很多好处,但是它对大公司有不可抗拒的吸引力。面向对象编程使得你有办法对 一团乱码似的代码进行可持续性开发。通过不断地打补丁,它让你将软件一步步做大。大公司总是倾向于采用这样的方式开发软件。我预计一百年后也是如此。

 

既然是谈论未来,最好谈谈并行计算( parallel computation),因为看上去并行计算好像就是为未来而存在的。无论怎么想,并行计算似乎都是未来生活的一部分。

它会在未来实现吗?过去二十年,人们都在说并行计算马上就会来临。但是,到目前为止,它对编程实践并没有太大影响。这是真的吗?芯片设计师已经不得不把它考虑在内,为多 CPU计算机开发系统软件的程序员也是如此。

但是,真正的问题在于,并行计算到底能达到哪个抽象层次?一百年后它就会影响到开发应用软件的程序员吗?或者,它还只是编译器作者需要考虑的事情,在应用软件的代码中根本就无处寻觅?

一种可能是,大多数可以用到并行计算的场合,人们都会放弃使用并行计算。虽然我总的预测是未来的软件会挥霍掉大部分新增的硬件性能,但是并行计算是一个 特例。我估计随着硬件性能得到惊人的提升,如果你明确地说想要并行计算,那么肯定可以得到它,但是通常情况下你不会用到它。这意味着,除了一些特殊的应用 程序,一百年后的并行计算不会是那种大规模的并行计算( massive parallelism)。我预料,对于普通程序员来说,一切更像对进程进行分叉,然后让多个进程在后台并行运行。

这是编程进行到很后期才要做的事情,属于对程序的优化,类似于你想开发一种特定的数据结构来取代现有的数据结构。程序的第一个版本通常会忽略并行计算提供的各种好处,就好像编程开始时会忽略某种特定的数据结构给你带来的好处一样。

除了某些特定的应用软件,一百年后,并行计算不会很流行。如果应用软件真的大量使用并行计算,这就属于过早优化了。

 

一百年后会有多少种编程语言?从最近来看,出现了大量的新语言。硬件性能提高是一个原因,这就允许程序员根据使用目的在运行速度和编程便利性之间做出不同的取舍。如果这就是未来的趋势,那么一百年后强大的硬件只会使得语言数目变得更多。

但是,另一方面,一百年后的常用语言可能只有很少几种。部分原因是基于我的乐观主义,我相信在未来,如果你的作品确实很出色,你可能选择的是一种开发起 来很方便的语言。使用这种语言写出来的软件第一版的运行速度很慢,只有对编译器进行优化设置后运行速度才会提升。既然我抱有这种乐观主义,那么我还要做一 个预言。有些语言可以达到机器的最高效率,另一些语言的效率则慢到刚刚可以运行而已,两者之间存在巨大的差距。我预言一百年后,这段差距之间的各个点上都 会有对应的编程语言存在。

因为这段差距正在变得越来越大,所以性能分析器( profiler) 将变得越来越重要。目前,性能分析并没有受到重视。许多人好像仍然相信,程序运行速度提升的关键在于开发出能够生成更快速代码的编译器。代码效率与机器性 能的差距正在不断加大,我们将会越来越清楚地看到,应用软件运行速度提升的关键在于有一个好的性能分析器帮助指导程序开发。

我说将来可能只有很少几种常用语言,但没有把用于特定领域的“小众语言”( little language)算进去。我觉得,这些嵌入式语言的想法很不错,一定会蓬勃发展。但是我判断这些“小众语言”会被设计成相当薄的一层,使得用户可以一眼看出在底下作为基础的通用型语言,这样就减少了学习时间,降低了使用成本。

谁来设计这些未来的语言?过去 10年最激动人心的趋势之一就是开源语言的崛起,比如 Perl、 Python和Ruby。语言设计已经被黑客接管。到目前为止这样到底是好是坏还看不清楚,但是发展势头令人鼓舞。比如, Perl就有一些绝妙的创新。不过,它也包含了一些很糟糕的想法。对于一种充满进取心、大胆探索的语言来说,这也是很正常的事。以它现在这种变化的速率,大概只有上帝才知道一百年后 Perl会变成什么样。

有一句俗话说,如果你自己做不到,那就去当老师。这在语言设计领域不成立,我认识的一些最出色的黑客就在当教授。但是,当老师的人确实有很多事情不能 做。研究性职位给黑客带来了一些限制。在任何学术领域,都有一些题目是可以做的,另一些题目是不可以做的。不幸的是,这两类题目的区别通常取决于它们写成 论文后看上去是不是很高深,而不是取决于它们对软件业的发展是否重要。最极端的例子可能就是文学,文学研究者的任何成果几乎对文学创作者都毫无影响。

虽然科学领域的状况要稍好一点,但是研究者可以做的题目与能够对设计优秀语言有所帮助的题目之间的交集小得令人沮丧。(奥林• 希弗斯曾经对这一点表达不满,而且说得头头是道。)比如,研究变量类型的论文好像多得无穷无尽,尽管事实上静态类型语言看来无法真正支持宏(在我看来,一种语言不支持宏,那就不值得使用了)。

新语言更多地以开源项目的形式出现,而不是以研究性项目的形式出现。这是语言的一种发展趋势。另一种发展趋势是,新语言的设计者更多的是本身就需要使用它们的应用软件作者,而不是编译器作者。这似乎是好的趋势,我期待它继续保持下去。

 

一百年后的物理学基本上不可能预测。但是计算机语言不一样,现在就动手设计一种一百年后可以吸引使用者的新语言,这在理论上似乎是可能的。

设计新语言的方法之一就是直接写下你想写的程序,不管编译器是否存在,也不管有没有支持它的硬件。这就是假设存在无限的资源供你支配。不管是今天还是一百年后,这样的假设好像都是有道理的。

你应该写什么程序?随便什么,只要能让你最省力地写出来就行。但是要注意,这必须是在你的思维没有被当前使用的编程语言影响的情况下。这种影响无处不 在,必须很努力才能克服。你也许觉得,对于人类这样懒惰的生物,喜欢用最省力的方式写程序是再自然不过的事情。但是事实上,我们的思想可能往往会受限于某 种现存的语言,只采用在这种语言看来更简单的形式,它对我们思想的束缚作用会大得令人震惊。新语言必须靠你自己去发现,不能依靠那些让你自然而然就沉下去 的思维定势。

 

采用程序的长度作为它耗费工作量的近似指标是个很有用的技巧。这里的程序长度当然不是指字符的数量,而是指各种句法元素的总长度,基本上就是整个解析树 的大小。也许不能说最短的程序就是写起来最省力的程序,但是当你一心想把程序写得简洁而不是松松垮垮时,你就更接近省力这个目标,你的日子也会变得好过得 多。所以,设计语言的正确做法就变成了,看着一段程序,然后问自己是不是能把它写得更短一点?

实际上,用想象出来的一种一百年后的语言来写程序,这件事情的可靠程度,取决于你对语言内核的估计是否足够正确。常规的排序,你现在就可以写出来。但是,想要预测一百年后的语言使用什么函数库就很难了。很可能许多函数库针对的领域现在还根本不存在。比如,如果 SETI@home 计划成功,我们就需要与外星人联系的函数库了。当然,如果外星人的文明高度发达,已经到了用 XML格式交换信息的地步,那就不需要新的函数库了。

另一个极端是,我觉得今天你就能设计出一百年后的语言内核。事实上,在有些人看来,大部分语言内核在1958年就已经设计出来了。

 

如果今天就能使用一百年后的编程语言,我们会用它编程吗?观古而知今。如果 1960年就能使用今天的编程语言,那时的人们会用它们吗?

在某些方面,回答是否定的。今天的编程语言依赖的硬件在 1960年并不存在。比如, Python这样的语言,正确的缩进( indentation)在编写时很重要,但是 1960年的计算机没有显示器,只有打印机终端,所以编写起来就不会很顺利。但是,如果把这些因素排除在外(你可以假设,我们只在纸上编程), 20世纪60年代的程序员会喜欢用现在的语言编程吗?

我想他们会的。某些缺乏想象力、深受早期编程语言思想影响的人可能会觉得不可能。(没有指针运算,如何复制数据?没有 goto语句,如何实现流程图?)但是我想,那时最聪明的程序员一定能轻松地使用今天的大多数语言,假定他们能得到的话。

如果我们现在就能拥有一百年后的编程语言,那就至少能用来写出优秀的伪码 。我们会用它开发软件吗?因为一百年后的编程语言需要为某些应用程序生成快速代码,所以很可能它生成的代码能够在我们的硬件上运行,速度也还可以接受。相比一百年后的用户,我们也许不得不对这种语言做更多的优化,但是总的来看,它应该仍然会为我们带来净收益。

 

现在,我们的两个观点就是:( 1)一百年后的编程语言在理论上今天就能设计出来;( 2)如果今天真能设计出这样一种语言,很可能现在就适合编程,并且能够产生更好的结果。如果我们把这两个观点联系起来,那就得出了一些有趣的可能性。为什么不现在就动手尝试写出一百年后的编程语言呢?

当你设计语言的时候,心里牢牢记住这个目标是有好处的。学习开车的时候,一个需要记住的原则就是要把车开直,不是通过将车身对齐画在地上的分隔线,而是通过瞄准远处的某个点。即使你的目标只在几米开外,这样做也是正确的。我认为,设计编程语言时,我们也应该这样做。

原文:http://blog.csdn.net/turingbooks/archive/2011/03/29/6285205.aspx

本文转载自: 图灵教育

 

不要用面向对象来迷惑程序员新手

本文是从 Don’t Distract New Programmers with OOP 这篇文章翻译而来。


当我被问及“哪种编程语言是教我[儿子 / 女儿 / 其他没有编程经验的人的首选]时,”我的答案这五年多来一直没变:Python。

这也许会出乎你的意料,经常有人会说这是非主流语言,但我坚持我的看法。

Python十分适合解决很多简单的、有趣的问题,比用C语言要省力的多。(这是实话,几行Python代码你就能制作一个简单的拼写检查程序。)你会发现这种语言里几乎没有任何复杂或让人困惑的东西,用它编程简单易懂,比如说数组更新你可以用固有的方法来实现任何的操作算法。在Python里,你学习的曲线很平滑。数组,字典,集合是最主要的东西。

把Python当作入门语言,有一点需要注意:避免使用面向对象特征。你当然不可能完全的回避它们,有些基本数据类型里一些有用的方法跟它们有关 联,问题不大。你只是使用它们已经提供的东西,不要去创建什么类,要避免任何的面向对象设计里的声明,否则的话,你一点点的数据都需要会打包成类。

从面向过程到面向对象的转移带来后果是你从关注问题和解决方法转移到关注架构。你通过对比面向过程的程序和面向对象的程序,很容易能看出这点来。后者的程序会更长,到处是多余的接口和缩进和标记。你也许忍不住想将一些小代码移进类里,或往类里添加一些小方法,这些都没必要,等日后你再做这些也不迟。

当你在帮助某人把一个有问题的语句改正确的时候,你要做的最后一件事是给他们布置一些没有实际用处的技术工作。因为有些人没事时就喜欢玩能一些面向 对象的知识技术,做一些可怕的类继承,最终没有学到他们该学的东西。有些人在学习的时候慢慢的会失去兴趣,因为他们看到了太多的这些没有实际用处的继承、 接口代码,感觉程序越来越笨重、难以处理。

从某方面说,当然,你需要学习一下Python的面向对象的知识,但尽可能的避免使用它们吧。

 

卡内基梅隆大学CS新生不再学习面向对象编程

卡内基梅隆大学教授Robert Harper在博客上称,该校计算机科学系从大一新生课程中删除了面向对象编程。他说,面向对象编程从入门课程中完全取消了,因为O-O的性质是反模块化和反并行的,不适合进入现代计算机科学教学课程。新课程提议是面向对象的设计学。

本文转载自: Solidot

 

摩托罗拉移动将寻找谷歌Android替代品

导语:国外媒体今天刊文称,摩托罗拉移动目前已经推出了多款采用Android系统的智能手机和平板电脑。业内人士认为,随着产品的差异化,摩托罗拉将在手机中引入除Android之外的其他操作系统。

以下为文章全文:

在摩托罗拉出货Droid手机的前2天,该公司CEO桑杰·贾(Sanjay Jha)接到了他的助手伊克巴尔·阿沙德(Iqbal Arshad)的电话。阿沙德表示,Droid手机的软件中存在一个漏洞,他希望在该手机正式出货之前重新编写代码。他表示:“在大公司中,你通常不会希 望这样的改变,这将带来恐慌。”

然而,阿沙德带领摩托罗拉的工程师彻夜工作,在凌晨4点时修复了这一电池电量误报的漏洞。Droid最终按原定计划出货,并成为一款大卖的手机。

这种追求完美的举动类似于苹果。然而,桑杰·贾希望向外界证明,尽管在此前3年中亏损了超过40亿美元,但摩托罗拉仍可以参与计算行业的竞争。

摩托罗拉随后的一步是推出Atrix 4G旗舰级手机。桑杰·贾认为,相对笔记本和桌面电脑,手机将是大多数人使用的主要计算设备。他表示,手机也将超过平板电脑,包括苹果iPad和摩托罗拉 Xoom。他在一次接受采访时表示:“这是我一直携带的计算机。如果说我们给未来下了赌注,那么这就是核心。”

Atrix于今年2月在美国面市,这款手机采用谷歌Android系统。当被插进摩托罗拉的LapDock扩展坞之后,这款手机将成为一台计算机的中心。桑杰·贾表示:“通过这样的方式,一切都在我的口袋中,包括所有的数据,所有的处理过程。”

移动计算

在配备扩展坞的情况下,AT&T销售的Atrix售价为499美元。Atrix是第一款模糊了手机和电脑的产品。本月早些时候,这款手机已经成为亚马逊网站上销量最好的手机。

摩托罗拉正针对商务、社交网络和娱乐等方面的功能对手机进行类似的创新,此外摩托罗拉还瞄准了美国以外的多个市场。桑杰·贾表示,作为开拓中国市场举措的一部分,摩托罗拉正考虑引入除Android之外的其他操作系统,包括一款来自百度的系统。

外界目前对摩托罗拉仍持怀疑态度。摩根大通分析师罗德·豪尔(Rod Hall)表示,摩托罗拉很难使自己区分于其他Android设备厂商,包括宏达电和三星电子等。

份额下跌

豪尔表示:“Atrix带来了很酷的理念,但是我并不确定,其他厂商不会复制摩托罗拉的做法。Android是一个大众化平台,参与这一市场的竞争需要规模。很明显摩托罗拉目前并不具备规模。”豪尔对摩托罗拉股票的评级为“减持”。

上世纪80年代和90年代,摩托罗拉是手机技术的先驱。然而根据Gartner的数据,去年摩托罗拉的市场份额已经下降至2.4%,远远低于 2006年第二季度时的21.9%。今年,在激进投资者卡尔·伊坎(Carl Icahn)的压力下,摩托罗拉分拆成摩托罗拉移动和摩托罗拉解决方案两家公司。

在今年1月份分拆之后,摩托罗拉移动的股价已经下跌了21%。不过TCW Group高级副总裁尼拉夫·帕里克(Nirav Parikh)表示:“摩托罗拉目前是一台调试良好、上过机油的机器,能够持续生产出好产品。”

聘请资深人士

桑杰·贾的助手包括多名业内资深人士。他聘请了来自宝洁的高管比尔·奥格尔(Bill Ogle)负责营销,以及TCL通讯前CEO刘飞负责中国市场。此外,他还提拔了约翰·布希尔(John Bucher)负责战略,以及克里斯蒂·维亚特(Christy Wyatt)负责软件。

奥格尔的办公室中陈列着摩托罗拉以往的手机产品,此外还有一台夏普的平板电视,播放着Twitter上关于摩托罗拉的消息。奥格尔通过这样的方式来了解用户对Xoom等产品有何反应。

奥格尔和他的团队刚刚完成了一项为期2个月的研究,关于美国和中国用户如何使用手机,以及手机如何为用户提供更多的服务。他列出了用户当前的 “疼痛点”,即对手机感到不满的地方。这些疼痛点共有38个,分为3类,其中包括社交连接、娱乐和办公工具等,而企业用户和个人用户都有这样的困扰。

奥格尔表示:“试想如果你的手机是闹钟,当闹铃时间到达时,手机将射出一束光在你的天花板上,并显示时间,以及你要做的两件事。此外还可以利用蓝牙耳机来监测你的血压。”

随机行为

奥格尔并未透露,摩托罗拉目前是否正在从事这些方面的工作。他表示,他的营销团队已经将这些想法传达给工程师,从而提高新款手机获得成功的可能性。他表示:“我们正尝试从随机行为转向持续性更强的做法。”

维亚特目前正协助将这些想法转化为产品。她的团队开发了Motoblur软件,将电子邮件和社交网络信息整合到同一个界面中,并使手机向平板电 脑和机顶盒发送内容更加容易。她最新的工作是为企业用户定制摩托罗拉手机,摩托罗拉在这一市场将挑战RIM黑莓手机。她表示:“相关投资是巨大的。”

摩托罗拉去年推出的Droid Pro主要面向企业市场,其键盘类似于黑莓手机。摩托罗拉去年还收购了Three Laws Mobility,该公司的技术能够给Android手机带来更好的安全性。

桑杰·贾的角色

摩托罗拉移动CFO马克·罗斯曼(Marc Rothman)表示,桑杰·贾将各个团队联系在一起。桑杰·贾于2008年从高通加盟摩托罗拉。他常常开会至夜间11点半,并且只睡觉5小时。罗斯曼表示:“他给我们所做的一切打上自己的印记。”

罗斯曼在说服摩托罗拉董事会聘请桑杰·贾的过程中发挥了重要作用。桑杰·贾拥有电子工程博士学位,并在高通供职了14年。

摩托罗拉移动设备部门COO约尔简·斯塔克(Juergen Stark)表示,桑杰·贾关心工程师对芯片的设计,以及手机待机时电池的耗电情况。他指出:“在桑杰·贾加入之后,高层对产品的参与程度大幅提升。”

挑战谷歌

桑杰·贾面临的挑战在于,他需要使摩托罗拉与三星电子和宏达电等Android设备商实现差异化。不过,摩托罗拉的策略有可能使其疏远谷歌。独 立科技行业咨询师乔纳桑·亚米斯(Jonathan Yarmis)表示,由于桑杰·贾希望推出杰出的产品,因此摩托罗拉有可能采用多种不同平台。

游戏和办公应用等软件通常是由第三方开发者开发的。在苹果平台上,开发者只需开发一个版本的应用即可,然而在Android平台上,他们往往需要针对多款不同的手机和平板电脑开发应用。这增加了开发者的工作量,降低了效率。

摩托罗拉有可能在手机中引入其他操作系统。桑杰·贾表示,摩托罗拉正考虑百度的产品,以及来自中国联通的“沃Phone”。他表示:“我们正在进行讨论,正在与百度谈判。”

百度与谷歌的竞争

百度和谷歌在中国的互联网搜索市场有着激烈的竞争。根据易观国际的数据,百度在这一市场的份额超过75%。

桑杰·贾表示,摩托罗拉也有可能开发自己的平台,不过这需要较大的规模和开发者的支持。他表示:“我总是会考虑这样做,但是我不认为目前这样做是合适的。”

他同时表示,摩托罗拉目前专注于Android系统,该公司与谷歌的关系是牢固的。摩托罗拉员工拥有谷歌办公室的门卡,并经常在谷歌办公室中从 事有关 Android的工作。桑杰·贾或维亚特每周会前往加州山景城的谷歌总部,领导相关的开发工作。摩托罗拉负责与谷歌合作的主管约翰·拉格林(John Lagerling)也表示,摩托罗拉与谷歌的关系很好。

摩托罗拉预计今年将回复盈利。彭博社的调查显示,分析师平均预计摩托罗拉今年营收将同比增长16%,至133亿美元。不过桑杰·贾仍表示,尽管 摩托罗拉一直试图再次证明,该公司能够与行业中最强大的对手竞争,但他仍然保持着危机感。他表示:“我们都经历过了我所谓的生死存亡关头。我们相信我们可 以做到。” (夏玮)