我是C#程序员,我的大部分开发工作都是针对网站以及一些Windows应用程序。就C而言,由于没有必要,我已经很长时间没有使用它了。当我的一个朋友说她在学习C#时需要学习C来测试工作时,我感到惊讶。
我认为,只有有人用C进行开发,才会有人学习C进行测试。据我所知,所有与COM和硬件设计有关的开发也都用C ++进行。因此,如果您需要使用C ++,则学习C毫无意义。我也不相信历史意义,那么为什么要花时间和金钱来学习C?
C仍用于任何新软件开发或其他任何形式吗?
我是C#程序员,我的大部分开发工作都是针对网站以及一些Windows应用程序。就C而言,由于没有必要,我已经很长时间没有使用它了。当我的一个朋友说她在学习C#时需要学习C来测试工作时,我感到惊讶。
我认为,只有有人用C进行开发,才会有人学习C进行测试。据我所知,所有与COM和硬件设计有关的开发也都用C ++进行。因此,如果您需要使用C ++,则学习C毫无意义。我也不相信历史意义,那么为什么要花时间和金钱来学习C?
C仍用于任何新软件开发或其他任何形式吗?
Answers:
C的优点是它是一种相对较小的语言,这使得实现C编译器变得容易(而C ++编译器是编写的怪物),并且使学习该语言更加容易。另请参见TIOBE索引,根据该索引,C稍早于C ++。
在(IMO)的递减排序顺序中,C仍然用于
嵌入式的东西
将C编译器移植到小型平台比移植C ++编译器要容易得多。同样,C的拥护者声称C ++“在背后有太多的作为”。但是,IMO就是FUD。
系统编程
同样,这通常是由于声称“知道编译器在做什么”更容易。但是,许多嵌入式程序将受益于例如模板和其他C ++关键功能。
开源软件不过,
这主要是一个态度问题:OSS始终偏爱C而不是C ++(而在大多数行业中,情况恰恰相反)。实际上,在Linux上, Torvalds的非理性仇恨可能是最重要的原因。
std::vector
还是std::map
a,但是您不必自己实现它,而是可以依靠经过良好测试的高性能,提供高抽象度的可靠库实现。
C在资源稀缺的嵌入式硬件编程中经常使用。
Linux内核是用C编写的,因为根据Linus Torvalds的说法,C ++是一种可怕的语言。
我见过的所有现代语言都可能与C交互:
与C交互的需要源自:
这意味着由于这些语言可以与C通信,因此它们可以:
而且我敢打赌,他们所有人都依赖C来运行(除非他们进行了完全汇编?这是可疑的)。
C是编程语言的Lingua Franca,并且是不依赖于特定体系结构(例如汇编语言)的最简单的语言(在ABI方面),要摆脱它,将需要进行重大的改变。
在我看来,这是一个非常短视的问题,类似于“我和我的朋友都在听雷鬼音乐。有人真的还在听Rap吗?”。
每种语言都有其用途。不同的语言肯定有其利基。但是问C!我确信每天使用C#的人数要少于C(从在没有人使用C#的商店工作的完全偏见的角度来看)。
快速谷歌看语言的相对流行。
我确信这都不是权威,但是我们可以用它来观察趋势:
http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html
http://langpop.com/
甚至在标签上查看问题的比率:https:
//stackoverflow.com/tags
因此,C是SO上18个最受欢迎的话题(那里还有很多其他语言)。
注意:上面的TIOBE索引已经进行了十多年的不断更新(并且有一些数据可以追溯到三十年前),用于衡量使用每种语言工作的工程师(尽管我不知道它的准确性如何)。在Java / Visual Basic之外的前10种语言中,它反映了我商店里的人们所知道的(尽管由于样本量小得多,所以我们的比率会略有不同)。
I am sure none of this is authoritative but we can use it to see trends
但是我不同意你的第二句话;C不再是高等学校教授的主要语言(如果那样的话,那么新一批的毕业生就不会那么没用了)。如今,人们倾向于学习Java / C#。此外,Tiobe报告是关于作业而非查询的。
当您的资源不足并且不需要面向对象的功能时,可能需要使用C。
当今使用的许多软件仍然是用C编写的,更不用说硬件驱动程序了。
根据Tiobe索引,C仍然是最常用的语言。
正如tcrosley所建议的那样,您可能想看看这个相关的问题。
听起来您好像在试图使自己相信C是无用的,因此可以忽略。让我们分解您的问题:
“我认为只有在C语言中完成开发工作的人才能学习C语言进行测试。”
不,有许多学习C的理由。即使您不知道我仍会避免使用类似的笼统语句,尤其是与循环逻辑结合使用。显然,人们需要知道代码的编写语言,以便能够正确地测试/修复它,但前提是该语言仍然作为给定语言使用,并且对任何语言都适用,而不仅仅是C。
“据我所知,与COM和硬件设计有关的所有开发也都用C ++完成。”
那是不对的。
“因此,如果您需要使用C ++,那么学习C毫无意义。我也不相信历史意义,那么为什么要在学习C上浪费时间和金钱呢?”
这是最可疑的逻辑。首先,历史意义是您应该相信的东西,因为如果您这样做了,您就会知道C是C ++的子集,因此,了解C可以帮助您成为更好的C ++程序员。当然,C对后来出现的大多数语言也有影响,因此好处不止于此。此外,由于C非常重要,因此不能认为C仅具有历史意义。它仍然被广泛使用,因此不能降级为次要位置。您可以辩称这不是每个程序员都需要使用的语言,并且不是一种全面的知识,这是正确的,但是请不要在说您不相信某些东西而不首先检查其真正优点的情况下建立您的论点。
除了嵌入式系统之外,大多数较新的语言都具有某种与C交互的方式。当编写一个想要轻松使用所有这些语言的库时,C是一个显而易见的选择。C ++虽然还可以与某些语言(例如Python(仅适用于CPython)进行接口),但由于C ++的某些功能(尤其是名称修改,但模板无济于事),它无法与多种语言进行接口。C ABI是最简单的接口之一(我知道您可以编写C ++并在接口中使用extern“ C”。我不在乎)。
它还具有C和C ++实际上是系统编程的最佳语言的好处,并且C编译时间要快得多。C ++编译时间显然是我使用过的所有语言中最差的。
现在,尽管有其他语言想要成为流行的系统语言(尤其是D),但绝大多数软件都是用C / C ++编写的。像D这样的语言需要有人在C库周围创建包装器,而不是直接使用它(就像从C ++中那样)。
extern(C)
D 编写,而用C ++编写extern "C"
请访问langpop.com,尤其是Freshmeat和Google Code中的图表。它表明C仍然遥遥领先。
C在仍然需要接近金属(即嵌入式系统)和性能要求高的应用程序的系统上仍然很流行。
我几乎每天都在为iPad / iPhone开发它。许多库都是用C编写的,没有等效的Objective-C。因此,是的,它仍在使用,并且被市场上最新的设备之一使用。
使用C,您可以对许多嵌入式系统进行编程,而且体积小巧,方便,并且可能存在很多年(也就是说,您既不会浪费时间,也不会花时间学习它)
好吧,我认为C是最强大的语言,原因如下:
1)在第一个C处,这是一种系统语言(这意味着它可用于以最少的运行时间或没有运行时间来进行低级编程)。
2)生成的应用程序的速度。由于C语言源代码集相对较小且非常有效,因此C语言源代码可以比高级语言进行更多优化。它几乎可以使用汇编语言进行编程,而无需使用汇编语言进行编程。您甚至可以一起使用Assembly和C!
3)C在固件编程(硬件)中具有其应用。这是由于它具有使用/与装配一起使用以及与装配,控制器和其他设备直接通信的能力。
4)C是许多其他当前已知语言的基础。查看C的历史,您会发现它已经存在了一段时间(无论如何,编程语言还是如此)。以Python为例,例如一种完全面向对象的高级编程语言。它是用C语言编写的(也许也是C ++)。它告诉您是否曾经想知道其他语言的内幕。理解C及其工作原理至关重要。
应用程序语言用于高级编程,例如,编写文字处理器或游戏。应用程序语言的示例是Java,C#。原因是因为它们包含垃圾回收,自动键入,运行时验证等,而重点是生产力。
系统语言用于低级编程。例如,微控制器,驱动程序和OS内核。示例包括汇编C。它们只需要很少的运行时间或不需要运行时间即可直接在硬件上运行代码,并且重点是程序员可以直接控制硬件。
总体而言,它作为一种应用程序语言正在下降,但作为一种系统语言仍然保持着强大的地位。
哦,是的,它被使用了。我从事网络数据包处理领域。我去过两家处理网络数据包的公司。因此,我们在以太网或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的计算转移。因此,将自定义语言编译为C(或者实际上是C的gcc变体,它支持计算的goto),然后C编译器生成了程序集。
我仍然每天都使用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和dtors(我是作为实现了整个C ++标准库的人说的)。如果仅很难生长的阵列很难很好地实现,那么可以想象实现生产质量的BVH所需的工作。
当我想使用现有的数据结构或通过使用现有的数据结构实现更高级别的数据结构时,我更喜欢C ++ ,但是如果我要在没有用的引擎核心处实现低级数据结构,使用现有的数据结构,C绝对可以通过它的超级简单类型系统轻松地完成工作,该系统使您可以memcpy
在这里和在这里的memmove
事物,malloc
一个连续的块以及realloc
在那里,而不必担心构造函数,析构函数和异常的抛出。