首页>参考读物>计算机科学与技术>软件与程序设计

Hack与HHVM权威指南
作者 : [美] 欧文?山内(Owen Yamauchi) 著
出版日期 : 2017-03-21
ISBN : 978-7-111-55484-4
定价 : 69.00元
扩展资源下载
扩展信息
语种 : 简体中文
页数 : 247
开本 : 16
原书名 : Hack and HHVM: Programming Productivity Without Breaking Things
原出版社: OReilly Media, Inc.
属性分类: 店面
包含CD :
绝版 : 未绝版
图书简介

Hack是一门编程语言。它基于PHP,继承了PHP中的很多语法,并且完全可以和PHP进行互操作。然而,很可能有人会认为Hack只是在PHP的基础上略加了装饰修改。Hack最核心的特色是鲁棒的静态类型检查,这已经足够把Hack作为一门编程语言和PHP区分开了。对于现在已经从事已有PHP代码库开发方面工作的开发者来说,这是非常有益的。在这种情形下,将会给这些开发者很多的启迪,当然,对于新项目的底层开发也是一个非常不错的选择。

图书前言

在Facebook公司的大部分发展历程中,每隔几个月就会举办“黑客马拉松(hackathons)”活动,活动的目的在于鼓励工程师们碰撞出好的想法,而这些好的想法并不是和他们的日常工作相关的,他们自由组队,然后在一两天的时间内做出一些非常有意思的事情。
在2007年11月的一次“黑客马拉松”活动上,诞生了一个非常有意思的实验:一个工具能够将PHP程序转化为C++程序,然后还能够用C++编译器进行编译。想法是C++程序将会比PHP原生的程序运行起来快很多,因为它可以得益于多年以来对C++编译器的大量优化工作。
对于Facebook来说,这种可能性是非常有趣的,因为公司增加了大量新的用户,而支持更多新的用户需要耗费大量的CPU运算周期。所以当你耗尽所有可用的CPU运算周期后,除非你耗费大量财力购买更多的CPU,用来支持日益增多的用户所带来的CPU运算能力的需求,否则你必须寻找一个方法来降低每个用户的CPU消耗。由于Facebook整个网站的前端都是用PHP语言编写的,所以任何使PHP代码耗费更少CPU运算周期的新技术都受到欢迎。
在接下来的7年时间里,这个项目的发展远远超出了最开始在“黑客马拉松”中的起点。PHP到C++的转换器称为HPHPc, 在2009年的时候它成为支撑Fackbook网页业务唯一的服务器端引擎。在2010年年初,它以“HipHop for PHP”的名字开源了。然后从2010年起,一个全新的方法用来执行——即时编译为机器代码,并没有C++牵扯其中——脱胎换骨于HPHPc的代码库,并最终取代它。这个即时的编辑器称为“HipHop虚拟机”,简称为 HHVM,并且在2013年的早期彻底取代了Facebook的网站服务器集群。早期的PHP到C++的转换器消失了,它没有在任何地方进行部署,同时它的代码都被删除了。
而Hack的起源是完全分开的,其根源在于试图在PHP中使用静态分析以自动探测潜在的安全漏洞的一个项目。很快,事实证明,PHP的本质使得它在非常有用的静态分析方面很难有所进展。于是“严格模式(strictmode)”的想法就诞生了。对PHP进行修改,增加一些新的特性,比如引用、删除和添加一个补充的复杂类型系统。PHP代码的作者可以自由选择是否使用严格模式,在保持完整的互操作性同时,获得更加强大的代码检查能力。
Hack的方向从那时开始就作为基于PHP的类型系统掩盖了其本质。它在构建Hack编码的道路上获得了很多有重大影响的新特性,比如异步函数。它添加了很多包括集合在内的新特性,使得类型系统更加强大。本质上来说,它是一门和PHP不同的新语言,它已经在编程语言方面取得了自己的新位置。
以上就是Hack的发展历程,目前Hack是一门现代化的动态编程语言,它拥有鲁棒的静态类型检查能力,在HHVM上执行。HHVM是一个和PHP无缝兼容且具有互操作性的实时编译运行时引擎。
什么是Hack和HHVM
Hack和HHVM是紧密联系在一起的,所以对于这些术语到底指代的是什么会有一些混乱。
Hack是一门编程语言。它基于PHP,继承了PHP中的很多语法,并且完全可以和PHP进行互操作。然而,很可能有人会认为Hack只是在PHP的基础上略加了装饰修改。Hack最核心的特色是鲁棒的静态类型检查,这已经足够把Hack作为一门编程语言和PHP区分开了。对于现在已经从事已有PHP代码库开发方面工作的开发者来说,这是非常有益的。在这种情形下,将会给这些开发者很多的启迪,当然,对于新项目的底层开发也是一个非常不错的选择。
除了静态类型检查外,Hack还拥有PHP没有的很多项新特性,本书将对这些新特性进行阐述:异步函数、XHP等。出于解决一些粗糙边界问题的目的,Hack也故意缺失了对一些PHP特性的支持。
HHVM是一个执行引擎,它同时支持PHP和Hack。它让两种语言可以互操作:PHP书写的代码能够调用Hack代码,反之亦然。当执行PHP的时候,它的目标在于对PHP.net提供的PHP标准解释器进行替换。本书中有些章节的内容是关于HHVM的:如何配置并部署它,如何使用它调试和配置代码。
最后,我们要介绍的就是从HHVM中分离出来的Hack类型检查器:这是一个能够分析Hack代码(而不是PHP代码)然后报告类型错误的程序。在它能够接受的代码方面,类型检查器目前要比HHVM严格一些。当然,在未来的发行版本中,HHVM应该比类型检查器更加严格。目前,除了你在命令行里面启动它的命令“hh_client”外,类型检查器还没有个定型的名字,我更倾向于叫它“Hack类型检查器”(Hack typechecker)或者就叫做“类型检查器”(typechecker)。
到目前为止,HHVM是运行Hack的唯一执行引擎,这也是有时它们会混为一谈的原因。
本书读者对象
本书适合那些已经对编程有一定基础的读者。这里并没有花费时间解释很多编程语言里面常见的概念。例如控制流、数据类型、函数、面向对象编程等。
Hack派生于PHP,本书不会特别解释PHP中常见的语法,除非Hack里面相关的语法知识点与之不同。所以有PHP的知识基础将会非常有用。如果你从来没有使用过PHP,但是有其他编程语言的相关经验,那么你仍然能够读懂本书里面的大部分代码。语法知识点都是非常易于理解的。
如果你拥有PHP相关经验,但是从未工作在一个复杂、高负载的PHP网站环境中,你也不必担心这里有什么你看不懂的。无论你的代码是简单独立运行的小脚本,还是数以百万行级别像Facebook一样的大型Web应用,Hack对于任何规模的代码库都大有裨益。
这里有一些材料假设你对传统的Web应用已经熟悉,例如关系数据库查询、使用 memcached (见第6章) 和生成HTML (见第7章)。如果它们和你不相关,那么你可以跳过这些章节。但是事实上,对这些章节的理解并不需要什么特别的知识,哪怕是小的基础网站应用的开发经验。
我希望本书并不仅仅用来解释事物具体是什么的,而且希望介绍它是怎样的运作原理。程序语言设计是一个很困难的问题。它本质上是一门对上百个可能的方案统一进行权衡的艺术,同时它还受向后兼容的相关内容的制约,Hack也不例外。所以如果你对“一门程序语言如何通过一系列不同寻常的限制来成就未来”这个案例学习感兴趣,那么本书将会提供你所需要的内容。
哲学理念
在Hack和HHVM设计的背后存在着一些理念。这些理念可以帮助你理解事物的运转方式。
程序类型
这里有个单独的观察程序用于指引HHVM优化和执行代码的方式,还指引Hack验证它的方式。它就是隐藏在大多数动态语言程序背后的一个静态类型的程序。
看一下如下代码,这段代码在PHP和Hack下都可以正常运行:
for ($i = 0; $i < 10; $i++) {
 echo $i + 100;
}
虽然没有明确进行说明陈述,但是对于任何读者来说,很明显$i总是个整数。用计算机术语来说,$i是单态(monomorphic)的:它只有一个类型。类型检查器将会利用这个属性来验证表达式“$i + 100”是否有意义。一个执行引擎也会利用这个属性把“$i + 100”编译为高效机器码,来做这个加法运算。
循环变量看起来似乎是个平常的例子,但事实证明,在现实世界的PHP代码库中,大多数的值都是单态的。这造成了一种直觉,对于一个值,如果不知道它的类型,你就不能做太多的事情。比如在它上面做算术运算,对它做索引,调用它上面的方法等。甚至在动态类型语言中,大多数的代码在使用它做任何事情之前,并不会检查它的类型,这就意味着这里有关于值类型的隐藏设定。如果运行的大多数代码不存在运行时类型错误,那么大多数的时候这些隐藏设定也必须成立。
HHVM的方法是假设这个观点成立,并且相应地编译 PHP和Hack为机器码。因为它运行的同时进行程序的编译,它知道将要编译的每条代码的逻辑流向。它将生成机器代码并假定这些类型: 在前面所示的范例代码中,当编译表达式$i + 100时,HHVM将看到$i是一个整数,然后使用单条加法硬件指令来做这项相加操作。
同时,Hack的目的在于使隐藏的静态类型程序显示出来。它使一些类型进行显式的标通过标注使一些类型变成显式的,然后使用类型推理得到余下的类型信息。现在的理念就是,Hack并不显式地限制已经存在的PHP程序,而是对PHP程序已经显露出来的行为进行鲁棒的静态分析。
这里有一点值得重复一下:Hack的静态类型并不会带给你一个不同的编程风格。这门语言用来给你已经写好的程序一个更好的诠释方式。
逐步迁移
Hack起源于一个数以百万行计的PHP代码库。不管这两种语言之间有多么相似,这里都没有什么办法能够一下子把如此大规模的代码库从一种语言迁移到另外一种语言,所以Hack采用了从PHP逐步迁移的路线。Hack可以使用以PHP编写的函数和类,反之亦然。对于Hack的每个特性,无论是否使用它的代码,这里都有无缝对接进行交互的方法。
另外,标准的Hack/HHVM发行版有自动从PHP到Hack迁移的工具,它还包含一个工具用于把Hack代码编译为PHP代码。这主要是为了方便一些类库的作者迁移到Hack上,同时为非HHVM用户保持一个使用其代码的通道。这些工具代码将在第10章中详细描述。
而HHVM致力于能够和标准的PHP解释器一样运行PHP代码。迁移PHP代码库到Hack的第一步就是要在HHVM上运行PHP代码。在这一步骤中,唯一重要的必要代码变更就是围绕扩展的,并不是所有的PHP和Zend扩展都兼容HHVM。这里不应该由于核心语言的不同行为而导致扩展有所变化。
除去它的本源因素,对于开始一个新的项目,Hack毫无疑问是个非常棒的选择。事实上,你会以这样的方式从Hack中获得最大的益处:当代码库100%是纯正的Hack代码时,这门语言会发挥它的极致。
本书是如何组织的
Hack的核心功能是静态类型检查。它广泛涉及了Hack的所有其他特性,是Hack和PHP最显著的区别。本书第1章就详细地对本话题展开了阐述。本书所有其他章节的内容都依赖于对本章内容的理解,所以如果以前你没有接触过Hack,我强烈建议你仔细阅读第1章的内容。第2章进行了补充,该章主要讨论了在Hack的类型体系中非常有趣的部分。
Hack其余的特性彼此间几乎都是正交的。第3章主要解释了Hack的一些小特性。第4章展示了一些在Hack中并不存在的PHP特性以及这样的原因。第5章解释了如何及为什么使用Hack的集合类。第6章主要解释了Hack的多任务支持。第7章主要解释Hack中更加稳健、更加安全地创建HTML的语法和库。
第8章主要涉及设置、配置、部署和对HHVM的监控问题。第9章涉及HHVM的交互式调试器hphpd。最后,第10章主要探索了一些编写Hack代码时所需要的工具,包括从PHP到Hack的迁移工具和一个交互式调试器。
版本
本书使用Hack 3.6 和HHVM 3.6,这个版本于2015年3月11日发布。(HHVM和Hack的类型检查器存在于同一个代码库中,它们包含在同一个代码发行包内。)当你读到这些内容的时候,应该会有更新的版本可用。然而,3.6版本将会是个长期支持的版本。会在发布的48周后修复安全问题及bug。
HHVM 3.6实现了PHP 5.6的语义注1。它支持PHP 5.6中所有的新特性,包括常量scalar表达式、可变参数函数、取幂操作符等。这些新的特性在Hack 3.6上也存在。通常来说,当一个新版本的PHP发布时,HHVM都会为Hack代码和PHP代码及时增加对新特性及语义的支持。
本书约定
本书中使用以下排版约定:
斜体
表明新术语、网址、电子邮件地址、文件名和文件扩展名。
等宽字体
用于代码清单以及在正文中引用程序元素,如变量或函数名、数据库、数据类型、环境变量、语句和关键字。
等宽粗体
显示用户应该输入的命令或其他文本。
这个元素表示提示或建议。
这个元素表示一般注解。
这个元素表示警告。
Safari际樵谙
Safari Books Online是一个随需而变的数字图书馆,在技术和商业方面以书和视频的形式,从世界领先的作者那里发布专业的内容。
专业技术人员、软件开发人员、网页设计人员、商业和创新型人才使用Safari图书在线,用于科研、解决问题、学习和资格培训。
Safari图书在线为企业、政府、教育机构及个人提供一系列计划和定价服务。
会员可以通过一个可全面搜索的数据库,访问数以千计的图书、培训视频以及出版前的手稿。这些内容来自数以百计的出版社,如O扲eilly Media、Prentice Hall Professional、Addison-Wesley Professional、Microsoft Press、Sams、Que、Peachpit Press、Focal Press、Cisco Press、John Wiley & Sons、Syngress、Morgan Kauf‐mann、IBM Redbooks、Packt、Adobe Press、FT Press、Apress、Manning、New Riders、McGraw-Hill、Jones & Bartlett、Course Technology等。为了获得更多关于我们的信息,请访问我们的网址。
如何联系我们
美国:
O扲eilly Media,Inc.
1005 Gravenstein Highway North
Sebastopol,CA 95472
中国:
北京市西城区西直门南大街2号成铭大厦C座807室(100035)
奥莱利技术咨询(北京)有限公司
我们为本书提供了网页,该网页上面列出了勘误表、范例和任何其他附加的信息。您可以访问如下网页获得:
http://bit.ly/hack-and-hhvm
要询问技术问题或对本书提出建议,请发送电子邮件至:
bookquestions@oreilly.com
要获得更多关于我们的书籍、会议、资源中心和O''Reilly网络的信息,请参见我们的网站:
http://www.oreilly.com.cn
http://www.oreilly.com
致谢
首先,没有多年来奋战在HipHop、HHVM和Hack的所有同事的共同努力,本书显然是不会存在的。这其中包含Facebook的现员工和前员工以及开源社区的成员,这里不一一列举他们的名字。正是他们的不懈努力、无私奉献,Hack和HHVM才能有今天的成绩。
这些项目不仅代表着一个巨大的成果,它们还是重大风险的回报。没有任何一个项目在其襁褓期内是肯定会获得成功的。它们都必须花费一定的时间来为自己的继续存在而奋斗。从经验上来看,我最了解的故事当属HHVM了。在两年的最好时间内,HHVM团队努力提升HHVM的性能,使其和HipHop能够平起平坐。他们知道,如果不能成功,他们将失去这项工作中的一切,工程师和管理团队尽管冒着这样的风险,但仍努力推动项目前进,这点特别值得肯定。多年来耗费自己和他人的职业生涯在这项有待探寻的事情上来是非常不易的。在这里,特别感谢如下缔造者:来自HipHop的Haiping Zhao,HHVM团队的Keith Adams、 Jason Evans和Drew Paroski,以及来自Hack团队的Julien Verlaguet。
现在,我非常感激能够有机会写这本书。我认为不会有很多公司或者团队会乐于让他们的工程师花费7个月的时间来写书,而不是编写软件。在写书这件事情上,一些人对本书也有很大的帮助。按照姓名字母排序,他们是Alma Chao、Todd Gascon、Joel Marcey、James Pearce、Joel Pobar和Paul Tarjan。
非常感谢Hack和HHVM的团队成员,正是他们审阅了本书的初稿。按照姓名字母排序,他们是Fred Emmott、Bill Fumerola、Eugene Letuchy、Alex Malyshev、Joel Marcey、Jez Ng、Jan Oravec、Dwayne Reeves、Julien Verlaguet、Josh Watzman。本书由于他们的反馈而迅速得以改进。书里如果有什么错误,那也是我的问题,与他们无关。

上架指导

计算机\程序设计

封底文字

HipHop虚拟机和Hack语言这两项新的技术已经成功在Facebook网站上得到了应用。那么大家又如何能从中获益呢?通过本书的学习,来自Facebook“Hack和HHVM”团队的核心成员Owen Yamauchi,将带你领略这久经考验的开源工具的魅力。
  你将领略到Hack语言所特有的静态类型检查及其他新特性。正是这些特性将Hack和PHP有效区分。同时,你还可以学到HHVM的建立、配置、部署以及日常监测。对于已有PHP或其他语言开发经验的人来说,这将是比较容易学习和掌握的。本书还将演示如何在已有的PHP项目或者新的类似项目上使用这些工具。
■ 在保留PHP灵活快速开发能力的前提下,学习Hack语言如何提供静态类型检查功能。
■ 如何利用Hack语言提供的新特性,写出类型更加安全的代码。
■ 了解HHVM————一个全面兼容PHP并且实时编译的运行环境。
■ 深入了解Hack语言的集合类型、异步函数,以及PHP的XHP扩展。
■ 了解Hack语言的设计原理,包括为什么它忽略了一些PHP特性。
■ 在更安全地生成HTML和多任务特性方面,如何使用Hack语言。
■ 学习使用Hack编程开发的相关工具,包括如何从PHP迁移到Hack语言。

Owen Yamauchi 是一名就职于Facebook的“Hack和HHVM”团队的软件工程师。在2009年就职于Facebook公司前,他曾经在苹果公司担任软件工程师,还曾经在VMware公司实习。

“Hack语言的显著成功之处,不仅在于它优雅而有强有力的变量系统和并发模型,还在于它提供给现有的PHP程序一个“更加具有想象空间并且可执行”的迭代迁移方案。Yamauchi对Hack语言及其运行环境(HHVM)的研究成果既清晰又专业。强烈推荐!”
————Ori Livneh
Wikimedia Foundation 首席性能工程师

作者简介

[美] 欧文?山内(Owen Yamauchi) 著:暂无简介

译者序

2014年3月21日,在PHP业界著名专家“鸟哥”(惠新宸)的新浪微博(@Laruence)下面,我第一次看到了Facebook公司的Hack语言及HHVM的相关消息。出于敏锐的职业嗅觉,我注册了相关的cn域名。在随后的周末,国内第一家Hack语言的中文站(http://www.hacklang.org.cn)和第一家HHVM中文站(http://www.hhvm.com.cn)正式出炉了。
一个月后在中关村的朔黄大厦,我很幸运地碰到了“鸟哥”,并和他畅谈了理想与人生。在鸟哥的启发下,我不久后就来到了新的工作岗位,开始了新的生活。环境改变了,生活和工作也踏上了新的征程。
2016年3月21日(很神奇,也是3月21日),机械工业出版社的缪杰编辑找到我,洽谈翻译本书的相关事宜。这正切合我内心深处由来已久的想法,即翻译一本专业的HHVM和Hack编程技术书籍,在中国范围内,传播最新的Hack语言编程技术知识。我非常强烈地感受到,必须抓住这个机会,完成这本书的翻译。
在2016年4月,我初步尝试翻译了前面的章节。5月到7月上旬,完成了本书大致的翻译。在工作之余以及周末的时间,我都在反复推敲英文原版书中的每个字句,经常熬夜到凌晨两点,这是一段难忘的经历。翻译同时也是不断学习提高的过程。在完成初稿后,我感觉又重新认识了Hack语言,也重新认识了PHP。
在2016年8月,刘诗灏编辑又给出了很多专业的修改意见。然后,整个译本又经历了几次脱胎换骨的变化,才最终呈现在广大读者的面前。
最后,我要感谢生活给我的磨砺。一份“不服输”的执念引领我在黑暗中不断探索前行。“不经历风雨,哪能见彩虹”,对此我有着更深刻的认识。我还要重点感谢缪杰和刘诗灏编辑。感谢他们在茫茫人海中发现我,让我能够有机会实现内心最深处的愿望:让Hack语言编程技术在中国范围内得到更好的传播和发展。我还想感谢中国台湾作家张德芬,正是她的身心灵三部曲,伴我走过了那段最黑暗的时光,让我能够有机会学会接受、放下,学会通过“宇宙的力量”散发“心灵的喜悦”,最后达成“心想事成”。
Hack语言和PHP的伴生与博弈不会停止,Hack语言出身于PHP,而又“高于”PHP的特征,决定了这场争斗会旷日持久。在本书中,你可能会体会到HHVM及Hack语言的使用者对PHP的一些激烈言辞。同时,如果关注“鸟哥”的新浪微博,你也可以看到他对Hack语言和HHVM的一些反击之词。孰对孰错,见仁见智。
译者简介及联系方式
李苏南(笔名苏南),毕业于华北电力大学。浪迹京城十余载,地处中关村偏北。目前在国内某知名金融投资公司做构架相关的工作。如果您对我感兴趣,欢迎通过国内第一家Hack语言中文网站(http://www.hacklang.org.cn)找到我的联系方式。
由于经验不足等原因,本书的翻译过程不可避免地出现一些纰漏。如果您有疑问,欢迎访问http://www.hacklang.org.cn以及http://www.hhvm.com.cn,参与我们的在线讨论和互动。同时,本书的相关源码及勘误表,也可以在上述网站上找到。
在本书出版时,实际的版本内容与书中相比,会不可避免地发生变化。我会在网站上及时地更新和调整。同时,本书中没有提及的“HHVM安装过程”以及“支持Hack语言的编程工具”等内容,也会在网站中进行补充。
欢迎加入我们的讨论。与大家一起传播Hack语言,让更多的人体会到“更淋漓尽致的编程体验”。

苏南
2016年12月

图书目录

序 1
前言 3
第1章 类型检查 11
1.1 为什么使用类型检查器 11
1.2 设置类型检查器 12
1.3 类型标注语法 14
1.4 Hack的类型系统 16
1.5 规则 28
1.6 类型推理 35
1.7 类型提炼 39
1.8 运行环境中的类型标注的执行 45
第2章 泛型 47
2.1 入门实例 47
2.2 其他泛型实体 49
2.3 类型消除 51
2.4 约束 53
2.5 重温未决的类型 55
2.6 泛型和亚型 56
2.7 进阶:协变和逆变 59
第3章 Hack的其他特性 64
3.1 枚举 64
3.2 类型别名 67
3.3 数组形状 71
3.4 拉姆达表达式 73
3.5 构造函数参数升级 75
3.6 属性 76
3.7 加强的自动加载 80
3.8 整数算术溢出 83
3.9 nullsafe方法调用操作 83
3.10 trait和接口的必要条件 84
3.11 隐藏类型检查器错误 86
第4章 在Hack中不支持的PHP特性 88
4.1 引用 88
4.2 旧式风格构造器 90
4.3 不区分大小写的名称查找 91
4.4 可变变量 91
4.5 动态属性 92
4.6 混合方法调用语法 92
4.7 isset、empty和unset 93
4.8 其他 94
第5章 集合 96
5.1 为什么使用集合 98
5.2 集合拥有引用语义 99
5.3 使用集合 101
5.4 集合类型标注 107
5.5 与数组互操作 116
第6章 异步 120
6.1 入门实例 121
6.2 异步细节 124
6.3 构建异步代码 134
6.4 其他类型的等待 141
6.5 常见错误 144
6.6 异步扩展 148
第7章 XHP 157
7.1 为什么使用XHP 157
7.2 如何使用XHP 161
7.3 创建你自己的XHP类 168
7.4 XHP最佳实践 178
7.5 迁移到XHP 182
7.6 XHP内部原理 185
第8章 配置和部署HHVM 188
8.1 指定配置选项 188
8.2 服务器模式 190
8.3 JIT热身 192
8.4 repo-authoritative模式 193
8.5 管理服务器 195
第9章 hphpd:交互式调试器 197
9.1 开始入门 197
9.2 代码执行 200
9.3 执行环境 201
9.4 使用断点 205
9.5 查看代码和文档 216
9.6 宏 219
9.7 配置hphpd 220
第10章 Hack工具 223
10.1 检查代码库 223
10.2 迁移PHP代码到Hack 227
10.3 编译Hack代码到PHP代码 232

教学资源推荐
作者: [美]Samuel P.Harbison Ⅲ,Guy L.Steele
作者: Mario Hewardt Daniel Pravat
参考读物推荐
作者: (美)本贾尼·斯特劳斯特鲁普 (Bjarne Stroustrup)著
作者: 陈营辉 赵海波