我是C#程序员,我的大部分开发工作都是针对网站以及一些Windows应用程序。就C而言,由于没有必要,我已经很长时间没有使用它了。令我惊讶的是,我的一个朋友说她需要学习C来测试工作,而我正在帮助她学习C#。

我发现只有在以下情况下,某人才会学习C来进行测试:据我所知,所有与COM和硬件设计有关的开发也都用C ++完成。因此,如果您需要使用C ++,则学习C毫无意义。我也不相信历史的意义,那为什么要浪费时间和金钱来学习C?

C是否仍用于任何新软件开发或其他任何形式?

评论

您见过用于PIC的C ++编译器吗?

我是唯一一个让某人将学习等同于浪费时间和金钱的人吗?

“据我所知,与COM和硬件设计有关的所有开发也都用C ++完成” –对我来说听起来像您实际上没有进行任何硬件接口设计。

人们忘记了我们都喜欢用的高级语言,常常用C语言实现。

@ThomasEding死语?如果您认为C是一门死语言,那么您对编程语言的了解当然非常有限。

#1 楼

C的优点是它是一种相对较小的语言,这使得实现C编译器变得容易(而C ++编译器是编写的怪物),并且使学习该语言更加容易。另请参见TIOBE索引,根据该索引,C稍早于C ++。

在(IMO)降序排列中,C仍然被大量使用


嵌入式的东西
移植C编译器更容易移植到小型平台上,而不是移植C ++编译器。而且,C的拥护者声称C ++“在背后有太多的作为”。但是,IMO就是FUD。同样,通常是由于声称“知道编译器在做什么”更加容易。但是,许多嵌入式程序将从例如模板和其他C ++关键功能中受益。
开源软件
不过,这主要是一个态度问题:OSS始终偏爱C而不是C ++(而在大多数行业中,情况恰恰相反)。实际上,在Linux上,Torvalds的非理性仇恨可能是最重要的原因。


评论


历史比态度更重要。您可能认为的许多“核心”开源软件包最初是在C ++的普及程度不如现在和资源仍然匮乏时开发的。

– Blfl
11年8月26日在14:07

TIOBE指数是个玩笑。搜索引擎的点击是没有意义的。

– DeadMG
11年8月27日在11:08

@Sedate:模板通常会导致代码膨胀是一个神话,它来自古老的C ++编译器时代。现代编译器将折叠相同的模板实例。 OTOH,模板允许模板元编程,该模板元编程在编译时而不是运行时执行代码,从而减少了生成的代码。而且,它们使程序更安全(无需强制转换),这在嵌入式领域中通常非常重要。 C ++专家因抛出模板的愚蠢性而被EC ++专家判处死刑。

–sbi
2011年8月29日在6:25

@James:您的意思是诸如高效抽象,通用编程和类型安全之类的东西?是的,谁想要那个。

– Xeo
2012年11月4日21:34

@JesperE碰巧的是,自从写这篇文章以来,我已经换了工作,现在我正在为嵌入式设备编程。我们使用的是C ++,当您的硬件,实时限制和可靠性都比较差时,STL和模板元编程可以为您提供出色的功能。 (我们在做发电厂。)是的,您必须知道对于某段代码应该使用std :: vector还是std :: map-但您不必自己实现它,但可以依靠它经过测试的,高性能和可靠的库实现提供了高度的抽象性。

–sbi
13年3月3日在21:21

#2 楼

C在资源匮乏的嵌入式硬件编程中经常使用。

Linux内核是用C编写的,因为根据Linus Torvalds的说法,C ++是一种可怕的语言。

评论


我认为Windows内核的很大一部分也是C。还有很多旧系统。

–编码器
2011年8月26日12:38



为了完整起见,Linus确实尝试了内核中的C ++。这不仅仅是一个问题,而且还有一个优点。无论如何,内核开发是一个非常具体的主题,这并不意味着C ++通常是不好的。

–deadalnix
11年8月26日在12:40

根据其他人的说法,莱纳斯的论点太可怕了。

–sbi
11年8月26日在12:41

Linus的参数可能有效,也可能无效,但是Linux内核仍然使用纯C编写:-)

–乔纳斯·普拉卡(Joonas Pulakka)
11年8月26日在12:51

Linus是个混帐。

–ubiyubix
11年8月26日在22:00

#3 楼

我见过的所有现代语言都可能与C交互:


C ++
Java
C#
Python
Haskell
目标C
Rust

与C交互的需要源自:

C,它具有简单的ABI
很长时间

这意味着由于这些语言可以与C通信,因此它们可以:


利用其库
通过C相互通信(例如,Clang是用C ++编写的,但是在其C接口上提供了Python绑定。

我敢打赌,它们都在运行时依赖C(除非它们进行了完全汇编?可疑) 。

C是编程语言的Lingua Franca,并且是不依赖于特定体系结构(例如汇编程序)的最简单的语言(在ABI方面),要摆脱它,将需要进行重大的改变。其中。

评论


“ C是编程语言的Lingua Franca”,换句话说,就是最大的公分母。

–Anakhand
20年8月6日在15:39

#4 楼

在我看来,这是一个非常短视的问题,类似于“我和我的朋友们都在听雷鬼音乐。有人真的还在听Rap吗?”。

那里的每种语言都有其用途。不同的语言肯定有其利基。但是问C!我确信每天使用C#的人数要少于C(从在没有人使用C#的商店工作的完全偏见的角度来看)。

快速的google可以了解语言的相对流行程度。 br />我确信这都不是权威,但我们可以使用它来查看趋势:

http://www.tiobe.com/index.php/content/paperinfo/tpci/index。 htmlhttp://langpop.com/

即使在标签上查看问题的比率:https://stackoverflow.com/tags


C#:209845
其他16个标签
C:38790

所以C是SO上18个最受欢迎的话题(那里还有很多其他语言)。

注意:上面的TIOBE索引已经进行了十多年的不断更新(并且有一些数据可以追溯到三十年前),该索引应用于衡量使用每种语言工作的工程师(尽管我不知道它的准确性如何)。在Java / Visual Basic之外的前10种语言中,它反映了我商店里的人们所知道的(尽管我们的比率会略有不同,因为我们的样本量小得多)。

评论


这个答案使我感到困惑...您继续讲C#,然后显示SO问号,但这些问题与使用C并没有任何实际关系。流行度(尤其是在langpop上,他们使用搜索引擎查询来确定流行度)并不能真正显示语言的现代用法,而只是显示对某种语言的现代搜索。对于搜索,您必须考虑到C在大学中经常用于较低级别的类,这样可以增加查询的数量以及SO的数量。

–杰蒂
2011年8月26日下午14:58

@Jetti:这就是为什么我明确地说:我确信这都不是权威,但是我们可以用它来观察趋势。 C不再是高等学校教授的主要语言(如果那样的话,那么新一批的毕业生就不会那么没用了)。如今,人们倾向于学习Java / C#。此外,Tiobe报告是关于作业而非查询的。

–马丁·约克
11年8月26日在16:57

往回看,我看来在单词选择上很差。我并不是说低级类(开始类),而是系统类(计算机体系结构)是使用C的地方。

–杰蒂
11年8月26日在17:48

SO标签计数通常不定义语言流行度,而只是显示SO用户之间的语言流行度。

– Ed S.
11年8月26日在19:42

@Ed S.显然。但是问题不在于受欢迎程度。关于C语言的存在。 SO标签的数量向我们表明,这绝对不是一门废话。 C在其他站点上位于前2位的事实并不意味着它是第一/第二最常用的语言。但是它在前十名中的存在是一个重要的标志,那就是它还没有死。当然,这些都不能证明C仍在积极使用中。

–马丁·约克
11年8月26日在21:32



#5 楼

当您资源匮乏并且不需要面向对象的功能时,可能需要使用C。

当今使用的许多软件仍然是用C编写的,更不用说硬件驱动程序了。

根据Tiobe索引,C仍然是最常用的语言。


如tcrosley所建议的那样,您可能要看一下这个相关问题。


您还应该检查一些有关C和C ++区别的相关文章,例如此Wiki或类似的内容。

评论


哎呀!那就好了。我从未想过“ OOP功能实际上会增加语言的开销”。感谢您阐明这一有效观点。现在,我明白了,C在其他方面领先

–潘卡吉·阿帕德(Pankaj Upadhyay)
11年8月26日在12:54

@Pankaj C ++通常并不一定会增加很多运行时间开销,这种语言的许多复杂性是“不为您不使用的内容付钱”的原则-如果您不使用异常,那么异常就不会放慢速度或增加代码大小。虽然编译器更大,更复杂

–马丁·贝克特(Martin Beckett)
2011年8月26日15:27

有关嵌入式领域的C,另请参阅以下问题和答案:programmers.stackexchange.com/questions/84514/…

–tcrosley
2011年8月26日17:00



您实际上并不需要OOP功能,它仅在某些情况下可以很好地工作。

– Ed S.
11年8月26日在19:41

@Jose Faeti:我的老板会同意,因为我的老板是一个经验丰富,理性的人。他不喜欢编程宗教。

– Ed S.
11年8月29日在16:54



#6 楼

听起来您好像在试图使自己相信C是无用的,因此可以忽略。让我们来分解您的问题:

“我认为只有在C中完成开发工作的人才能学习C来进行测试。”

不,有很多原因学习C。即使您不知道我仍然会避免使用类似的笼统语句,尤其是与循环逻辑结合使用。显然,人们需要知道代码的编写语言,才能正确测试/修复它,但前提是该语言仍然作为给定语言使用,并且对任何语言都适用,而不仅限于C。

“据我所知,与COM和硬件设计有关的所有开发也都用C ++完成。”

这是不正确的。

”因此,学习C不会如果您需要使用C ++,这是没有道理的。我也不相信历史的意义,那为什么要在学习C上浪费时间和金钱呢?”

这是所有问题中最可疑的逻辑。首先,历史意义是您应该相信的东西,因为如果您这样做,您将知道C是C ++的子集,因此,了解C可以帮助您成为更好的C ++程序员。当然,C对后来出现的大多数语言也有影响,因此好处不止于此。此外,由于C非常重要,因此不能认为C仅具有历史意义。它仍然被广泛使用,因此不能降级为次要位置。您可以辩称这不是每个程序员都需要使用的语言,并且不是一种全面的知识,这是正确的,但是请不要在说您不相信某些东西而不首先检查其真正优点的基础上提出自己的论据。 br />

评论


C是C ++的子集,这是您的意思吗? 。 C不是C ++的子集;实际上它们是完全不同的。是的,C ++是C的增强,或者有时被称为带有类和OOP的C,但是说C是一个子集,并不能证明

–潘卡吉·阿帕德(Pankaj Upadhyay)
2011年8月31日下午5:37

C ++主要是旧版本C的超集,从那以后C的发展方向有所不同。这些语言的某些方面在很大程度上是平行的,但其他方面则没有(C ++还有很多其他事情)。

–研究员
2012年5月26日14:22

我同意为澄清这一事实而投票,并非所有有效的C程序都是有效的C ++程序,即C ++不是C的超集。但是,这是C在决定将其确定为C时的方式的超集。正如Donal Fellows所提到的那样。但是,当它不再是真实的时,再说它不再是没有意义的。

–约书亚树篱
17年5月25日在19:18

同样:如今,几乎没有人会积极讲拉丁语(梵蒂冈除外),但了解拉丁语极大地增进了您对多种其他语言的理解。

– Lagerbaer
20 May 27'3:31

#7 楼

除了嵌入式系统之外,大多数较新的语言还具有与C交互的方式。在编写希望轻松使用所有这些语言的库时,C是一个显而易见的选择。 C ++虽然还可以与某些语言(例如Python(仅CPython))接口,但由于C ++的某些功能(尤其是名称修改,但模板无济于事),C ++无法与多种语言接口。 C ABI是最简单的接口之一(我知道您可以编写C ++并使用extern“ C”作为接口。我不在乎)。

它还具有C的优点C和C ++实际上是系统编程的最佳语言,并且C编译时间要快得多。 C ++编译时间显然是我使用过的所有语言中最差的。

现在,虽然还有其他一些语言希望成为流行的系统语言(尤其是我对D的了解),大多数软件是用C / C ++编写的。像D这样的语言需要有人在C库周围创建包装器,而不是像在C ++中那样直接使用它。

评论


D可以像C ++一样直接调用C代码。函数原型(再次类似于C ++)所需要的。您只需在D中编写extern(C),而在C ++中则编写extern“ C”

– Peter Alexander
11年8月27日在12:29

@Peter Alexander我知道D中的extern(C)。这就是我说包装文件时所指的内容。您不能直接包含C头文件(如果C头文件使用extern“ C”并具有#ifdef __cplusplus块,则可以直接在C ++中完成此操作)。在使用extern(C)之间还有其他不兼容性(特别是字符串的处理方式。据我所知,它们在D中没有空终止符。因此,在将数组传递给C时必须专门更改数组)。

–jsternberg
2011年8月27日13:12



#8 楼

好吧,我认为C是最强大的语言,原因如下!

1)首先,C是一种系统语言(这意味着它可以用最少的代码或根本不用代码来进行低级编程)运行时)。

2)生成的应用程序的速度。 C语言源代码的规模相对较小且非常有效,因此与高级语言相比,C语言源代码可以进行更多的优化。它几乎可以使用汇编语言进行编程,而无需使用汇编语言进行编程。甚至可以将汇编和C一起使用!

3)C在固件编程(硬件)中具有它的应用程序。这是由于它具有使用/与装配一起使用/与装配,直接与控制器,处理器和其他设备通信的能力。

4)C是许多其他当前已知语言的基础。查看C的历史,您会发现它已经存在了一段时间(无论如何,编程语言还是如此)。以Python为例,例如一种完全面向对象的高级编程语言。它是用C语言编写的(也许也是C ++)。它告诉您是否曾经想知道其他语言的内幕。

应用语言用于高级编程,例如C语言。编写文字处理程序或游戏。应用程序语言的示例是Java,C#。原因是因为它们包含垃圾回收,自动键入,运行时验证等-重点是生产力。

系统语言用于低级编程。例如微控制器,驱动程序和OS内核。示例包括汇编C。它们需要很少的运行时间或不需要运行时间即可直接在硬件上运行代码,并且重点是程序员可以直接控制硬件。

总体而言,随着应用程序的发展,这种情况正在下降。语言,但仍是系统语言。

#9 楼

哦,是的,它被使用了。我从事网络数据包处理领域。我去过两家处理网络数据包的公司。因此,我们在以太网或IP级别上运行,而不是在TCP之上。

有趣的是,两家公司都选择了C而不是C ++。在其中一家公司中,两种产品之一是在Linux内核之上构建的,而另一种产品是在Linux用户空间中构建的。内核产品显然使用了C,因为Linux内核是用C编程的,但是他们选择也将C用于用户空间产品。两种产品都是在2000年左右开始开发的(内核产品在2000年之前出现,用户空间产品在2000年之后出现)。

在那之后的公司中,该产品基于C语言构建。 ,而不是在C ++上。它实际上是1990年代中期以来的一个项目的延续,尽管由于最近对性能的改进要求,所以决定基本上所有内容都将被重写。由于这种重写,我们可以选择C ++,但没有这样做。

在网络数据包处理领域,性能非常重要。因此,我想实现自己的散列表,其性能要比现有散列表高。我不是哈希表作者,而是选择要使用的哈希函数。也许我想要性能并选择MurMurHash3。也许我想要安全性并选择SipHash。内存分配器显然是自定义的。实际上,我们使用的所有重要数据结构都是自定义实现的,以实现最高的性能。

虽然没有什么可以阻止C ++的使用,但这通常是一个坏主意。每个数据包抛出一个异常将使数据包处理速率降至无法接受的水平!因此,我们不能使用C ++的异常。太慢了。我们已经通过将数据结构实现为结构,然后实现对这些结构操作的功能,来使用某种面向对象的C代码。 C ++将允许具有虚函数,但是如果在任何地方使用虚函数,那么虚函数调用将再次降低性能。因此,最好是显式的,并在需要虚拟函数调用时有一个函数指针。

C ++将在背后做很多事情:内存分配等。另一方面,在C语言中通常不会发生。您可以编写一个分配内存的函数,但是通常从该函数的接口可以明显看出正在分配内存。

作为使用C进行编程时可以进行的微优化的示例, ,看看Linux内核中的container_of宏。当然,您可以在C ++代码中使用container_of,但这是谁做的?我的意思是,这在大多数C程序中是完全可以接受的,但是典型的C ++程序员会立即提出其他建议,例如将链接节点分配为单独块的链接列表。我们不希望这样,因为每个分配的内存块都不利于性能。

也许唯一使C ++受益的是C ++允许模板元编程,这意味着您有时可以避免在调用虚拟函数时仍然具有函数参数,并允许编译器内联函数。但是模板元编程很复杂,我们已经设法满足了C中的所有要求,因此在C ++中使用此功能的好处并不是那么关键。

在其中一家公司中,我们实际上使用了一种自定义的编译语言,其中部分功能在其中实现。猜猜编译器的目标语言是什么?部件?不,我们必须同时支持32位和64位体系结构。 C ++?你当然开玩笑。显然,它是GCC计算的goto的C。因此,将自定义语言编译为C(或者实际上是C的gcc变体,它支持计算的goto),然后C编译器生成了程序集。

#10 楼

C语言出生于1972年,当时已经48岁了,C ++出生于1985年,所以已经35岁了,他们之间相差13年:令人难以置信的是,与C ++相比,C语言已经取得了更多的成就许多其他语言,我不相信仅仅因为这13年的差异。

C语言优雅,易用且功能强大。促使我使用它的第一件事是与汇编语言的紧密联系:这32个关键字几乎可以直接翻译成机器代码,并且使用内存分配和指针的自由度与那些年的计算水平相当:您可以用C

然后C比C ++好吗?我不知道,比较两种编程语言是一项关键任务,您需要考虑领域,应用程序以及比较它们:我认为,将来仍然有理由教C在计算课程中,我不相信其他基于应用程序的语言也是如此:C有点像计算恕我直言。

#11 楼

我仍然每天都使用C,主要原因之一是由于与其他语言的互操作以及SDK旨在供各种编译器以各种语言构建的插件使用。

我可以不要编写使用带有构造函数,析构函数和vtable的类,函数重载,引发异常等的C ++ API,这些可以在Lua,C#,Python,C等中使用。更不用说使用不同的编译器和设置编写的C ++插件了

我不能编写可以从Python调用的C#SDK,例如,不能从C#调用的Python SDK。

C是这里唯一允许我创建可以从这些语言中的任何一种调用的API的语言。那就是说我经常使用C ++来实现这些C接口(尽管有时我只是在C中实现它们)。此外,我有时会发现C是用于诸如低级数据之类的最容易使用的语言。结构和内存分配器。如果要编写旨在分配对齐的位和字节的内存分配器,则在C ++中获得的所有其他类型安全性都无济于事。相对于C ++的丰富类型系统和异常处理,要滚动自己的数据结构并不容易-只是看看如果要使它成为异常安全的对象并避免它,编写一个像std::vector这样琐碎的数据结构需要花费多少精力。在您没有插入到容器中的元素上调用ctor和dtor(我是作为实现了整个C ++标准库的人说的)。当仅一个可增长的阵列很难很好地实现时,请想象实现具有生产质量的BVH所需的工作。

当我想使用现有的数据结构或通过使用现有的数据结构实现更高级别的数据结构时,我更喜欢C ++,但是如果我要在没有用的引擎核心处实现低级数据结构,现有的数据结构,使用C的uber简化类型系统绝对可以使操作变得容易得多,该系统只需要memcpy这里的东西和memmove这里的东西,malloc一个连续的块和realloc这里的东西,而不必担心构造函数,析构函数和异常抛出。

#12 楼

“这是一个想法……”(实际上,这正是该语言的原始设计师所想到的“想法”:


“ C”比汇编程序好得多!” <


“Linux®操作系统”支持20多种不同的硬件平台–“这就是原因。”因为唯一的区别需要在/arch目录中……以及启动方式时间的“蹦床”代码。并非所有都必须是“特定于体系结构”的源代码……不是,而是系统假定存在语言编译器–通常(但不一定)是gcc

“ C”旨在成为直接支持“低级构造”的语言,并且其源代码可以预见地与它们关联。因此,Linux®开发人员当然,它们可以“非常接近金属”进行编码,而只有在必须时才调用特定于体系结构的(汇编语言)子例程。当时的先进概念。 Unix®之前的所有操作系统都是用汇编程序编写的。 “ C”编程语言最初被认为是用于编写Unix的工具。®

今天:“超酷语言'X'...是用...编写的”。