21

自从他们推出 1998 年 ANSI/ISO C++ 以来,我一直试图跟上 C++ 的步伐。我吸收了新概念并试图理解它们。我学习了异常处理、模板和命名空间。我已经阅读了新的演员机制并使用了 STL 库。

所有这些概念都需要大量的精力。但是现在看到新的C++0x标准时,我有点担心 C++ 的未来。

事情变得越来越复杂。这种语言正在变成怪物。

我不确定我是否想再跟上这门语言的步伐,因为无论如何我都不会在 C++ 中进行日常黑客攻击。我主要使用解释或字节码语言。

那么我为什么要费心去学习这种困难但又异常强大的语言呢?我可以用 Python 等完成 95% 的业务。剩下的 5%,我可以毫不费力地处理普通的旧 C++ 或 C。

你怎么看?

4

11 回答 11

22

每个人都使用 C++ 的一个子集。对于 C++ 中的几乎所有应用程序编程,无论是服务器端还是客户端,该子集都是可管理的。在我看来,唯一需要完全掌握语言每一个细微差别的人是库作者——实现 Boost、STL、Loki 等的人。

但我绝对会使用适合任务的语言。如果 Python 在您的工作中比 C++ 更具可读性和可维护性,并且您不需要 C++ 提供的功能,那么一定要坚持使用 Python。

于 2009-04-19T12:14:04.983 回答
21

听听 Bruce Eckel { 两本所谓的最佳C++ 书籍的作者}几周前对 C++ 的评论:

也就是说,我几乎不再使用 C++。当我这样做时,要么检查遗留代码,要么编写性能关键部分,通常尽可能小以从其他代码调用(我的首选方法是用 Python 快速编写应用程序,然后对其进行分析,并在必要时提高性能通过使用 Python 的 ctypes 库调用 C++ 的一小部分)。

因为我是 C++ 标准委员会的成员,所以我看到了做出这些决定。它们都经过了极其仔细的考虑,远远超过了 Java 中做出的许多决定。

然而,正如人们正确指出的那样,由此产生的语言使用起来既复杂又痛苦,并且充满了奇怪的规则,一旦我离开它一段时间,我就会忘记这些规则——我从第一原理中找出了这些规则当我写书时,不仅仅是通过记忆它们。

此外,您应该阅读此线程Danny Kalev 对 C++ 的预测

然而,C++ 日益增长的复杂性将产生将语言拆分为准官方方言的压力。我们今天已经可以看到这种趋势;未来可能会加剧。

编辑

你也应该看看这个讨论:

C++ - 有没有人觉得 C++ 太复杂了?

于 2009-04-19T13:15:18.160 回答
10

首先,C++0x 的许多特性是为了让语言更易于使用。更易读的模板编译错误,更一致的初始化语法,对线程的支持,否则必须依赖于特定平台的库等等。

因此,如果您确实使用 C++,我觉得学习 C++0x 的重要部分应该是一项易于管理的任务。请记住,您无需学习所有新功能即可使用该语言。一些特性主要是作为对库实现者的帮助而添加的,例如允许更有效地实现 STL,但这不应该真正影响最终用户对该语言的使用。有些仅在极少数情况下才真正需要。忽略语言的那些部分。

他们对 C++0x 的既定目标之一是避免它变得更难使用。

但除此之外,还需要 C++ 吗?如果您使用其他语言进行编码,为什么还要跟上 C++ 的步伐?

于 2009-04-19T12:27:12.160 回答
8

您不必使用语言提供的所有功能。我不在 C 中使用 setjmp/longjmp,尽管它在那里。我也没有使用 Java 集合的各个方面。

如果您认为新功能将使您的代码交付更好(更快或更高质量或两者兼而有之),请使用它们。否则忽略它们。

如果只是为了让你通过工作面试,从高层次上了解它们都是有用的,但在我看来,它们添加到语言中的一半是不必要的。

在切换到 Java 之前,我什至从未使用过 C++ 模板,但我知道它们的用途。

这并不总是关于学习最新和最伟大的。软件(至少在你的工作中)是关于产品的交付。如果你足够精通的话,这可以在 COBOL 或 FORTRAN 中完成。

于 2009-04-19T12:13:46.357 回答
5

除了 Bjarne 和 Herb Sutter 之外,没有人知道所有的 C++。正如你所说,这是一种非常庞大的语言。期望能够采用整个标准+特定编译器的特定实现细节是不现实的。

但是你不需要知道一切才能使用 C++。相反,只学习对您和您的项目有价值的 C++ 子集。不断扩展您的知识并没有什么坏处,但除非您正在编写 C++ 编译器,否则没有理由了解全部内容。即使你完成了它,与你一起工作的所有人都不会。

于 2009-04-19T15:00:41.277 回答
5

那么我为什么要费心去学习这种困难但又异常强大的语言呢?我可以用 python 等完成 95% 的业务。剩下的 5%,我可以毫不费力地处理普通的旧 C++ 或 C。

好吧,在大多数情况下,您会回答自己的问题。此时,您无需紧跟 C++ 的前沿。

然而,语言将继续前进。几年后,您认为今天最前沿浪费时间的一些概念将被普遍使用。有一天,您可能会发现在您使用“普通 C++”的 5% 期间,某些示例代码或您正在协作的代码使用了您不熟悉的构造。那时,您需要上网并复习新的“当前”C++。

这会是个问题吗?当然不是。你是程序员。您在 95% 的语言环境中了解最新的编程概念,这也会随着时间而变化。您可能已经非常熟悉这些概念,并且只需要在必须使用它们的时候熟悉它的 C++ 语法。

就我个人而言,我希望继续跟上 C++ 的步伐,即使我的职业生涯更多地转向 Java 或另一种下一代语言。为什么?我想说是因为它最让我感兴趣,因为我喜欢它的复杂性和表现力。不过,更有可能只是因为它是我的第一门专业语言。我认为这是我的“母语”。

如果您不感兴趣,并且与您的工作或未来工作无关,请不要打扰。那有什么问题?没有。

于 2009-04-19T17:48:55.303 回答
3

很好的答案。

计算机制造商争夺买家,软件争夺您的磁盘空间,语言争夺用户。他们通过试图抓住彼此的特征来做到这一点。

我想知道多久我们才能看到 Fortran 推出 lambda 表达式 :-)

于 2009-04-19T12:24:48.330 回答
3

我很难找到一个 C++0x 比 C++98 更复杂的实例。有两件事确实很复杂:

  1. 概念。
  2. 记忆模型

但是第一个已被再次删除(谢天谢地;标准化未实现的功能从未在 C++ 中实现过,见证抛出规范、外部模板、auto_ptr ......),第二个并不是现代编程语言可以逃脱的东西. 它是由 Intel & Co 外部诱导的,有助于破坏您的程序以使其运行得更快。

其余的只是解决每个 C++ 程序员在过去几十年中经常遇到的烦恼。

作为旁注:我觉得它......很有趣......看看像 C# 这样的语言是如何与数据库查询语言 (LINQ) 打包在一起的,而 C++ 被认为是臃肿的。

于 2009-07-31T14:44:01.747 回答
2

您无需了解所有背诵出来的标准。不过,它确实有助于了解大局。您编写代码的 5% 可能会让您重新发明偶尔的轮子。根据您需要接听电话的时间、5% 的重要性(想想帕累托)。

另外,有什么特殊原因(比如遗留代码依赖)为什么你不能把这 5% 转移到 python 上?

于 2009-04-19T12:04:12.030 回答
1

首先尝试参加有关 c++0x 的课程并让您的公司为此付费:) 我们的大脑可以容纳大量的垃圾知识。我们应该首先向程序用户学习并听取其他人的意见/诀窍,而不是诅咒和拥有程序员的时刻。以这种方式,知识传输得更快。

于 2009-04-19T12:55:13.047 回答
0

我的建议是学习 c++0x ( && FTW) 的新关键字,但不要费心尝试学习整个库。将 python 用于你想要的 w/e,可能 C# 用于应用程序,然后在你需要做一些强大的事情时使用 C++(0x)。并在原型设计时询问 stackoverflow 和谷歌关于新容器的信息。

您不需要使用少数几种语言,

于 2009-04-19T12:16:04.700 回答