即使是大多数喜欢C ++的人都承认它有很多与其作为系统/性能编程语言的利基无关的瑕疵。这些包括其过时的模块管理系统(头文件),前向声明的要求,使其语法不可判定的语法怪癖(例如<>模板声明的尖括号),包含在文本级别操作的宏而不是真正的语言功能,用于解决宏所用的问题,复制功能,如数组和字符串(这些类型的STL和C版本),几乎没有语法糖,以及一般缺乏现代功能,如线程,垃圾收集,委托/闭包等(注意:是的,在内存受限或实时环境中,你可能有充分的理由不想要垃圾收集,但它可以很容易地选择退出并成为管理内存的默认方式。)
另一方面,C ++是唯一的主流语言,它允许您有效地编写代码并接近金属,但也提供至少一些高级抽象。它是成熟的,标准化的,拥有大量的编译器实现和库以及大量的遗留代码库。
对于那些使用C ++作为主要语言的人,是什么让你个人认为它的疣值得忍受?如何让你改变主意并决定使用较少的这类疣的新语言?你是否真的喜欢它使用C ++,还是因为传统问题或者因为没有其他成熟的主流语言而勉强使用它?
答案 0 :(得分:30)
你的部分问题有一个错误的假设。你假设我们有语言选择。在所有我使用C ++工作的项目中,没有真正的选择。这个项目早在我加入公司之前就存在并且是用C ++编写的。他们背后有多年的历史和相应数量的代码。
我认为这是人们在说“C ++会死”或“为什么人们还在使用C ++?”时犯下的最大错误。我绝对同意,除了系统级程序之外,你不会看到许多/任何以C ++开头的新项目。恕我直言,它没有多大意义。不一定是因为语言中存在固有的缺陷,但是找到擅长编写C ++的人越来越难。
人们经常忘记考虑的是今天运行我们世界的数百万(数十亿?)C ++系列。切换到另一种语言非常代价高昂,无法随心所欲。将时间和精力用于重写该大小的应用程序需要花费巨大的理由。这就是C ++不会死的原因。至少在不久的将来。
答案 1 :(得分:27)
给我一种编程语言:
......我可能会考虑转换; - )
答案 2 :(得分:18)
我使用C ++(近25年来已经这样做了),因为它是最好的系统编程语言。我会说我不认识你所描述的任何所谓的“疣” - 这些都是特征!
对于非系统编程,我使用其他语言,如PHP,Delphi,bash脚本,awk,perl和Smalltalk。一种尺寸并不适合所有人,除非你当然是某种语言偏执。
答案 3 :(得分:14)
这些包括其过时的模块管理系统(头文件)
我真的看不出C ++使用头文件的方式有任何问题。通过提供两种方式来包含标题,您可以在源级别指定符号应来自您的应用程序还是来自系统的已安装的facuilities。所有现代C ++编译器都支持预编译头,因此没有性能损失。从实现中分离标头允许开发人员使用其他语言编写的库。
语法怪癖使其语法不可判定(例如<>模板声明的尖括号),几乎没有语法糖,
语言非常庞大,难以完全遵循,但它仍然受到适用于所有地方的许多逻辑规则的指导。该语言实际上提供了许多方法来定制您的使用,通过函数和运算符重载以及模板,使您可以简单地表达您的问题
包含在文本级别运行的宏而不是真正的语言功能来解决宏的用途,
对于预处理器有很多不喜欢的东西,但从代码生成的角度来看,对令牌进行操作非常有用。当然,像M4宏这样的东西提供了一种更强大的方法,但缺点是它不是语言的标准部分。无论编译器是什么,标准c / c ++预处理器都可用。
重复功能,如数组和字符串(这些类型的STL和C版本)
此功能不重复。需要低级,逐字节的基元(不包括指针算术)来实现更高阶的概念,如通用容器。记住C ++是为了实现它所实现的系统的编程,也是为了提供实际工作的表现力。
并且普遍缺乏线程,垃圾收集,委托/闭包等现代功能(注意:是的,在内存受限或实时环境中,您可能有充分的理由不想要垃圾收集,但它很容易选择退出并成为管理记忆的默认方式。)
线程需要操作系统的合作,使编程语言无法真正标准化。许多语言将其抽象为单个界面,但这在c ++中并未发生(显然这是即将到来的)。垃圾收集器可用于C ++,但它提供了更强大的概念RAII。选择退出不是C ++的方式,如果垃圾收集设施被标准化为语言,它肯定是一个选择加入,所以如果你不使用它,你不必支付它
答案 4 :(得分:13)
是的,我比Java更喜欢C ++ - 因为我可以更自由地表达自己。
C ++是必要的,因为它是目前唯一真正可扩展的语言。有一种方法可以调整程序的各个方面,因此它永远不会失去动力。
另一个好处是详细程度在库代码中,而不是“使用”代码。一旦库正在运行,使用代码通常很好并且简洁(如果您正确地使用了库,则易于阅读)。
在Java / C#中,所有详细程度都归结为使用代码 - try / catch / finally ...所有这些都需要一遍又一遍地输入。伊克...!
我是否提到过基于堆栈的对象?人们如何在没有他们的情况下生活...... ??
C ++真正倒下的唯一地方就是反思(尽管即使这样可以完成,例如COM)。
是的,带有更严格语法的清理C ++会很好但我们知道它永远不会发生。你可以习惯语法,总体而言,这是一个很小的代价来支付你得到的回报。
答案 5 :(得分:10)
作为系统/性能编程语言的利基
这是一个非常大的利基!有可能如果一个软件有超过1000万用户,它是用C ++编写的:
答案 6 :(得分:6)
对我来说,我更喜欢C ++,因为:
对于主要开发,我更喜欢其他什么?好吧,除了以某种方式解决上述原因之外,其他“更高级别”的语言必须表达我仍然能够实现和调试我在C ++中可以做的所有事情的感觉。真正唯一对我来说很接近的是C ++ / CLI,但它在语法上更糟糕,更难理解,并且未能通过“运行时所需”测试(并且可以说在其他预期的好处方面没有增加太多)。
我想在退休之前的30多年里,我会得到报酬而不是C ++。肯定存在开发领域,其中C ++不是优选的,并且语言供应商有强烈的动机迫使开发人员使用在专有和/或供应商控制的运行时(例如:Java,C#等)上运行的更高级语言。但就目前而言,对我来说,C ++仍然是适合这项工作的正确工具,我喜欢通过写作来获得报酬。 :)
答案 7 :(得分:5)
答案 8 :(得分:4)
当他们提出一种语言能够在更少的内存中运行更快并得到更广泛的支持。
答案 9 :(得分:4)
我的观点是,人们需要更高级别的语言,以某种方式提供C ++提供的相同功能。使用高级语言(比如Java)做一些事情,同时以更好的速度,本机二进制编译和其他功能执行,而不需要使用像JNI这样的东西,将是“我需要摆脱C ++”。
答案 10 :(得分:3)
理解为什么C ++就是这样,并欣赏它的成就的最好方法是阅读“C ++的设计和演变”。
对于它的所有瑕疵,C ++是一种非常好的语言。
答案 11 :(得分:3)
我做科学计算,我的GUI在C#中,我的后端是C ++。它并非超出C#在性能方面至少可以与C ++相等的可能性,但这并不是C#/插入托管语言的重点所在。这很难,但是在C#执行以及C ++(或非常接近它)进行数值计算的可能性范围内,因为IL被编译成机器代码。如果/当发生这种情况时,我很乐意进行转换。
答案 12 :(得分:3)
我主要将C ++用于嵌入式平台,这通常需要与硬件进行大量的密切交互。我在这里看不到任何OO替代品。如果我在这里用C ++代替任何东西,它将能够在编译时解决所有的包含权限,所以我不必担心那些......基本上,这些东西可以减轻我的开发,但没有提供任何运行时开销(反射,垃圾收集等)。
对我来说,C ++完全是关于运行时性能和绝对控制。没有花哨的运行时运行的东西“幕后”。
答案 13 :(得分:3)
正如你所描述的那样,C ++当然有它的瑕疵,这个C++ FQA做得很好,指出了很多。但是,使用某种语言很长一段时间的人和组织已经包含了大量的idioms, gotchas和guidelines,这使得在其中工作更加可以忍受。多年来,C ++中的编程风格也evolved。使用本机编译和成熟的工具集,在许多平台上,C ++仍然是一个强有力的竞争者。
在我看来,C ++迅速失去“地位”的唯一方法是让像IBM或谷歌这样的大公司支持一个可行的替代方案,比如the D language,并用它来推动它威力。但是,鉴于在他们自己的代码库中已经存在大量的C ++,这几乎是不可能实现的。
答案 14 :(得分:3)
坦率地说,它运作良好,我付钱写它。它并没有与控制它的单个供应商的营销想法纠缠在一起。市场上的C ++专家越来越少,因此我的价值随着时间的推移而不断增加。我将继续使用它,直到市场变得不可持续。
答案 15 :(得分:2)
当一种新语言能够像C ++一样富有表现力时。由于高级和低级能力之间的利益冲突,这很难实现。这就是我们首先拥有语言和流程互操作性的原因。
另外C这对C来说可能更难,因为它非常精简和强大。由于这个原因,C赢得了低水平的竞技场。 C为C ++和目标C创造了良好的支持。
总之,你很长时间都会看到C和C ++。
答案 16 :(得分:2)
我个人选择使用C ++(当我甚至可以选择时)是因为它是唯一一种没有解释的多用途编程语言,并且有足够的“花里胡哨”让我能够相对快速地完成工作。现在,当机会出现时,我选择其他语言(例如,Python,Java,Perl,ksh等)有很多原因。我将其他语言用于“一次性”应用程序和脚本,其中性能不是问题,也不是“现场可部署性”。许多脚本语言的部署支持非常以网络为中心,我现在在更多的基础架构和“隐形胶水”行业中工作。我们正在寻找J2EE应用程序服务器来帮助解决部署和支持问题,但我们已经有了一些很好的可执行服务方法。
在很多情况下,我将继续选择使用C ++的最大原因是,在添加少数几个库来处理非编程语言平台的东西(线程,套接字等)后,它几乎支持我所需要的一切。 )。并且...... 是 ...我确实认为线程应该在编程语言之外表示。这是我倾向于远离其他语言的主要原因 - 我实际上喜欢具有裸骨核心的语言,其功能通过附加库提供。
让编程语言担心语法,继承,多态,模块结构,异常处理,循环结构等。一旦您进入应用程序域并希望多线程化您的应用程序或者可能使用多个进程,那么您正在谈论库。太多语言试图强制使用不适用于每个问题的特定编程范例(OOP)。我更喜欢一种不错的通用编程语言。
最后一个原因是我选择C ++而不是其他语言是因为我认为它比其他语言更具确定性。我知道Java是首选的平台中立解决方案,Ruby& amp; Python是快速开发替代品du'jour。问题是被解释的应用程序总是在他们的解释器的奇思妙想。这并不总是坏事,而且肯定也不总是好事。
有可能C ++会在这里停留一段时间。我的猜测是,大量纯粹的OOP语言将开始将市场份额扩展到更通用的动态语言(可能是Ruby和Python),并且这些语言也会获得更严重的OO排序。当太阳开始真正开始使用C ++时,我将切换到另一种语言,并且还有另一种语言被“行业”所接受。我相信它会在某一天发生......毕竟C ++在几年前实际上取代了C作为我的选择语言。
答案 17 :(得分:2)
C ++是我工具箱中的一个工具。 java和python以及其他一些东西也是如此。
我公司的环境随时可以使用任何合适的东西。
工具箱中的工具。使用适当的。
答案 18 :(得分:1)
不幸的是,你没有发现语言的基本优雅和概念完整性。它提供了与任何其他语言一样舒适和一致的世界观,正如其多年来的持续使用所反映的那样。 YMMV,但允许我们同样的考虑。
答案 19 :(得分:1)
为什么呢?如果我开始用不同的语言编写代码,您是否能够获利? :-P
除了开玩笑,我写C ++代码,因为这就是我的雇主付钱给我的原因。这真的很简单。如果他们决定使用不同的语言,我会开始使用它。现在,至于为什么他们选择使用它,我只能推测。我猜他们有两个主要原因:
答案 20 :(得分:1)
你正在以相反的方式解决这个问题。人们选择他们感兴趣的问题/应用领域。语言的选择遵循这个决定并且非常简单。
没有人选择编程语言。编程语言本身很无聊,在没有参考问题/应用领域的情况下谈论它们是荒谬的。
就个人而言,我想从事机器学习。作为毕业生。我曾致力于分析巨大数据集(IMDB,Netflix)的图形表示。我在大部分工作中使用了C ++。我本来喜欢使用C#或Java或更好的Python,但问题的本质要求我使用C ++。在5年的时间里,我已经爱上了C ++,因为它在效率和抽象之间实现了黄金平衡。每当我发现需要时,我都会使用C ++。 C ++程序员是顽固的实用主义者,他们不会让任何事情妨碍完成任务。他们不会仅仅为了它而坚持C ++。
答案 21 :(得分:0)
我认为,如今项目的高级别和低级别部分不需要(通常不应该)用同一种语言编写。因此,您要么等待雇主意识到即使找到开发人员更难以使用多种语言,实际上更容易找到好的开发人员,或者等待不称职的军队参与多种语言计划。
答案 22 :(得分:0)
使用C ++查看“问题”列表,我可能接近同意的唯一一个问题是STL / C字符串转换。
我可能会问,你为什么要C ++成为C#?