20

即使是大多数喜欢 C++ 的人也承认,它有很多与其作为系统/性能编程语言的利基无关的缺陷。其中包括其过时的模块管理系统(头文件)、对前向声明的要求、使其语法无法确定的语法怪癖(例如用于模板声明的 <> 尖括号)、包含在文本级别而不是真实语言操作的宏用于解决宏所用事物的功能,重复功能,如数组和字符串(这些类型的 STL 和 C 版本),几乎没有语法糖,以及普遍缺乏现代功能,如线程、垃圾收集、委托/闭包,等(注意:是的,在内存非常有限或实时环境中,您可能有充分的理由不想要垃圾收集,

另一方面,C++ 是唯一一种可以让您高效编写代码并接近金属,而且至少提供一些高级抽象的主流语言。它成熟、标准化,拥有大量编译器实现和库以及大型遗留代码库。

对于那些使用 C++ 作为主要语言的人来说,是什么让你个人认为它的缺点是值得忍受的?怎样才能让你改变主意并决定使用一种新的语言,这种语言的缺陷更少?你使用 C++ 是因为你真的喜欢它,还是因为遗留问题而不情愿地使用它,或者因为它的利基市场没有其他成熟的主流语言存在?

4

23 回答 23

30

你的部分问题有一个错误的假设。你假设我们可以选择语言。在我从事的所有使用 C++ 的项目中,没有真正的选择。这些项目早在我加入公司之前就已经存在并且是用 C++ 编写的。它们背后有多年的历史和相应数量的代码。

我认为这是人们在说“C++ 将死”或“为什么人们仍然使用 C++?”时犯的最大错误。我绝对同意,除了系统级程序之外,您不会看到很多/任何以 C++ 开始的新项目。恕我直言,这没有多大意义。不一定是因为语言的固有缺陷,而是越来越难找到擅长编写 C++ 的人。

人们经常忘记考虑的是当今世界运行的数百万(数十亿?)行 C++。切换到另一种语言的成本非常高,不能一时兴起。花费时间和精力来重写这种规模的应用程序需要很大的理由。这就是 C++ 不会消亡的原因。至少很快。

于 2009-03-08T21:50:28.243 回答
27

给我一种编程语言:

  1. 是标准化的,不是由单一公司驱动的
  2. 不绑定到一个平台(不仅在理论上)
  3. 编译为本机代码
  4. 给了我和 C++ 一样的效率
  5. 提供了一个经过深思熟虑的标准库
  6. 对各种重要平台至少有一个成熟的实现

...我可能会考虑切换 ;-)

于 2009-03-08T22:14:08.280 回答
18

我使用 C++(并且已经使用了将近 25 年),因为它是最好的系统编程语言。我想说我不认识你描述的任何所谓的“疣”——那些是特征!

对于非系统编程,我使用其他语言,例如 PHP、Delphi、bash 脚本、awk、perl 和 Smalltalk。一种尺寸并不适合所有人,除非您当然是某种语言偏执狂。

于 2009-03-08T21:51:53.763 回答
14

其中包括其过时的模块管理系统(头文件)

我真的看不出 C++ 使用头文件的方式有任何问题。通过提供两种包含标头的方法,您可以在源代码级别指定符号应该来自您的应用程序还是来自系统安装的设施。所有现代 C++ 编译器都支持预编译头文件,因此没有性能损失。将标头与实现分开允许开发人员使用以其他语言编写的库。

使其语法无法确定的语法怪癖(例如用于模板声明的 <> 尖括号),几乎没有语法糖,

该语言非常庞大,可能难以完全遵循,但它仍然受到许多适用于任何地方的逻辑规则的指导。该语言实际上提供了许多方法来自定义您的使用,通过函数和运算符重载以及模板可以简明扼要地表达您的问题

包含在文本级别而不是真实语言功能上运行的宏来解决宏的用途,

预处理器有很多不喜欢的地方,但从代码生成的角度来看,对令牌进行操作可能非常有用。诚然,像 M4 宏这样的东西提供了一种更强大的方法来执行此操作,但缺点是它不是该语言的标准部分。标准的 c/c++ 预处理器在编译器所在的任何地方都可用。

重复功能,如数组和字符串(这些类型的 STL 和 C 版本)

此功能不是重复的。实现高阶概念(如通用容器)需要低级别的逐字节原语(不包括指针算术)。请记住,C++ 是用于对其实施的系统进行编程,但也用于提供执行实际工作的表达能力。

并且普遍缺乏现代功能,例如线程、垃圾收集、委托/闭包等(注意:是的,在内存非常有限或实时的环境中,您可能有充分的理由不想要垃圾收集,但很容易选择-out 并成为管理内存的默认方式。)

线程是一种需要操作系统以某种编程语言无法真正标准化的方式进行合作的东西。许多语言将其抽象为单个接口,但这在 c++ 中并没有发生(这显然即将到来)。垃圾收集器可用于 C++,但它提供了一个更强大的概念,RAII。无论如何,选择退出不是 C++ 方式,如果垃圾收集工具曾经标准化为该语言,那么它肯定是一个选择加入,因此如果你不使用它就不必为此付费.

于 2009-03-08T22:39:37.940 回答
13

是的,比起Java,我更喜欢C++——因为我可以更自由地表达自己。

C++ 是必要的,因为它是目前唯一真正可扩展的语言。有一种方法可以调整程序的各个方面,因此它永远不会失去动力。

另一个好处是库代码中的详细程度,而不是“使用”代码。一旦库正常工作,使用代码通常会很好而且简洁(如果您使用正确的库,则易于阅读)。

在 Java/C# 中,所有的冗长都被带到了使用代码中——try/catch/finally ...所有这些东西都需要一遍又一遍地输入。咳咳……!

我是否提到了基于堆栈的对象?没有他们,人们如何生活......??

C ++真正失败的唯一地方是反射(尽管即使这样也可以完成,例如COM)。

是的,具有更严格语法的清理 C++ 会很好,但我们知道它永远不会发生。您可以习惯语法,总体而言,为您获得的回报付出很小的代价。

于 2009-03-08T22:04:51.533 回答
10

它作为系统/性能编程语言的利基

这是一个相当大的利基市场!如果一个软件有超过 1000 万用户,那么它很有可能是用 C++ 编写的:

  • 视窗
  • IE
  • 照相馆
  • 火狐
  • 办公室
  • SQL 服务器
  • MySQL
  • 谷歌搜索引擎
  • 欧特克

来源:http ://www.research.att.com/~bs/applications.html

于 2009-03-08T22:41:19.417 回答
6

对我来说,我更喜欢 C++,因为:

  • 它仍然是硬件将要做什么的相当直接的表示,或者足够接近,您可以对实际程序行为和性能做出有根据的推断
  • 它足够灵活,可以让我使用或实现大多数编程范例
  • 与其他库和模块的兼容性高,现有最大的参考和直接可用代码支持库
  • 大多数“缺陷”很容易通过良好的编程实践和/或实用程序库来消除,这与“缺陷”不太可修复的其他语言相反(例如:您可以通过使用智能指针轻松修复内存泄漏,并轻松诊断内存直接内存分析损坏,您不能轻松地用 C# 等高级语言调试内存损坏问题,是的,我已经遇到过)
  • C++ 应用程序通常可以在任何操作系统版本上运行,唯一的限制是努力;高级语言通常需要可能存在或不存在的运行时

我需要什么其他东西来进行主要开发?好吧,除了以某种方式解决上述原因之外,其他“高级”语言必须传达一种感觉,即我仍然能够实现和调试我可以在 C++ 中做的所有事情。真正对我来说唯一接近的是 C++/CLI,但它在语法上更糟糕,更难理解,并且未能通过“运行时要求”测试(并且可以说在其他期望的好处方面并没有增加太多)。

我猜在我退休前的 30 多年里,我会因为写 C++ 以外的东西而获得报酬。当然,在某些开发领域 C++ 并不可取,并且语言供应商有强烈的动机强迫开发人员使用在专有和/或供应商控制的运行时(例如:Java、C# 等)上运行的高级语言。不过,就目前而言,对我来说,C++ 仍然是完成这项工作的合适工具,而且我喜欢通过继续编写它来获得报酬。:)

于 2009-03-09T03:05:28.113 回答
5

C++0x

于 2009-03-08T22:26:09.313 回答
4

我的观点是人们需要更高级别的语言,以某种方式提供与 C++ 相同的功能。用高级语言(比如说 Java)做一些事情,同时以更快的速度、本机二进制编译和其他特性执行,而不诉诸 JNI 之类的东西,将是“我需要摆脱 C++ 的东西”。

于 2009-03-08T21:46:11.920 回答
4

当他们提出一种在更少内存中运行得更快并且得到更广泛支持的语言时。

于 2009-03-08T23:59:40.790 回答
3

坦率地说,它运作良好,我付钱来写它。它与控制它的单一供应商的营销奇思妙想无关。市场上的 C++ 专家越来越少,所以我的价值随着时间的推移而增加。我将继续使用它,直到市场变得不可持续。

于 2009-03-08T22:07:07.987 回答
3

正如您所描述的,C++ 肯定有它的缺点,这个C++ FQA在指出其中许多方面做得很好。然而,已经使用一种语言很长一段时间的人和组织已经包含了大量的习语、陷阱指导方针,这使得使用它更容易忍受。多年来,C++ 编程风格也在不断发展。凭借原生编译和成熟的工具集,在许多平台上,C++ 仍然是一个强有力的竞争者。

在我看来,让 C++ 迅速失去其地位的唯一方法是让 IBM 或 Google 等大公司支持可行的替代方案,如D 语言,并全力推动它。但是,考虑到他们自己的代码库中已经存在的大量 C++,这实际上是不可能发生的。

于 2009-03-08T22:29:52.270 回答
3

要理解 C++ 为何如此,并欣赏它的成就,最好的方法是阅读“C++ 的设计和演变”。

尽管有缺点,但 C++ 是一门相当不错的语言。

于 2009-03-08T22:50:00.053 回答
3

我主要将 C++ 用于通常需要与硬件进行大量密切交互的嵌入式平台。我真的没有在这里看到任何 OO 替代品。如果我在这里用 C++ 代替任何东西,那将是可以在编译时解决所有包含特权的东西,所以我不必担心这些。基本上,这可以简化我的开发,但没有提供任何运行时开销(反射、垃圾收集等)。

对我来说,C++ 就是关于运行时性能和绝对控制。没有花哨的运行时东西可以“在幕后”工作。

于 2009-03-08T22:50:30.770 回答
3

我做科学计算,我的 GUI 是 C#,我的后端是 C++。C# 在性能方面至少可以与 C++ 相提并论,但这并不是 C#/insert 托管语言的重点所在。这将是困难的,但在数值计算方面让 C# 与 C++(或非常接近)一样好(或非常接近)的可能性范围之内,因为 IL 被编译为机器代码。如果/当这种情况发生时,我很乐意做出改变。

于 2009-03-08T23:41:08.493 回答
2

当一种新语言能够像 C++ 一样富有表现力时。由于高级和低级能力之间的利益冲突,这很难实现。这就是我们首先拥有语言和流程互操作性的原因。

此外,C 语言可能更难处理,因为它非常精简和强大。正因为如此,C在低级别赛场上获胜。C 为 C++ 和客观 C 创造了良好的支持。

简而言之,您仍然会看到 C 和 C++ 很长一段时间。

于 2009-03-08T22:10:19.117 回答
2

我个人选择使用 C++(当我什至可以选择时)是因为它是唯一一种不被解释的多用途编程语言,并且有足够的“花里胡哨”让我可以相对快速地完成工作。现在有很多理由让我在机会出现时选择其他语言(例如 Python、Java、Perl、ksh 等)。我将其他语言用于“一次性”应用程序和脚本,其中性能不是问题,“现场可部署性”也不是问题。许多脚本语言的部署支持都非常以 Web 为中心,我现在更多地从事基础设施和“隐形胶水”行业。我们正在寻找 J2EE 应用程序服务器来帮助解决部署和支持问题,但我们已经有了一些用于可执行服务的好方法。

在许多情况下,我将继续选择使用 C++ 的最大原因是,在您添加一些选择的库来处理非编程语言平台的东西(线程、套接字等)之后,它几乎支持我需要的一切。而且......的......我确实认为线程应该在编程语言之外表示。这就是我倾向于远离其他语言的主要原因——我实际上喜欢具有基本核心的语言,其中功能是通过附加库提供的。

让编程语言担心语法、继承、多态性、模块结构、异常处理、循环结构等。一旦您进入应用程序域并想要多线程您的应用程序或者可能使用多个进程,那么您正在谈论库。太多的语言试图强制使用不适用于所有问题的特定编程范式 (OOP)。我更喜欢一种不错的通用编程语言。

最后一个原因是我选择 C++ 而不是其他语言是因为我实际上认为它比其他语言更具确定性。我知道 Java 是首选的平台中立解决方案,而 Ruby 和 Python 是du'jour的快速开发替代方案。问题是被解释的应用程序总是在解释器的时候执行。这并不总是一件坏事,当然也不总是一件好事。

C++ 很可能会在这里存在一段时间。我的猜测是,大量更纯粹的 OOP 语言将开始失去市场份额给更通用的动态语言(可能是 Ruby 和 Python),并且这些语言也会获得一些更严重的 OO 印章。当太阳开始真正落在 C++ 上并且有另一种语言被“行业”广泛接受时,我将切换到另一种语言。我确信它会在某一天发生……毕竟 C++ 实际上在几年前取代了 C 作为我选择的语言。

于 2009-03-09T04:28:05.030 回答
2

C++ 是我工具箱中的一个工具。java和python以及其他一些东西也是如此。

方便我公司的环境使我能够使用任何合适的东西。

  • 必要时 C++ == perf。
  • Java == 当 perf 不是那么必要时(由于网络/外部 IO 大大超过 CPU 周期的事实),并且开发速度是必要的。

工具箱中的工具。使用合适的。

于 2009-03-09T06:24:42.533 回答
1

为什么?如果我开始用不同的语言编写代码,你会获利吗?:-P

开个玩笑,我编写 C++ 代码是因为这就是我的雇主付钱给我的原因。真的就是这么简单。如果他们决定使用不同的语言,我会开始使用它。现在,至于他们为什么选择使用它,我只能推测。我的猜测是他们有两个主要原因:

  1. 有足够多的大学毕业生精通C++,可以实现他们的商业目标。
  2. C++在实时分布式系统中提供了足够好的性能。
于 2009-03-08T21:55:40.680 回答
1

不幸的是,您还没有发现该语言的基本优雅和概念完整性。它提供了与任何其他语言一样舒适和一致的世界观,这反映在它多年来的持续使用中。YMMV,但请允许我们所有人都考虑一下。

于 2009-03-08T22:00:31.420 回答
1

你正在以相反的方式解决这个问题。人们选择他们感兴趣的问题/应用领域。语言的选择遵循该决定,并且非常简单。

没有人会选择编程语言。编程语言本身很无聊,并且在不参考问题/应用程序域的情况下谈论它们是荒谬的。

就个人而言,我想从事机器学习工作。作为研究生。学生我致力于分析大型数据集(IMDB、Netflix)的图形表示。我的大部分工作都使用 C++。我本来希望使用 C# 或 Java 或更好的 Python 工作,但问题的性质要求我使用 C++。在 5 年的时间里,我爱上了 C++,因为它在效率和抽象之间实现了黄金平衡。每当我看到需要它时,我都会使用 C++。C++ 程序员是顽固的实用主义者,他们不会让任何事情妨碍完成工作。他们不会仅仅为了它而坚持使用 C++。

于 2009-03-09T03:12:12.463 回答
0

我认为现在不需要(通常也不应该)用同一种语言编写项目的高级和低级部分是公认的。因此,您要么等待雇主意识到即使很难找到使用多种语言工作的开发人员,但实际上找到优秀的开发人员更容易,或者等待无能的大军使用多语种程序。

于 2009-03-09T05:36:42.180 回答
0

查看您使用 C++ 列出的“问题”列表,我可能会接近同意的唯一一个问题是 STL/C 字符串转换。

我可能会问,你为什么希望 C++ 成为 C#?

于 2009-03-09T06:34:18.203 回答