现代C++学习笔记(1):工具资源篇
Image (题图来自网络并做适当修改)
所谓“工欲善其事,必先利其器”。计算机语言学习,是非常依赖实践的。所以,在正式开始《Effective Modern C++》阅读之旅前,先准备下C++编译环境,是非常有必要的。同时,我也打算借这篇文章,给大家分享一些重要且常用的C++相关资源。
1
首先说编译器,这是重点的重点。“编译”是将人工可以阅读的计算机语言的代码,转换成相应功能的二进制机器指令的过程。所以说,编译器首先应该能够准确识别计算机语言的语法,然后再能将其准确翻译成为计算机能够“理解”(其实是按照预期正确运行)的指令。这样我们才能围绕这门语言,开展实际的编程工作,并解决我们想解决的问题。
如之前的开篇文《现代C++学习笔记(0):开篇》提到的,C++最近十年经历了相当快速的发展,每三年就会推出一个新版本的标准。而这些标准都需要有编译器进行实现,我们才能真正使用起来。而编译器的开发,本身就是非常复杂的,而要快速跟进并支持这些新标准,可以说是一件非常有挑战性的事情。正因为如此,能够满足我们需求的工具,其实主要也就有限的那么几个:gcc、clang 和 MSVC。
2
下面就分别介绍下这三个编译器。
gcc,这是GNU Compiler Collection的缩写。其实它包含了多种不同语言的支持,C、C++、Objective-C,Fortran,Ada,Go以及D,包括这些语言的编译器本身,也包含相应的运行时库(runtime library)。其中对C++语言的编译器(或其命令名),叫做g++。这是最值得推荐的,因为它的更新速度应该是最快的,很多还在形成标准的特性,都可能已经实现在其中。详细可以参见链接:https://gcc.gnu.org/projects/cxx-status.html
clang,这是Mac系统上Xcode所标配的重要C/C++编译器。在Mac上进行开发,首选自然就是安装Xcode。早年的Xcode应该也缺省使用gcc,后来转到llvm与clang的技术线来。安装完成后,打开终端(Terminal或iTerm2),就可以直接使用相应的编译器工具命令。相对于gcc那么“包罗万象”,clang的历史包袱没那么大,因此在语言解析方面更清晰也更有优势。这也是很多对编译原理感兴趣的人,更钟爱clang的原因。
MSVC,这是由微软开发的C++编译工具包,缩写自Microsoft Visual C++。MSVC的推广,得益于其Windows操作系统的市场垄断地位。微软的历史悠久,仔细研究过Windows API和MFC(Microsoft Foundation Class) Library设计的人,就会发现很多C++的理念和标准,与微软操作系统发展,有很大渊源。MSVC曾经制定的一些非标准扩展,后来都逐步进到了C++语言标准。对此有兴趣的,不妨读读侯捷老师的经典图书《深入浅出MFC》,这是用从头实现一个简版MFC的方法,来窥探巨无霸Windows及其程序设计原理的有趣实践。
以上几个工具,都可以设法在本地安装和使用。对于使用Windows系统的人,如果想使用gcc,推荐选择WSL(Windows Subsystem for Linux)的方案,此处可参见我昨天写的图文教程《如何在Windows环境中使用Linux?》。
不过如果只是做简单的语言学习(而不是为了真正开发一些中型或大型软件项目),其实还有更方便的选择,就是一些在线编译网站。比如:
OnlineGDB:https://www.onlinegdb.com/
Programiz:https://www.programiz.com/cpp-programming/online-compiler/
CODEChef:https://www.codechef.com/
IDEone:https://www.ideone.com/
在这些网站上面,可以很方便地进行调试,并随时进行不同版本编译器(包括不同标准)的切换和对比。
3
接下来,介绍一些C++语言参考网站。
关于语言标准,最官方的网站,自然是ISO C++标准委员会:https://isocpp.org/。对C++最新前沿发展感兴趣的,不妨在这个网站上多浏览研究。
然而,对语法特性更系统性的参考网站,当属CppReference:https://en.cppreference.com/。日常遇到某个函数不清楚其语法和功能时,在这个网站上查询,基本都可以得到满意的答案,而且它会清晰地标示出哪些用法来自什么版本的标准,或是在哪个标准时开始被宣布废弃。
关于语法参考,微软的MSDN自然是另一个重磅支持,同样值得强烈推荐:https://docs.microsoft.com/en-us/cpp/cpp/cpp-language-reference。如前所述,微软在C++语言方面的贡献,也决定了它所整理形成的知识库,深度和准确度都是顶级的。
在C++的世界中,官方标准支持库是STL(Standard Template Library),而另一个虽然非官方、但却是事实标准的,则是Boost库:https://www.boost.org/。这个库充满很多神奇的“看似不可能”的实现,而这些实现经常会在未来成为新一代的语言标准。C++技术栈的人总喜欢发明轮子,因为绝大多数人都互相鄙视,总会觉得用别人的库,不如自己重新实现的好。而STL和Boost具有超越这种鄙视网的强大影响力,使得最优秀的人们都在往这个“超库”(它其实是很多很多库组成的)中贡献最智慧的代码。
4
此外,再分享几个不错的链接资源:
C++ Conference:https://cppcon.org/
Bjarne Stroustrup’s homepage:https://www.stroustrup.com/
Fluent C++:https://www.fluentcpp.com/
C++ Tips of the Week:https://abseil.io/tips/
C++ Stories:https://www.cppstories.com/
最后,再推荐一些C++经典书籍:
《C++ Primer》、《C++ Primer Plus》 《Effective C++》、《More Effective C++》、《Effective Modern C++》 《Exceptional C++》 《Essential C++》 《Imperfect C++》
《C++ Templates》
《深度探索C++对象模型》
话不多说,这篇就这样。
下一篇开始,我们进入现代C++编程的正题。
注:本文首发表于“不靠谱颜论”公众号,并同步至本站。