什么类型的程序最好用C语言编写

时间:2009-01-12 15:51:14

标签: c

Joel和公司阐述了学习C的优点以及学习语言的最佳方式是如何使用它来实际编写程序。为此,哪种类型的应用程序最适合C编程语言?

编辑: 我正在寻找C擅长的东西。这可能与学习C的最佳方式不一致。

31 个答案:

答案 0 :(得分:45)

您需要绝对控制内存管理的代码。您需要完全控制速度与内存权衡的代码。非常低级别的文件操作(例如访问原始设备)。

示例包括操作系统内核和嵌入式应用程序。

在20世纪80年代后期,我担任C系统维护团队的负责人,该系统的代码超过一百万行。它做了数据库访问(Oracle),X Windows图形,进程间通信,各种好东西。它运行在VMS和几种Unix上。但是,如果我今天要重新创建该系统,我肯定不会使用C,我会使用Java。其他人可能会使用C#。

答案 1 :(得分:28)

低级功能,例如OS内核和驱动程序。对于那些人来说,C是无与伦比的。

答案 2 :(得分:20)

您可以使用C来编写任何内容。这是一种非常通用的语言。在这样做了一会儿后,你会明白为什么还有其他“更高级别”的语言可用。

“学习C”,无论如何,但不要坚持太长时间。其他语言的效率要高得多。

我认为那些说你需要学习C的人的要点是让你理解高级代码和机器内部之间的关系以及比特,字节,程序执行等都会发生的事情。

了解这一点,然后继续前进。

答案 3 :(得分:15)

这100行python代码占你执行时间的80%。

答案 4 :(得分:11)

没有用户界面的小型应用,尤其是在您尝试学习时。

编辑:在对此进行更多思考之后,我会添加以下内容:如果您已经了解更高级别的语言,并且您正在尝试了解有关C的更多信息,那么这是一条很好的路线可能不是创建一个全新的C应用程序,而是创建一个C DLL并向其添加可以从更高语言调用的函数。通过这种方式,您可以替换您的高级语言已经拥有的简单函数,以确保您的C函数能够执行它应有的功能(为您提供预先构建的测试),让您主要使用您熟悉的函数进行编码,在语言中使用你已经熟悉的问题,并教你互操作。

答案 5 :(得分:7)

  • 数字运算(例如,在Python等其他语言的更高级别使用的库)。
  • 嵌入式系统编程。

答案 6 :(得分:7)

很多人都在说OS内核和设备驱动程序当然是C的良好应用程序。但C对于编写需要使用硬件能力的每一点性能的任何性能关键应用程序也很有用。

我正在考虑数据库管理系统(mySQL,Oracle,SQL Server),Web服务器(apache,IIS)等应用程序,甚至我们的浏览器(看看chrome编写的方式)。

您可以在C中进行许多优化,这些优化在Java或.NET等虚拟机中运行的语言中是不可能的。例如,数据库和服务器支持许多同时用户,并且需要非常好地扩展。数据库可能需要在多个用户(线程/进程)之间共享数据结构,但这样做是为了有效地使用CPU缓存。在C中,您可以使用操作系统调用来确定缓存的大小,然后将数据结构适当地与缓存行对齐,以便当多个线程访问相邻但不相关的数据时,该行不会在缓存之间“ping” (所谓的“虚假分享”。这是一个例子。还有很多其他的例子。

答案 7 :(得分:6)

你想到使用装配的任何地方。

答案 8 :(得分:6)

引导加载程序。一些装配也需要,这实际上非常好..

答案 9 :(得分:5)

  1. 您认为需要100%控制您的计划。 在设备驱动程序等低层操作系统中经常出现这种情况, 或基于MCU的真实嵌入式设备:等等(所有这些和其他已经在上面提到过)

  2. 但请注意,C是一种已经存在多年的成熟语言 并将存在多年, 它有许多非常好的调试工具,而且还有大量使用它的开发人员。 (它可能已经失去了很多时髦的语言,但它仍然是巨大的) 所有的优点和缺点都是众所周知的,语言可能不会再改变。 所以没有太大的惊喜空间......

  3. 这也意味着如果您的应用程序具有较长的预期生命周期,那么它可能是一个不错的选择。

    /约翰

答案 10 :(得分:2)

垃圾收集者!

此外,只是主要工作是进行操作系统调用的程序。例如,我需要编写一个名为timeout的简短C程序

  • 将命令行作为参数,运行该命令的秒数
  • 分叉两个子进程,一个用于运行命令,另一个用于休眠N秒
  • 当第一个子进程退出时,杀死另一个进程,然后退出

效果将是运行一个限制挂钟时间的命令。

我和其他人在这个论坛上尝试过使用shell和/或perl的几种不同的解决方案。一切都很复杂,没有一个做得对。在C中,解决方案很简单,因为所有操作系统设施都在您可以使用的地方。

答案 11 :(得分:2)

任何你需要最少“神奇”的东西,并且需要计算机完全你告诉它的东西,不多也不少。任何你不相信垃圾收集的“魔力”来处理你的记忆的东西,因为它可能不如你手工编码的那么高效。任何你不相信内置数组,字符串等“神奇”的东西,不要浪费太多空间。您希望能够准确推断编译器将为给定代码段发出的ASM指令的任何内容。

换句话说,在现实世界中并没有太多。大多数事情都会从更高层次的抽象中获益,而不是从这种控制中获益。但是,操作系统代码,设备驱动程序以及一些必须在 空间和速度方面接近最佳状态的东西可能在C语言中有意义。更高级别的语言可以很好地与C竞争速度,但不一定是在太空中。

答案 12 :(得分:2)

嵌入式内容,内存使用和CPU速度很重要。
OS的中断处理程序部分(可能还有两到三个函数)。

即使你们中的一些人现在开始严重依赖我了: 我不认为任何体面的应用程序应该用C语言编写 - 这太容易出错了。 (是的,我确实知道我在说什么,在C中编写了大量代码(操作系统,编译器,虚拟机,网络协议,RT控制等)。

使用高级语言可以提高您的工作效率。通常通过记住10-90规则来获得速度:90%的CPU时间花费在10%的代码中(您应首先优化)。 此外,使用正确的算法可能比C中的优化位提供更多的性能。在C中做正确的事情要麻烦得多。

PS:我真的是指我在上面第二句中所写的内容;你可以用像Lisp或Smalltalk这样的高级语言编写一个完整的高性能操作系统,在C语言中只有几个小部分。想想70年代的Lisp机器如何在今天的硬件上飞行......

答案 13 :(得分:1)

数学和物理学研究。可能有两种选择:C和C ++,但后者的封装和继承的这些特性在那里并不是很有用。人们可能更喜欢使用C ++“作为更好的C”或者只使用C语言。

答案 14 :(得分:1)

示例包括:嵌入式应用程序,内核代码,驱动程序,原始套接字。

但是,如果您发现自己在C中的工作效率更高,那么请继续构建您想要的任何内容。使用该语言作为解决问题的工具。

答案 15 :(得分:1)

我能想到的几种:

  • 直接使用Unix / Linux或Win32系统调用的系统编程
  • 在其中没有太多字符串操作的性能关键代码(例如,数字运算)
  • 嵌入式编程或受资源严重限制的其他应用程序

基本上,C使您可以轻松,高效地访问机器的本机功能;其他一切都是你的责任。特别是,C语言中的字符串操作繁琐,容易出错,并且通常很讨厌;使用C进行大量字符串操作的最有效方法可能是使用它来实现更好地处理字符串的语言......

答案 16 :(得分:1)

c编译器

答案 17 :(得分:1)

大多数人都在建议与系统编程相关的东西,如操作系统内核,设备驱动程序等。这些都很困难且耗时。也许C最有趣的事情是控制台编程。你听说过HAM SDK吗?它是Nintendo GBA的完整软件开发工具包,为它制作游戏很有趣。还有CC65编译器支持NES编程(Althought Not Completely)。你也可以做出很好的模拟器。相信我,C非常有帮助。我最初是一个Python粉丝,并且讨厌C,因为它很复杂。但是在yuoget习惯之后,你可以用C做任何事情。现在我使用CPython将Python嵌入到我的C程序中(如果需要),代码主要用C语言编写。 C也非常适合移植性,每个操作系统和几乎每个控制台和移动设备都有一个C编译器。我甚至看过一个支持一些计算器的人!

答案 18 :(得分:1)

你的问题隐含的假设是像Python或Perl(或Java或......)这样的“高级”语言足够快,足够小,......足以满足大多数应用程序的要求。对于大多数应用程序和一些语言选择X当然是这样。鉴于此,您选择的语言几乎肯定具有外部函数接口(FFI)。由于您正在寻找学习 C,因此请在内置于C的FFI中创建一个模块。

例如,假设您选择的工具是Python。在C中重新实现Numpy的子集。由于C是一种非常快速的语言,并且在C99中具有清晰的数字库接口,您将有机会在适当的设置中体验C的强大功能。 / p>

答案 19 :(得分:0)

继续别人说的话。 C似乎是一种很好的语言,可以实现编写其余软件的语言。

并且(经过必要的修改)运行其余软件的虚拟机。

答案 20 :(得分:0)

我会说,在微小的运行时环境中,它是独立的,你可以先创建一些CLI实用程序,如grep或tail(或Unix中的一半命令)。任何只使用STDOUT,STDIN和文件操作的东西都是一个很好的选择。

这并不能完全回答你的问题,因为我不会选择在这样的应用程序中使用C,但我希望它能回答你想要问的问题 - “使用什么类型的应用程序是好的学习C?“

C实际上并不是一种糟糕的语言 - 很容易理解你的汇编语言级别的代码非常有用,并且语言结构很少,留下了非常稀疏的语言。

要回答您的实际问题,C的最佳用途就是创建它 - 将自身(和UNIX)移植到其他CPU架构。这很好地解释了语言功能的缺失;它还解释了Pointers的存在,它实际上只是一个使编译器工作量减少的构造 - 用指针创建的任何代码都可以在没有它的情况下创建(只是进行了优化),但是创建编译器变得更加困难

答案 21 :(得分:0)

数字信号处理,所有纯数据扩展都是用C语言编写的,这也可以用其他语言完成,但在C中取得了很好的成功

答案 22 :(得分:0)

好吧,如果你想学习C并同时享受一些乐趣,我可以建议你获得NXC和Lego Mindstorms套装吗? NXC是Lego Mindstorms的C编译器。

这种方法的另一个优点是你可以比较使用C编程Mindstorms“brick”的工作量,然后尝试LEJOS,看看它是如何与Java一起使用的。

非常有趣。

答案 23 :(得分:0)

我更喜欢C代码解析,代码生成 - 任何不需要大量数据结构的东西(读取OOP)。它的库占用空间很小,因为类库不存在。我意识到我在这方面很不寻常,但正如许多事情被认为是“有害的”一样,我试图拥有/使用尽可能少的数据结构。

答案 24 :(得分:0)

任何底层库完全在C中的地方都是留在C - openGL,Lua扩展,PHP扩展,老派windows.h等的好地方。

答案 25 :(得分:0)

我想知道为什么没有人说明显的:

Web应用程序。

答案 26 :(得分:0)

Photoshop插件过滤器。你可以使用很多很多有趣的图形操作,你需要纯C才能完成它。

例如,它是分形生成,傅里叶变换,模糊算法等的门户。真的可以操纵图像/颜色数据并给出有趣结果的任何东西

答案 27 :(得分:0)

在实际编写C代码之前,我建议先阅读好的C代码 选择你想要专注的主题,基本上任何应用程序都可以用C语言编写,但我认为GUI应用程序不是你的第一选择,并找到一些开源项目来研究。

没有任何开源项目是最好的代码。我假设在您选择一个主题之后还有另一个问题的地方,请求该领域的最佳开源项目 玩它,了解它是如何工作修改一些功能...
最好的学习方法是向好人学习。

答案 28 :(得分:0)

Internet Information Server的ISAPI筛选器。

答案 29 :(得分:0)

不要将C视为强化的汇编程序。当它是自然语言时,我已经完成了一些严肃的应用程序(例如,目标机器是带有X11的Solaris机箱)。

用一些肉写一些东西。编写客户端服务器国际象棋程序,其中AI在服务器上,UI在X11中显示;一旦你完成了,你就会真正了解C。

答案 30 :(得分:-2)

简短的回答是 none 。稍微长一点的答案就是你有一个系统的编程任务,并且无法访问任何编译器以获得更好的语言。

对于系统的编程任务,使用像Ada这样功能强大但更安全且不易出错的东西会更好。对于通用的OO编程,C ++,Java和Ada等语言也是更好的选择。对于许多特定任务,如字符串操作或网站生成,有一些特定于域的语言可以使您的工作更轻松。