In Defense of C++
C++的声誉
C ++经常因其复杂性,陡峭的学习曲线而受到批评,最重要的是它允许使用它的开发人员不仅能够射击自己,而且在这个过程中吹掉他们的整条腿。但这些批评是否受到审查?
好,在这篇博文中,我的目标是解决一些最常见的C ++批评,并提供一个平衡的观点,看看它的优点和缺点。
C++是“复杂”
C++ 确实是一种复杂的语言,具有广泛的特性和功能。对于您希望在C ++中实现的任何一件事,都有十几种不同的方法,每种方法都有自己的权衡和影响。那么,作为开发人员,您如何知道哪种方法最适合您的特定用例?当然,你必须对语言有深刻的理解才能做出这些决定,对吗?
不是真的......我的意思是,不要误会我的意思,这有帮助,但这不是一个硬性要求。过早的优化是所有邪恶的根源,在C ++中,你可以编写完美的代码,而不必担心语言的更复杂的功能。您可以在C ++中编写简单,可读和可维护的代码,而无需使用模板,操作员过载或该语言的任何其他更高级功能。
有这个想法,对于任何编程语言中想要做的所有事情,你需要使用最有效和最正确的方法。Python有这个与他们的pythonic做事方式,Java有这个,C#有这个,Go有这个。真见鬼,即使是像在浏览器上画HTML这样简单的事情,也需要每隔几年重新发明一次,并争论恶心。事情是这样的,虽然,在大多数情况下,没有一个正确的方法来做某事。神圣的“最佳方法”通常只是个人或团队偏好的问题。这个想法是,如果你只是以“最好”和正确的方式编写代码,你永远不需要担心维护它是错误的。
不要太担心使用“最佳”方法; 更担心编写易于阅读和理解的代码。如果你这样做,你会没事的。
C++是“过时的”
C++非常古老,事实上,它于1985年问世,从视野中看,那比Windows的第一个版本发布早了4年,在Linux的第一个版本问世前6年,或者把这一点进一步带回家,回到最后一台8位计算机发布的时候。所以,是的,C ++在任何标准下都是相当古老的。但这是否使其过时?
地狱,不,它不像C ++从1985年发布以来一直保持不变。C ++已经积极开发和改进了40多年,并始终增加了新功能和功能。C++标准的最新版本C++20于2020年发布,并引入了许多新功能和改进。C ++ 23也即将出现,预计将为语言带来更多改进。
这些改进中的关键是模块、概念、范围和协程。这些功能为C ++带来了现代编程范式,使其比以往任何时候都更强大,更具表现力。
但是戴夫,我们所说的过时是指其他语言已经超过了C ++,并提供了更好的开发人员体验。
就个人品味而言,我想,C ++仍然是使用最广泛的编程语言之一,拥有庞大的库和工具生态系统。它用于广泛的应用,从游戏开发到高性能计算到嵌入式系统。世界上许多最流行和广泛使用的软件应用程序都是用C ++编写的。
我不认为C ++被任何想象力所超越;你必须改变过时的定义,才能提出这个要求。
C++是“不安全”
啊,最后,我们进入了大语言,是的,我将与Rust进行比较,因为它是“内存安全”语言,很多人声称会或应该取代C ++。
事实上,让我们现在就把主要观点从中解脱出来。
将 C++ 代码库重写为 Rust 总是产生比以前更多的内存安全结果。
无数公司引用了他们如何通过简单地在Rust中重写其C ++代码库来提高其安全性或报告的错误或内存泄漏量。
是因为Rust吗?我会在一些小部分争论,是的。然而,我认为最大的因素是,任何对现有代码库的重写都会产生比原始代码库更好的结果。
当您重写代码库时,您有机会重新思考和重新设计架构,修复错误并提高代码的整体质量。您可以利用从先前实现中吸取的所有经验教训,所有发现和修复的问题,并且您已经知道了。所有头痛,这将是太多的痛苦,在现有的代码库,你可以修复他们在新的。
想象一下,如果你愿意,你已经建立了一个棚子,它有点摇摆不定,当你第一次建造它时,你并没有真正理解适当的木工,所以它还有其他一些问题,如结构完整性和漏水的屋顶。几年后,你建立了一个新的,这次你知道了你第一次犯的所有错误,所以你把它构建得更好,更强,更耐候。在这个过程中,你决定更换你以前使用的材料,例如,而不是使用枫树,你选择橡木。说新棚子更好只是因为你用橡木而不是枫树是正确的吗?还是说,这只占整体改善的一小部分?
当我看到这些公司声称在Rust中重写他们的C ++代码库使他们的内存更安全时,我就是这样感觉的。不是因为 Rust,而是因为他们花时间重新思考和重新设计他们的代码库,并实现了从之前实现中吸取的所有经验教训。
但这并不否认C ++不安全的事实。
是的,C ++可能不安全,如果你不知道你在做什么。但事情是这样的:如果你不知道你在做什么,所有编程语言都是不安全的。你可以在Rust中编写不安全的代码,可以用Python编写不安全的代码,可以用JavaScript编写不安全的代码。
内存安全只是编程语言安全的一个方面;你仍然可以用内存安全的编程语言编写不安全的代码。仅仅使用Rust不会神奇地使您的应用程序安全;它只会使内存泄漏或安全问题变得更加困难。
在这种情况下,术语“不安全”有点模糊,我认为它被用作一个包罗万象的术语,对我来说,这是营销的流行。
C++能更安全吗?
是的,C ++可以更安全;事实上,它甚至可以使内存安全。有许多可用的库和工具可以帮助使C ++代码更安全,例如智能指针,静态分析工具和内存消毒器。真见鬼,如果你愿意,你甚至可以添加一个垃圾收集器到C ++,如果你真的想(请不要)。
但是,使C ++更安全的最简单和最直接的方法是简单地了解智能指针,并在必要时使用它们。智能指针是管理C ++中内存的一种方式,而无需手动分配和分配内存。它们会自动为您处理内存管理,这使得内存泄漏或悬空指针变得更加困难。这是C++的主要批评。
C++ 很难阅读
那就不要这样写。C++是一种多范式编程语言;你可以编写过程代码、面向对象代码、函数式代码或三者的混合。如果你愿意,你可以用C ++编写简单易读的代码。如果你愿意,你也可以在C ++中编写复杂且不可读的代码。这都是关于个人或团队的偏好。
这里有一个经验法则,我喜欢遵循C ++:让它看起来尽可能像C,并避免使用太多的高级语言功能,除非你真的需要。使用智能指针,避免使用原始指针,并尽可能使用标准库。
你可以通过像使用C ++一样使用C ++来完成大量的编程,并且只有在你真正需要的时候才引入复杂性。
但这不能打败C++的全部目的吗?为什么不直接使用C呢?
C++ 是 C 的超集,你可以用 C++ 编写 C 代码,而且效果很好。C++为C增加了很多特性和功能。如果你从C开始,那么你被锁定了C,这在很多情况下都很好,不要误会我的意思,但是C ++让你可以选择在需要的时候使用更高级的语言功能。您可以从 C 开始,然后根据需要逐渐引入 C++ 功能。你不必使用C ++的所有功能,如果你不想。
再一次,回到我的棚子类比,如果你用木头建造一个棚子,如果需要的话,你以后总能加一个金属屋顶。你不必建造整个棚子的金属,如果你不想。
C++ 有一个令人困惑的生态系统
C ++在40年左右的时间里建立了一个庞大的生态系统,有很多不同的库和工具。这可能使得很难知道哪些库和工具用于特定任务。但这并不是C++独有的;每种编程语言都有这个问题。
再次,简单的经验法则是尽可能使用标准库;它维护得很好,有很多有用的功能。对于其他任务,如网络或GUI开发,有许多众所周知的库被广泛使用和维护。做一些研究,找出哪些库最适合你的特定用例。
避免像瘟疫一样的刺激。 Boost是大量图书馆的集合,在C ++社区中广泛使用。然而,许多图书馆已经过时,不再维护。它们也往往相当复杂且难以使用。如果你能避免使用助推器,这样做。
除非您正在编写一个需要Boost提供的特定功能的大型且复杂的应用程序,否则您最好使用其他更现代且更易于使用的库。请勿将性能开销和二进制大小膨胀添加到您的应用程序,除非您真的需要。
C++ 不是初学者的好选择
编程不是初学者的好选择,木工不是初学者的好选择,汽车机械不是初学者的好选择。编程很难;学习需要时间和精力,就像所有事情一样。没有一般的语言对初学者来说真的很好; 一切都有其权衡。
事实是,如果你想进入系统编程或游戏开发,那么从Python或JavaScript开始对你没有太大帮助。你最终需要学习C或C++。
如果你的目标是成为一名Web开发人员或数据科学家,那么从Python或JavaScript开始。
如果你只想在编程行业找到一份工作,我不知道,学习Java或C#,这两种语言都得到了很多不应有的仇恨,但提供了很多工作机会。
看,事情是这样的:如果你刚开始编程,是的,无论你选择什么语言,都会很难。我实际上认为,从C或C ++开始比从模糊编程的许多基本概念开始要好得多,我进一步争辩说,从Python或JavaScript开始,从长远来看,你对自己有害,当你对一个主题的理解仍然新鲜并且可塑性时,你会权衡学习某件事的痛苦。
但是,嘿,这只是我的观点。
C++ vs Rust: 朋友还是竞争对手?
Rust近年来赢得了很多爱,而且有充分的理由。它认真对待内存安全,其借阅检查器执行C ++经常留给程序员的纪律。也就是说,Rust仍在构建其生态系统,学习曲线可以以不同的方式感觉同样陡峭。C ++可能不会阻止你拍摄自己的脚,但它为您提供了数十年的战斗测试工具,编译器和库,为从Chrome到虚幻引擎的所有内容提供支持。在实践中,许多团队一起使用Rust和C ++,而不是将它们视为敌人。Rust在安全是优先事项的新项目中大放异彩,而C ++继续主导传统系统和性能关键域。
C++在2025年还在使用吗?
简短的回答:绝对。尽管不断喋喋不休地说它已经过时了,但C ++仍然是世界上使用最广泛的语言之一。Chrome和Firefox等主要浏览器仍然写在其中。像虚幻这样的游戏引擎在它上运行。汽车系统、金融交易平台,甚至人工智能框架都严重依赖C++进行性能和控制。新标准(C ++ 20,C ++ 23)使语言不断现代化,确保它与年轻替代品保持竞争力。如果你剥去我们每天依赖的大多数大型系统的层,你几乎总是会发现C ++在引擎盖下嗡嗡作响。
结论
C++是一种强大而多才多艺的编程语言,经受住了时间的考验。虽然它确实有其复杂性和挑战,但它仍然是当今技术环境中相关且广泛使用的语言。
通过正确的方法和心态,C ++可以成为一种乐趣,并且可以产生高性能和高效的应用程序。所以下次你听到有人批评C ++时,花点时间考虑这种古老语言的优势和能力,然后再直接忽略它。