随着时代的发展,语言是变得更加最复杂的语言还是更加简洁了

专访图书作者祁宇:C++11让程序更简洁、更现代、更强大
发表于 08:37|
作者夏梦竹
摘要:祁宇,资深C++技术专家,致力于C++11的应用、研究和推广。他爱好C++,爱好开源,乐于研究和分享技术,有多个开源项目。日前CSDN采访了他,请他谈谈C++的现状以及未来的发展前景。
祁宇,资深C++技术专家,致力于C++11的应用、研究和推广。金山软件WPS资深工程师,负责Android服务端开发。精通OOP、OOD、设计模式和重构,主要研究方向为架构设计和业务重构,有丰富的开发和研发管理经验。爱好C++,爱好开源,乐于研究和分享技术,有多个开源项目(详见
),在《程序员》上发表多篇技术文章。2013年被评为珠海市优秀青年人才。日前CSDN采访了祁宇,请他解读C++11的新标准、C++的现状以及未来的发展前景。&
CSDN:怎么会想到编写《深入应用C++11:代码优化与工程级应用》这本书的?有没有什么故事可以分享下?
祁宇:我作为比较早使用C++11的开发者,在项目中应用C++11的时候,可以查阅的资料还很有限,主要是通过ISO标准(ISO/IEC ),维基百科、MSDN和http://en.cppreference.com/w/等网站来学习C++11。然而,这些地方对新特性的介绍比较零散,虽然知道这些新特性的基本用法,但有时候不知道为什么需要这个新特性,在实际项目中该如何应用,或者说最佳实践是什么,这些东西网上可没有,也没有人告诉你,因为当时只有很少的人在尝试用C++11,这些都需要自己不断的去实践、去琢磨,当时多么希望能有一些指导C++11实践的资料啊。在不断实践的过程中,我对C++11的认识加深了,C++11不断地给人带来惊喜,在我窥探到C++11的妙处之后,我很想和更多人的分享,让更多的人更好地掌握C++11的用法和领略C++11的魅力。这是我把应用C++11的一些心得和经验放到我的技术上分享出来的初衷,也是我写作此书的初衷。
CSDN:这本书适合哪些读者?书中主要介绍了哪些内容?设计思路是怎样的?
祁宇:适合普通的C++开发者,无论是新手还是老手,都有必要学习和应用C++11,C++11的强大特性可以大幅提高生产力,让我们的项目开发更加得心应手。
本书分为两部分,前半部分侧重从如何去改进我们现有程序的角度去介绍C++11新特性 。这样一来可以让读者学习这些新特性的用法;二来还可以让读者知道这些特性是如何改进现有程序的,从而能更深刻的领悟C+11的新特性;后半部分通过丰富的开发案例来介绍如何使用C++11去开发项目,相信这些实战案例能给读者带来更深入的思考。
CSDN:代码优化的好处有很多,但并不意味着所有的代码都需要进行优化,有时过度的优化反而适得其反,对此,你怎么理解?在实践过程中,你是怎么操作的?
祁宇:确实,代码的过度优化可能会让代码变得更加晦涩,这是应该尽量避免的,另外过早的优化也是不提倡的。事实上,在实际的项目开发过程中,代码优化不是做多了而是做得太少了,很多情况下都是赶进度,赶任务,或者由于自己的水平有限,主观能动性不足,很少会有人花大量时间去考虑代码优化的事,更不会主动通过应用新技术或采用重构等手段去改进代码。
在项目开发中我会采用一些最佳实践来保证写代码不容易犯错,比如我不用裸指针,只用智能指针和guard手法,这样我根本不用担心内存泄漏的问题,通过type_traits在编译期做一些约束确保我们在编译期就能及早地发现问题。项目开发到一定时候我会用一些第三方工具来审查代码,比如Source moniter和Simian,看看我的代码有没有重复代码,有没有深层嵌套,圈复杂度是不是太高等等,然后重构。做这些事情虽然看起来可能会拖慢开发进度,甚至对你的KPI没有任何帮助,但它对你的项目质量却有很大帮助,也许在项目交付后别人忙着改Bug,而你却可以悠闲地喝咖啡了。
CSDN:你怎么看C++新标准?有没有哪些新特性让你印象深刻?它会影响API的设计吗?现存的库如何保持更新呢?
祁宇:C++新标准意味着更强的生产力,让C++更加强大,让你写C++更爽。据说重要的话要说三遍,这句话请重复三遍。
C++新标准有很多特性让人印象深刻,比如,右值引用可以避免无谓的拷贝,提高程序性能;可变模板参数使C++的泛型编程的能力更加强大; type_traits可以使我们方便地在编译期对类型进行计算;智能指针使我们不用担心内存泄露的问题了;线程库让我们能方便地编写可移植的并发程序;auto+decltype不仅让我们写代码更加简洁还让推断模板函数的返回类型更加便利,lambda让算法更清晰等等,不一而足。难怪Bjarne Stroustrup说C++11看起来像一门新的语言了,相信学习和使用过C++11的朋友一定心有戚戚焉。
新标准会让API变得更合理——API的设计会向着更加简洁、清晰、减少语法和语义噪音的方向上演进。当然,更主要的还是取决于使用这些特性的用户。
现存的库升级到新标准的代价是非常小的,希望广大C++开发者及时升级编译器,在新项目中使用新标准,你们失去的仅仅是一个老旧的编译器,而得到的却是巨大的生产力!
CSDN:C++的应用领域变得越来越小,你认为C++的演进方向是什么样的? C++的强势领域在哪里?它未来会有什么样的发展?
祁宇:随着Web和移动的崛起,C++的应用领域相对来说变小了,当一个领域下出现了一门专门的语言能够实现更加简洁的封装,又很容易上手,并且也不再那么需要强调效率的时候,C++被取代是很正常的。事实上,C++是一个通用的语言,它在尽量保证高效的前提下,来实现足够优雅的抽象概念的封装。所以同样的,我们可以看到在前台花样迭出的情况下,后台使用C++来做关键的性能部分是很自然的选择。对于核心的算法,使用C++可以实现一次编码多处编译,从而在任何平台下都有最佳的性能,而上层部分则可根据实际情况及平台选择专门的语言来高效的撰写。另外,在服务器、安全、游戏、嵌入式等领域里,C++依然是不二的选择,随着新标准的出现,现代C++将出现在更多的领域。
虽然C++11相比C++98/03来说已经有了脱胎换骨的变化,但C++仍然在持续发展,充满活力,比如已经出来的C++14和即将到来的C++17,
C++17将引入concept、文件库、并行库、网络库和coroutine,这些是非常值得期待的,可以预见的未来,C++的发展会越来越好。随着C++新标准的不断发展,引入越来越多的现代编程语言的特性,C++将越来越受欢迎,C++11的出现已经印证了这一点,在StackOverflow的最近一次调查中,C++11在所有的编程语言中排名第二,这是毫不意外的。
CSDN:Go语言的语法与C++相似,国内外的推崇者也比较多,你认为未来它会取代C/C+吗?
祁宇:二者有一定的相似度,从语法上来说,Go就像一个被重度语法糖包裹的C++,还去掉了编译期/预编译期计算的能力。对于我个人而言,C++的模板和模版元很有趣,也是我喜爱C++的一个重要原因,对于没有模板和模版元的编程语言无疑少了很多乐趣。
我认为未来Go不会取代C/C++,因为它们的应用范围并不相同。Go语言的一些不足也影响了Go的推广,例如,不能忽略import的错误,一些关键实现(如GC)改进迟缓导致生产的软件的缺陷等等。 Go语言相比C/C++可能更擅长并发与分布式(这一点将在即将到来的新标准C++17中得到弥补,实际上C++11已经具备这方面的基础了),而C/C++则更为严谨、朴实和通用,对于C++来说,可以在保证更高效率的同时实现比Go更丰富和简洁的抽象。只要想做,C++完全可以实现Go里的大部分关键字(比如go/defer/switch)。
其实无论什么语言,只要你喜欢并享受它带来的乐趣就够了,与其加入满是口水的语言之争不如为喜欢的语言的发展做一点实际的事情。
CSDN: 除了C++,你还喜欢什么语言?在日常工作中你常用的工具有哪些?
祁宇:我还喜欢C#语言,常用开发工具是VS2013、VIM、Eclipse,intelij;UML设计工具是EA;代码检查的工具是source moniter和simian。
CSDN:你开源了多个项目,这些项目还会经常维护吗?你设计的初衷是什么?你怎么看待开源社区的演进?
祁宇:现在还在维护,而且还在不断增加新的项目,并且有越来越多的人参与进来。
在用C#和Java开发了一些项目之后再回到C++时,不免感慨C++相比C#和Java来说少了很多有用的库,比如AOP、IOC、ORM、steam API等等,所以我希望我能做点事,让C++的世界变得更美好,让C++开发者的日子变得更美好,尤其是这么给力的C++11出来之后,这种愿望就更强烈了,这是我将我工作中开发的一些基础库开源出来的初衷,也是我投入开源社区的动力。
我理解的开源社区是没有功利性的,靠的是一大批编程爱好者对编程的热爱,靠的是一点梦想。除了这些之外,开源社区的发展应该切合现实实际需求,让更多的人愿意参与进来。现在对于C++社区而言是一个黄金时代,因为新标准的不断发展,以前的一些难做之事用现代C++去做都变得很简单,用现代C++去做前人未做之事,弥补以往C++世界的缺憾正当其时。我创建的C++社区(purecpp.org)正是在这个背景下诞生的,社区里不仅有高质量的原创技术文章,还有线下技术沙龙(最近组织了一次主题为C++魔法的技术沙龙,详细信息在这里:http://purecpp.org/?p=202),还有活跃的开源项目,在这里透露一下我们现在正在做的一件有趣的事情,是我们社区的一个开源项目,用现代C++做一个灵感来源于sinatra的现代Web Framework,我们的社区后面升级会采用这个框架,社区网站也将用现代C++开发,敬请关注。
CSDN:给C++爱好者分享些经验和心得感悟。
祁宇:兴趣是最好的老师,享受现代C++带来的乐趣会让你学习C++变得更容易。任何书或资料都只能让你入门,最重要的是实践。在你享受你喜爱的编程语言的时候,心怀感恩,业余之时为这个语言的发展做一点事,生活将会增加更多乐趣。查看试读样章:向祁宇老师提问,移步社区问答:
CSDN现开启图书作者专访栏目,欢迎推荐采访人或自荐,来分享你的成长经历和相关技术,相关信息请发送邮件至:xiamz#csdn.net(#换成@)。更多精彩内容,请点击
或搜索关键字
推荐阅读相关主题:
CSDN官方微信
扫描二维码,向CSDN吐槽
微信号:CSDNnews
相关热门文章CloseBrace|一个简短的完整的Javascript历史CloseBrace|一个简短的完整的Javascript历史杜白小小百家号介绍在2017年,JavaScript的开发可以让新手使用语言,让许多老手瘫痪并且不确定从哪里开始或者选择哪条路径才是正确的。人们经常深究最新的和最伟大的,没有真正了解为什么它是如此伟大(或者为什么它可能不是如此)。了解JavaScript的历史可以帮助认识它现在的状态。我们一起讨论这些问题。所有的编程,用任何语言都可以解决问题。这是正确的在宏观层面上(“我们如何向用户提供解决方案?”),一个是中观层面(“我们如何尽可能快而有效率的对这些数据进行排序?”),另一个是在微观层面上(“我如何遍历这个数组?”)。编程语言是建立在给用户工具去解决这些问题。对于Web或者其他,JavaScript的代码和其他可以用来编写程序的代码并没有什么区别。刻薄的人也会很乐意让你知道JavaScript introduces有多少问题,我不否认有很多,但其它任何语言也是如此。我从来没见过一个经验丰富的程序员,不定期诅咒一些很久之前标准委员会做出的决定,这些理由可能不再有任何意义。本文并不打算深入和全面地研究JavaScript解决的所有问题,更不用说如何使用它来解决这个问题了。更确切地说,它是对语言本身和它用来解决Web上日益复杂的问题的历史的一个广泛的概述。它试图给大图片回答类似我们在哪儿 和 为什么我们在这里的问题,我不得不保持相当高的水平;一个完整的语言历史可以写一整本书。这就是我所说的简短历史。如果不知道基本原理,就很难理解诸如“框架是什么”和“为什么jQuery是解决问题A的好方法,而不是问题B呢?”等常见问题的答案。知道这些问题的答案可以让开发者做出更明智选择,从而节省大量的时间、精力和精神。我将文章分为四个基本的时间段。早期时代,包括第一个十年期间,新生的语言是在浏览器使用;jquery时期,jQuery等框架开始出现针对JavaScript开发的一些基本和极其令人沮丧的问题;单页App时期,开发者开始接触jQuery的局限,像Backbone和AngularJS框架崭露头角;现在时期,我们见过智能技术,紧凑的写框架,注重速度,易用性和条块分割的应用开发,以及回归“Vanilla”的JavaScript。对于每一个时期,将提供一些关于Web开发的背景,谈论人们遇到的问题,并解释该时代的技术如何解决这些问题。但是我们已经超越了我们自己。让我们带一台时光机回到恐龙在地球漫游的日子,一个特别的浏览器主宰着:网景航海家。早期时代时间表: 大约1996 - 2004问题: 基于DOM操作、用户交互创新: JavaScript 本身, XHR 和 AJAX主流浏览器: Netscape Navigator,微软Internet ExplorerJavaScript由Brendan Eich在十天内创建,接着一个雇员Mozilla 被雇佣把Scheme编程语言楔入网景浏览器。这个计划被抛弃取代了一种其语法更类似于java的语言。Eich创造了一个语言LiveScript,可以直接嵌入到HTML文档解析的浏览器,不需要编译。1995年9月LiveScript首次被运用在Netscape Navigator ,并在1995年12月更名为JavaScript软件第三测试版。[ [ 1 ] ](# foot1)除了名字,JavaScript共享了Java的共同点,除了C语言, indentation-indifferent,面向对象的语言,这些实际上有相当多的共同点,但不包含与java基础代码共享,并且重要核心方面的语言是完全不同的。决定命名它为JavaScript是一项市场行为,并且导致了,招聘人员联系21年接触过JavaScript的开发者,气喘吁吁地开始庆祝所有的令人兴奋的java编程机会。感谢 Mozilla!Netscape 3,尤其Netscape 4是他们一天中的 Tyrannosaurus Rexes,在他们庞大的下颚力量之间压倒所有的挑战者。在最初的几年中,JavaScript在与微软的各种脚本语言的战斗,这是一个重要的因素是在任何给定的时间网站才可能在Netscape或Internet Explorer(然后在其第三版)正常工作,但都没有。不要误会,Netscape在这些年里并没有爬行。Netscape 3,特别是Netscape 4是他们当天的暴龙Rexes,在他们巨大的下巴的强大力量之间打碎了所有的挑战者。IE也是一个可以正常渲染HTML的运行,更不用说一旦级联样式表广泛流行。 Netscape似乎不可阻挡。但是到二十年代初,Netscape的发展萎缩,Internet Explorer的第一个版本5,其次是5.5,然后是上帝杀手,版本6持续改善,获得更大的市场份额。JavaScript目前的发展是有限的。Mozilla和Microsoft都采用了“JScript”语言,主要是为了避免版权问题而在标准化方面进行了大量的尝试。然而,浏览器能力的差异却很大。存档PlanetQuake版本,在Netscape 4,c1999 。 我们用JavaScript来滚动主图片下的新闻头条。 这是异常的l33t ...因此,编写在多个浏览器中工作的复杂脚本是乏味的,有时是完全不可能的。 那个时代的许多脚本都被降到了钟声和口哨。作为[反应军备库](https://reactarmory.com/)(和许多优秀的JavaScript帖子和作弊表)的创建者(James J. Nelson)(http://jamesknelson.com/),表示:“我 在这个时代进入JavaScript,因为我想将鼠标悬停图像添加到我正在创建的网站上的菜单栏。我还使用JavaScript去创建用户不友好下拉菜单,创建烦人的弹出窗口并且制作一些简单的动画。”令人讨厌的滚动文字比比皆是。 警报,确认框以及大量的安全漏洞也是如此。在早些天可能是JavaScript最常见的单一使用方法是创建上述的DHTML效果,如图像翻转,功能最终在很大程度上被CSS替代。有人用JavaScript做得很好。 作为[Dori Smith](http://www.dori.com/),[JavaScript:可视快速入门指南](https://www.amazon.com/gp/product//ref=as_li_tl?ie= UTF8&tag = loserace-20&camp = 1789&creative = 9325&linkCode = as2&creativeASIN = &linkId = 5c8ae5156a0ac42a84bfb)和语言笔记早期的程序员/作者,“90年代后期有大量的JS框架和文库。 Nick Heinle和Steve Champeon都有一个,只是两个例子。但他们都依赖拥有者的持续更新,并且对于任何人尝试在同一时期开发网站都是困难的。”它很难去 find 这些文库,并且很少人会看。当它来到网络上的动态互动时,场景由Java小程序,ActiveX小部件和Macromedia Flash主导。它进入了二十世纪三十年代,还有一些幸福的融合发展,让JavaScript真正起飞。其中之一是为JavaScript驱动的前端和外部后端服务器之间的异步通信创建了各种方法,包括所有主流浏览器最终采用XMLHttpRequest(XHR)。另外,稍后就是Prototype,MooTools以及jQuery等框架的开发。jQuery时期时间段: 大概2004 - 2010年问题: 增加站点复杂性,多浏览器支持创新: 强大的DOM操作,早期单页应用程序主流浏览器: Microsoft IE, Mozilla Firefox在二十一世纪初,DHTML开始着手。 D代表Dynamic,基本上意味着“我们使用您在屏幕上看到的HTML进行操作,而不需要浏览器刷新”。它看起来有点可笑,但这在当时是巨大的交易。传统上,当你想要做任何事情时网站需要一个页面刷新。JavaScript提供一些玩具,但是标准网站仍是非常基于页面。当用户单击某个选项卡,将它们转到某个单独的HTML文档或者给一个整页刷新,以便在重新渲染HTML前调整模板变量。这仍然是许多网站的核心功能(包括这一个)的工作原理,但DHTML强大的支持意味着更多的网站可以变得更好,更动态。在这个时期仅有两个主要浏览器,Microsoft’s IE6是一个不可思议的浏览器发布,但最终变成了一个不受支持的僵尸,徘徊在互联网脖子上,Mozilla’s Firefox。然而,边框上还有其他的,还有多个版本的IE仍在使用中。“由于Web标准状况不佳和网络中大量的错误,当时开发网络非常困难,”[ JavaScript:The Good Parts](https://www.amazon.com/gp/product//ref=as_li_tl?ie=UTF8&tag=loserace-20&camp=1789&creative=9325&linkCode=as2&creativeASIN=&linkId=af04e2fc05da8bb9d628b7f20bbd26c4) (以及许多其他文字 对语言)的作者[Douglas Crockford](http://www.crockford.com/) 告诉我。 “自动更新尚未发明,因此,[新]浏览器版本的发布并没有消除网络中的错误。 但它确实增加了新的。”尝试在这些浏览器之间呈现一致的体验是一场恶梦; 试图使这种体验的动态更加糟糕。 jQuery的创建者[John Resig](https://johnresig.com/), 谈论框架的起源:当我最初创建这个库时,我想划破两处痒:1)为DOM提供一个简单的界面,2)减少开发过程中存在的跨浏览器问题的数量[[2]](#foot2)跨多个浏览器中处理DOM对于2000年初的web开发者来说是一个重要的因素,但这并不是他们唯一的想法。该行业的另一场巨大革命是AJAX,它允许与服务器进行数据的异步交换,而不仅仅依赖于在页面渲染时可用。“2005年,[Jesse James Garrett](https://twitter.com/jjg) 发现了AJAX,DHTML的新名称,” Crockford说。 “AJAX比DHTML更成功,因为Netscape已经死亡,而且由于微软在IE6之后放弃了网络,因为W3C无效地分散了语义网。长期的忽视带来了急需的稳定。AJAX是一个大的冲击,鼓舞了许多新的图书库去制作单页网络应用程序。”微软,谷歌等大型公司的早期开拓者们,在这些年来对AJAX做了很多令人信服的事情,但是在2004年发布的Gmail真正使得Web开发世界变得更加有趣。这是处理电子邮件的全新方法:通过在浏览器中进行所有操作并将邮件存储在Google的服务器上,这意味着用户可以从世界上任何地方的任何互联网设备访问他们的邮件,不需要安装本地电子邮箱程序。这不是第一个单页应用程序,但它是其大幅增加时期的最佳,并且被世界注意到。Gmail以其他几个网站的方式使用了DHTML和类似AJAX的代码,并且其他开发者希望能够快速,轻松地使用这两个,这导致框架的兴起,包括大类:[jQuery](http://jquery.com/)。 “它解决了浏览器兼容性问题,添加了一大堆有用的实用程序,并介绍了除document.getElementById之外的选择器,”Nelson说。 “jQuery的唯一问题是它的重量。 如果你正在拨号,30kb是很多的。“在Crispy Gamer,我们使用了大量的jQuery,扩展盒,标题翻转,交换标签等。但jQuery不是第一个!原型,首先开发为Ruby on Rails添加AJAX支持,但也能够将DOM操作类似于于2005年2月发布的广为人知的jQuery。其次是2006年的jQuery,2007年的[MooTools](https://mootools.net/) 等。虽然这些文库每一个都提供了很多相似的功能,但他们有自己的方法。ProtoType重写并扩展了许多JavaScript的本机方法,让一些开发人员发现这些方法而不安。MooTools更改了JavaScript的Element对象,这意味着它允许更多地DOM操作。jQuery没有这些东西,专注于提供一个基础JavaScript顶部的框架。这种方法在短短的几年中证明是最成功的,jQuery已经成为主导框架。它仍然保持到现在。更多的网站在2017年使用jQuery而不是JavaScript框架。但是框架真正提供了什么?那么我们来看看这些代码片段。 以下是简单的JavaScript中隐藏点击元素的方式:var el = document.getElementById('myElement');var el2 = document.getElementById('myOtherElement');el.addEventListener('click', function (e) { el2.style.display === 'none';}为了完成工作,假设您的浏览器正确支持这些命令,这在许多DHTML和AJAX用例当然不是一个安全假设。 以下是jQuery中的相同功能:$('#myElement').click(function() { $('#myOtherElement').hide();});它不仅简洁易懂,而且还具有另外一个好处:jQuery确保它在所有浏览器中都可以工作,这样工程师就不用花时间担心。这也意味着开发人员不必花费太多时间重新创建一轮。 为什么jQuery已经提供了这些和其他几十个还要自己编写show / hide / toggle函数?“jQuery并没有真正改变我用JavaScript构建的内容,”尼尔森说,“但是确实改变了我如何构建的东西。它使JavaScript更简单,在当时似乎是神奇的。“简单地说,jQuery和其竞争的框架为所有使用它们的人开发更快更容易。慢慢地随着网站越来越活跃,没有Google工程师的公司开始尝试和构建像Gmail(或moreso)一样复杂的应用程序,他们开始陷入困境。代码库由上千行jQuery代码组成,很难去维护并且包含如此多自定义功能,使新的开发变得具有挑战性。如果你的网站有五个可点击的元素,有五种情况下$(“# myelement ').click()是可以控制的。如果有500个可点击元素,它就变得有问题。如果是5000个可点击元素,它就变成了一个噩梦。需要更多的东西。JavaScript框架开始发展,具有明显的后端特征和方法。单页应用程序时代已经到来。单页应用程序时代时间段: 大约 2010 - 2014问题: DHTML超载, 大规模数据处理, 速度创新: MVC框架, 双向数据流, DOM自动主流浏览器: Google Chrome, Microsoft IE, Mozilla Firefox, Apple Safari在单页应用程序时代其他一些创新有助于引导。一个是谷歌的Chrome浏览器,在2008年初发布。在Chrome的创新中,一组开发工具比以前看到的更强大。持续地改善和更新,谷歌工具允许开发人员实时地浏览、编辑HTML、CSS和JavaScript所发生的一切。它还提供了一个集成JavaScript的调试器,它允许以类似于传统编译语言的方式调试语言(以前,开发人员依靠浏览器插件或外部程序来实现这些特性)。大多主流浏览器提供类似的本机功能。Chrome的其他主要贡献?[ V8 JavaScript渲染引擎](https://developers.google.com/v8/) ,允许独立的JavaScript平台创建[Node.js ](https://nodejs.org/)。 这篇文章的历史主要集中在JavaScript的前端,但我们不能不提到,Node.js已经成为网站发展的一个主要因素。爱好者和大企业一样采用Node的快速,异步方法使应用技术发展,证明受到开发者的欢迎,现在控制许多网站,包括这一个。JavaScript框架需要变得更像这些已经存在的后端语言如C++, PHP, Ruby,和其他。虽然不都是Chrome。单页应用程序时代可以说在Web生命的任何周期浏览器之间的分歧都有着最为平等的使用,但是……这是一种值得开发的乐趣。浏览器,甚至IE,采用了太多标准。首先,有一个很好的机会,你开发的网站将看起来和功能相同,无论你在浏览器打开它,或至少只需要微小的调整。CSS框架如Sass出现,使Web开发的可视化方面变得更容易,并且盒模型的限制已经相当广泛的编目(导致大量的讨论,有些善良,有些并不是,关于“Web 2”网站的数量是多少?)。混乱即将来临:flexbox即将来临,在2010年 Ethan Marcotte 出版了他的地标文章论响应式网页设计,但对于一个简短的时期,事情好像有点稳定了。在单页应用程序世界中,情况并非如此。厌倦了处理jQuery数万行代码的高深莫测的泥沼,开发商开始铸造出其他的替代品。开发了新的框架,其侧重点不同于上一期的主要版本。这里需要的是一套工具,使他们能够管理日益复杂的应用程序。JavaScript框架需要变得更像这些已经存在的后端语言,如C++, PHP, Ruby,或者其他。Enter Backbone.js.在2010年,开发者 Jeremy Ashkenas发布了他为单页应用程序开发人员编写的新工具集。轻量级的,快速的,不依赖jQuery(虽然开发者可以包含jQuery来解锁更多的Backbone特性),但是Backbone是专门用来解决“jQuery沼泽”问题的。本文从它的网站摘录:“创建JavaScript应用程序很容易,但最终纠结成堆的jQuery选择器和回调,都在疯狂地将数据同步保存HTML界面,你的JavaScript逻辑,和你的数据库在服务器上。对于丰富的客户端应用程序,结构化的方法通常是更有帮助的。”Backbone的方法是将代码拆分为数据模型,用于处理该数据的操作集,并显示它的视图。它还提供了很多“自动的”处理一些幕后操作意义。通过连接他们的视图到他们的数据,开发者不再担心在数据改变时更新他们的站点。Backbone为他们实现了……仍然如此。Backbone是一种优秀的产品,在一些非常大的、非常著名的Web应用程序中广泛使用。同样在2010年,第一版的AngularJS出现在荧幕。最初是由 Miko Hevery and Adam Abrons开发,当它在谷歌结束时Hevery成了一名员工。它得到了谷歌和一批专注于外部开发人员的支持,尽管最近的版本被重写了,而且确实属于下一节。但是AngularJS 1.X,仍然是由开发商和谷歌的支持,依旧在广泛地使用互联网。我不能合法证明给你我的AngularJS的任务,这里是AngularJS推广To-Do list为这个时代的“Hello World”应用程序。AngularJS在某种程度上给出一个完整的前端架构解决方案甚至没有backbone.js。它提供了强大的工具和基于组件的体系结构,这用普通的jQuery很难或不可能重新创建。正如Nelson所说,“我已经试着(或者失败)用jQuery和原始JavaScript构建有用的单页应用程序几年了。然后我偶然发现AngularJS,告诉我,一个应用程序的模型不需要活在DOM里。这使得大型应用程序可行。”使用它的双向数据流的概念,AngularJS允许开发者去创建应用程序,在服务器和客户端方面反射数据变化。例如:一个人可能创建了一个AngularJS应用,用户填写表单可以看到他们进入实时页面上其他地方的数据积累,并且知道数据是同时保存在某个服务器。再也没有人需要写大量的jQuery实现这种同步性–除了happened。AngularJS,像Backbone,也提供了一个大量的帮助挺操纵DOM。像Backbone,它可以很好地使用jQuery,但是不需要它去展示更多主要功能。这允许开发人员熟悉jQuery的生态系统逐步转移到AngularJS。该框架还帮助推广了组件的使用——作为HTML标记的单独功能,但可能包含复杂的功能。这允许广泛的清洁和分隔的标记,其中的一个组件可以被称为一个标签,这样:并生成一个完整的用户列表,包括详细信息和嵌入的HTML,比如指向用户配置文件页面的链接。同样重要的是,如果在$users.list阵列数据发生改变,AngularJS会重新用新更新的数据渲染列表,而开发者不需要做任何进一步的操作。Backbone与AngularJS,突然有两个完整的工具箱填充单页面应用程序开发工具,解决大规模jQuery发展的诸多不足,使开发者避免经常写他们自己的类似功能。如果JavaScriptshi是基本手动工具,jQuery强大的工具,那么像Backbone和AngularJS框架就是线性封装-专业化集合,为了一个单一的目的:创建单页应用,而设计的高度复杂的设备。问题是...他们不是特别小或者快(尤其在移动设备上),可能更难维护他们自己的权利,整个双向数据方法可能是一把真正的双刃剑。2013年,Facebook发布了React,一个体积很小但在渲染时极快的前端框架。2014年,他们采用基于事件的方法来组织和开发应用程序,Flux。这些东西以及围绕它们成长的相关技术,又一次改变了JavaScript应用程序开发。The Modern Era 现代的时代时间: 大约2014 - 现在问题: 速度,增加了应用程序的复杂性,可靠性创新: 虚拟DOM,单向数据流,类型,测试主流浏览器: Google Chrome, Apple Safari在过去的几年里,在访问页面时,我们看到了稳步的多元化。仅限于家用PC的领域,目前是非常合理的用某个人的手机,平板电脑,笔记本电脑和台式电脑在同一天浏览一个网站。这些设备可用的带宽、处理器功率和屏幕分辨率差别很大。小的下载和快速的渲染是非常有价值的...不,你是从访问很多感觉完全舒服的锤击用户用海量图像下载,兆兆字节的广告代码,并自动播放视频内容的网站了解它!但是内容网站不是单页应用程序,和其用户期望是不同的。单页应用程序是想要取代本地应用程序,这样的话,它们的速度和响应性将被取代。一个用户可以忍受五秒钟的负载去阅读最新的体育新闻,但他们在银行应用程序或者分析仪表板上点击一个按钮时不可能忍受五秒钟的负荷。Facebook开发React为了加速或者便于他们的开发者使用。很多聪明的人花了很多时间在上面,这说明了。它不是完美的,而且有新的和潜在的更好的选择总是在流水线上,但它有很多提供给开发人员-如此多,以至于它经常被使用在并不真正需要它的项目中……但我们会做到这一点。同样,如果你正在阅读这篇文章,这是一个非常好的机会,你可能已经听到或者积极地使用React作为你的整个前端解决方案。那是为什么?React没有取代Backbone和AngularJS作为首选的JavaScript框架,虽然它的用法有了一个凹痕,部分原因是它不是一个完整的框架。React的设想是作为视图语言用于前端MVC框架。的确,React的创建是为了与其他现有的技术一起工作,然而其他一些技术是被Facebook开发定制的。也就是说,与Facebook从未接触过的科技公司一样,在家工作。它不处理数据,它不能处理的事件,它不处理XHR / Ajax…它所能做的是渲染组件。同样,如果你正在阅读这篇文章,这是一个非常好的机会,你可能已经听到或者积极地使用React作为你的整个前端解决方案。那是为什么?因为生态系统的是围绕React的成长的,启用捆绑技术如Webpack 或者 Browserify,允许“React”成为一个方便快捷的方式“React加上一大堆其他的东西。”罗伊·尼尔森简洁地总结说:“从某种意义上说,现代时代的感觉与jQuery时代类似,因为它使构建单页应用程序变得简单得多,而不可能使新类型的应用成为可能。WebPACK和[NPM](https://www.npmjs.com/) 促进这些组件和它们的资产分享。 [Babel](https://babeljs.io/)意味着我们不需要创造新的语言只是为了让JavaScript使用。”然而,React并非没有问题。基于生态系统的包意味着JavaScript文件大小可以迅速失控,除非给予大量的关注,整体景观甚至对于有经验的开发者都会被吓到,更别说新手。有质量的文档和友好的社区有助于减轻这种情况,但学习曲线仍然非常陡峭。其他框架也在涌现。正如被提及的AngularJS 2已经基本上重写,以更具反应性的方式运作,它的渲染比AngularJS 1更快,这在展示大量的数据时是一个重要的因素。 Meteor,早React至少一年(而且,事实上,可以使用React作为其视图层),有一个专门的例子。Vue.js,第一次发布是在2014年2月,是一个小而快的可以和其他契合好的前端框架,允许增量的实现。它的语法与React相似,其结构虽然不完全相同,但遵循类似的基于组件的方法。[Preact](https://preactjs.com/) 是一个非常小的,快的可替代的使用ES6从底层建成的React,一个更现代的JavaScript版本,享受增加受欢迎程度(React还可以与ES6一起工作,但初步建成是和ES5,这或多或少是我们已知的JavaScript大约十年了)。其他在跟随。这是很重要的去注意React,AngularJS,和其他的正在做的是什么,而不是真正重新发明。其他语言正在做这些事情甚至在JavaScript世界有十年了,如Crockford指出,“我们停止叫它DHTML或者AJAX,而开始叫它单页应用程序,但是它仍然是和新的图库一样的东西。”这基本上是正确的;底层代码仍然是JavaScript,并且仍在做与人们在早期使用语言所做的相同的基本事情。现在的差异是一种方法。所有这些框架趋向的焦点在于解决同一个问题:为开发者创建一个多样化的工具,使他们能够快速构建在各种设备上都能很好工作的快速的单页Web应用程序。他们倾向于把重点放在数据流和显示上:基本上,减少开发人员必须做的工作,目的是以一种对最终用户有用的方式在屏幕上获取提供给他们的数据,并在数据更改时自动化更新屏幕。当你在处理海量数据时,你想向用户展示一个类似经验的应用程序,他们就是救生员。哪个把我们带到Vanilla JS。在这一点上,你可能想知道,在2017开发一个小网站的人应该利用他们微薄的JavaScript需求。AngularJS和React确实似乎有些过分,不是吗?他们是。虽然对于单页应用程序或拥有大量移动部件的网站来说是非常棒的,但是如果您只想点击几个按钮并在选项卡之间进行交换,那么现代js框架就不必要地复杂了。答案是“我要用什么?”是的,根据您的特殊需求,无论是jQuery 3或Vanilla JS。不,你不再看到Inception。是的,Inception使用Vanilla JS。Vanilla JS不是一个框架。它不是一个文库。这不是什么除了,嗯,JavaScript。最近添加到JavaScript使其工作更加容易。document.querySelector 和 document.querySelectorAll,例如,提供用类似CSS的语法类似jQuery元素选择器(“.exterior-link”, 例如)。ES5,ES6,与ES7是所有现代浏览器基本上完全支持的,减少对jQuery的跨浏览器的帮助对于那些不再被迎合迅速减少的用户传统浏览器的需要。性能方面,编写简单的JavaScript代码几乎总是很快(除非您的例程是次优的)甚至在更老、更慢的移动设备上。Smith,像许多开发商对这一新焦点的兴奋。“Vanilla JS的回报,这对我来说是巨大的。我非常讨厌堆栈溢出大量的人,海事组织,滥用jQuery和类似的框架。把所有的jQuery都带来,这样你就可以写三行代码而不是五行代码了?台湾。”我们没覆盖很多Vanilla JS在CloseBrace,但是网络充满了好的资源。特别是,该网站[ Chris Ferdinandi ] 的朋友(https://twitter.com/chrisferdinandi) 产生了大量优秀的Vanilla JS内容在 Go Make Things,包括你可以使用大量开放资源代码在自己的项目里。所以,我们在这里。这是2017,JavaScript生态系统既繁荣又令人困惑。似乎没有人能确定它将走向何方,只是它将继续增长和变化。网络不会去任何地方,这意味着JS不会去任何地方,我很高兴看到未来的时代带给我们什么。希望你觉得这篇文章很有趣和内容丰富,我们将更清楚地知道我们在哪里,我们是如何来到这里,以及为什么我们走上这条路有了更好的理解。感谢阅读。如果你喜欢这篇文章,请考虑在Reddit 和 Hacker News投票给它。哦,请,请留下评论,说明我错过或没有正确解释的所有伟大的东西!关于 CloseBraceCloseBrace对于JavaScript是一个教程和资源站点通过JavaScript开发者。我们聚焦于JavaScript全栈开发,目前在周二和周四创作的教程在我们的五分钟的React 系列。对每周更新的新内容感兴趣吗?注册我们没有垃圾,没有广告简讯!要帮助发展,文章和教程进一步支持吗?看看我们的教程CloseBrace 前期计划!本文仅代表作者观点,不代表百度立场。系作者授权百家号发表,未经许可不得转载。杜白小小百家号最近更新:简介:牺牲自我 娱乐大家 请关注我哦作者最新文章相关文章}

我要回帖

更多关于 c语言复杂度 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信