Linux开发者是否需要了解C++?

8

我之前参与了一场讨论。我所在的公司使用ANSI C语言在Linux下进行开发。我认为,从设计角度来看,如果转换到C++会带来很多好处。我们现有的代码只需要消除所有隐式类型转换,因为C++对此要求更严格,然后就可以像往常一样进行编译和运行。但是有人告诉我,我们永远不会开始使用C++。原因是“Linux开发者懂C语言”,但是很难找到懂C++的Linux开发者。个人认为这有点奇怪,因为我最初就是在Linux上学习C++的。但这使我感到好奇,想知道是否有任何统计数据或者您能否帮助我了解这种说法的有效性。这将有助于以后的参考,因为我一直认为,在具备C++知识的Linux开发者方面并不难找,但我可能完全错了。


17
这种推理可能来自Linus Torvald对C++的不喜爱,以及一些Linux狂热者认为,如果Linus这么说,那肯定是真的。 - Gorpik
8
你们开发什么类型的软件?这会对我选择编程语言产生更大的影响,而不是它所运行的操作系统。 - timday
6
除了Gorpik提到的之外,还要记住许多(所有?)著名的GNU/Linux开发人员(Torvalds,Stallman,Ts'o,Drepper…)都是傲慢的狂热者(在这里你可能也可以加入更不礼貌的词语),他们认为宇宙围绕着他们转。使用软件,忽略人们。 - Philipp
2
@gorpik:Linus 并不是完全不喜欢 C++。C++ 不适合内核开发,这是 Linus 最关心的问题。过去曾有几次尝试将 C++ 引入内核,但它们都存在缺陷并带来了明显的性能退化。但内核只是一个 - 应用程序则是无数的。将系统编程实践推广到应用程序开发是错误的。这是我作为系统开发人员告诉你的。 - Dummy00001
4
@Dummy00001说:不,Linus 讨厌、蔑视、害怕和憎恨C++。这与操作系统内核无关。他在任何情况下都讨厌C++。在这方面他是个白痴。 - jalf
显示剩余6条评论
11个回答

14

就设计而言,我认为转换到C++会带来很多好处。

这可能取决于谁来在C++中决定设计。

我们现有的代码只需要摆脱所有隐式类型转换,因为C++对此要求更严格,然后它就可以像往常一样编译和运行。

情况并不是那么简单。如果您更改编译器选项(或文件扩展名)以切换到C++,您的代码将无法直接编译(您需要检查并进行更改)。

此外,您现有的C代码库将成为编写不良的C ++代码库。

还可能引入各种微妙的错误,即使是经验丰富的C开发者也几乎不可能找到(例如,在C和C++中,数组的sizeof操作符的行为不同,但熟练掌握C / 初学C ++的开发人员甚至不会考虑其代码中的熟悉sizeof实际上做了意料之外的事情)。

原因是“Linux开发人员知道C”,但很难找到精通C ++的Linux开发人员。

这不是一个有效的理由(如果您在网上发布“寻找C ++ Linux开发人员”的职位,您应该会得到一些不错的简历-取决于您的报价)。

这可能是您公司中能够做出这个决定的人的信念,或者只是他们给出的借口来摆脱您。以下是一些可能适用于您情况的反对转换的原因 - 这也是您的经理可能考虑的:

  • 编写代码库的人可能是优秀的C开发人员,但不懂C ++,或者是初学C ++的开发人员和/或质量差的C ++开发人员。

优秀的C开发者往往不适合成为优秀的C++开发者(因为在C++中最佳实践完全不同于C,并且在许多情况下,C中的最佳实践与C++中的相反)。这是一个问题,因为C++代码看起来对C开发者来说足够熟悉,以至于他会认为自己的经验同样适用于C++(而C中的良好设计决策通常会导致C++中的糟糕设计决策)。

即使他们可能是优秀的C++开发者,但如果是这样的话,你的经理应该不知道(如果他们是作为C开发者被聘用的,他们的C++技能很可能从未在面试中提到过)。

  • 你的高级团队成员可能对你的应用程序逻辑有很好的理解。如果你的应用程序转换为C++,他们可能不得不离开(并被C++开发人员取代)。这样的变化将失去非常熟悉你问题域的团队成员。根据你特定的问题领域,这样的损失可能是巨大的。

根据你的代码库的大小和结构,转换到C++可能是一个非常好的决策。你没有提供足够的细节让我们知道是否是这种情况。

例如,我曾经看到过一个大型的C代码库,在多年的发展中,它以不良的方式重新发明了C++(伪类支持虚函数表和继承-带有指向基本结构的void*的结构或者基本结构具有指向动态创建的特定数据的void*-等等)。

以后作为参考会很好, 因为我一直认为具备C++知识的 Linux开发者不难找,但我可能完全错误。

他们不应该难以找到,但这仅适用于项目开始阶段。没有一个好的经理会轻易地更换那些掌握问题领域的经验丰富的开发人员,只为了几个设计决策而雇佣新人。

如果你能提供更好的转换理由,他们可能会考虑。对于经理来说,切换的好理由包括较低的维护成本、较低的开发成本、较低的风险、较少的工作量、更好的进度报告等等。

如果你想继续推动这个变化,你将不得不在这些领域找到一些好的论据,并对他的“Linux开发者知道C”提出一些好的反驳。

你的观点应该足够好,能够克服我上面提出的论据。


1
我接替了上一位高级开发人员,今天我是唯一在这个系统上工作的开发人员。即使是那些离开的老员工也认为我可能想要改用C++ :)。我设法在测试中将我们系统的一个部分转换为g++兼容格式,只用了大约30分钟。运行并通过了所有测试。我们代码的编写方式几乎完全包括消除隐式类型转换,以使其符合g++的规范。此外,在许多地方,我们使用void*来支持任意数据的链表数据结构等。使用STL和list<mydata*>可能会更好。 - inquam
1
在C和C++中,数组的sizeof有什么区别? - Kleist
@inquam:我对你的情况做了一些假设,认为你没有提到(感谢你提及它们)。考虑向你的老板提出这个建议(实际上,你可以提出一个正式的建议,列出优缺点,看看会有什么结果(你也应该提到这些要点)。这样更难被忽视。关于你最初的问题(关于Linux开发人员是否知道C ++),你可以向他指出这可能是样本偏差(如果他必须与Linux C开发人员一起工作,那将告诉他没有C ++开发人员的存在)。 - utnapistim
@inquam:另外,提到在切换后所有测试都通过是至关重要的。如果您的测试覆盖率很高(或非常全面),那么这意味着切换的成本大大降低了。 - utnapistim

8
开发Linux需要了解C++?奇怪。Linux最常用的用户界面之一是KDE,它广泛使用C++。
在我的公司,我认为我们很容易就能找到100名懂得C++和Linux的开发人员。虽然他们不好找,但也并不特别难。好的工程师不管你需要什么技能都很难找到。
我们似乎并不是唯一想到这个想法的人。看看Mozilla;FireFox是一个大型的C++项目。同样适用于WebKit,也是C++。

相关链接:https://dev59.com/rXI_5IYBdhLWcg3wDOdC,特别是https://dev59.com/rXI_5IYBdhLWcg3wDOdC/1551859#1551859。 - gnud

3

我已经从事C++维护编程约10年了。所涉及的平台包括Solaris、AIX、HP-UX和Linux。我(或同一团队中的其他开发人员)从未停下来思考过“Linux开发者知道C++,我们是否不应该使用它”的可能性。

有些人已经过多地吸收了Linux内核邮件列表反对C++的宣传。


2
内核是用C语言编写的,将内核转换为C++可能不是一个明智的选择。
其余的软件可以使用任何你想用的语言编写 - 我在我的机器上看到过严肃的Linux程序用C、C++、OCaml、Python、Perl、D、Fortran、Java、Lisp等语言编写。
C++中有相当多的Linux软件 - 例如整个KDE套件和使用Qt的所有内容都是用C++编写的。

但我被告知我们永远不会开始使用C++。原因是“Linux开发人员熟悉C”

在我看来,这是无稽之谈,除非你正在处理内核或可能遇到可移植性问题。我建议他们看一下Qt 4应用程序和KDE。C很好,但有些事情在其他语言中更容易做到。

我应该说原因是,逐字逐句地说,“很容易找到懂C语言的Linux开发人员,但几乎不可能找到懂C++语言的Linux开发人员。C++开发人员往往是Windows开发人员。” 尽管如此,这并不适用于我,因为我是从C++和Linux开始的 :P - inquam
我也是。虽然我必须承认,我真的是一个VMS人。 - Brian Hooper

2
理由是“Linux开发者懂C语言”
如果说“Linux开发者”指的是“开发Linux内核的人”,那么这是一个真实的陈述。然而,如果你指的是“开发运行在Linux上的应用程序的人”,那么这就明显是错误的。人们使用各种语言在Linux上进行开发。
至于C++是否适合您的应用程序,则是另一回事,显然我无法回答,因为我对您的代码库一无所知。

1
在系统编程中,语言越简单越好。在应用程序编程中,人们有更多自由。 - Dummy00001
1
我认为更准确的说法是“开发Linux内核的人”。 - SigTerm
2
根据Richard Stallman的说法,Linux 就是 Linux内核,包括用户空间工具在内的完整操作系统应该被称为GNU/Linux,或者GNU/Gnome/KDE/Apache等等/Linux。 - JeremyP
1
我知道这一点。但是许多其他人(不仅仅是一个史托曼)使用“Linux”一词来描述整个操作系统。请查看维基百科关于Linux的文章以及有关Linux命名争议的对应文章。http://en.wikipedia.org/wiki/GNU/Linux_naming_controversy - SigTerm
@Dummy00001 如果你有一些愚蠢的程序员,那么愚蠢的语言对于系统编程来说是更好的选择。这就是当你接受来自世界各地的随机人员的补丁时所得到的结果。除了避免那些无法掌握C++的程序员之外,绝对没有理由不使用C++而选择C。 - Vagrant

1

就此而言,我在Linux上经常使用C++进行开发。许多C++项目都以Linux为目标平台,例如整个Qt/KDE系统。Linux开发人员似乎有点偏爱C语言,因为Stallman 发表了“你应该使用C语言编写代码”的言论。但这并不是你需要过分关注的事情。


这可能已经改变了,至少对于gcc而言,http://gcc.gnu.org/ml/gcc/2010-05/msg00705.html。 - Anycorn

1

这取决于你正在开发的项目。C和C++都可以在Linux平台上被“利用”,每种语言都有自己的开发人员。我从未遇到过这样的理由。


0

核心是用C语言编写的。

以上是我完整回复的文字内容。


5
Windows和OS X的内核也是用C语言编写的,并没有人认为只因如此所有应用程序都应该用C语言编写。 - Philipp
2
不过,你可以认为成为一个“Linux开发者”意味着你是一个内核黑客。 - Dave Van den Eynde
2
@Philipp:这是因为Windows和OSX的开发人员不受英雄崇拜驱动,也不关心内核背后的主要人物偏好。 - jalf

0
知道C++的Linux开发人员。是的,为什么不呢?系统程序通常是用C语言编写的。但与此同时,许多*nix的自定义应用程序都是使用Qt/gtkmm和C++编写的。

这只是我听到的决定从未开始使用C++的原因,即使我们现有的代码可以使用g++编译器进行编译和运行。我认为这是一个有点奇怪的说法,但话说回来,我不认识世界上所有的Linux开发人员 :) - inquam

0

inquam - 这里有一个建议,适用于你们的开发团队。考虑宣传你们的团队仍然可以使用“纯 ANSI C”进行编码,但是通过C++编译器而不是C编译器来编译代码。也就是说,将所有项目中的.c文件扩展名更改为“.cc”(或“.cpp”),并将默认构建工具设置为g++(或您的编译器)。

C++编译器将强制执行更好的类型安全性,将更多模糊的编码实践视为错误,并在检查之前阻止真正的错误。

将遗留代码从C转换为C++存在一些微妙之处,因此可能是您宣传所有新源文件都是C++。然后逐渐转换遗留代码。至少,对您编写的代码这样做。然后在检查之前将文件名扩展名切换回“.c”。也许这个好习惯会流行起来。


1
-1 不好的建议。如果你编写C代码,应该使用C编译器。 - Tomas
同意 @Tomas:那是得到最终代码质量差且难以维护的更好方式。 - ereOn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接