为什么用C?

为什么C用于编写驱动程序和操作系统代码?

有尺寸问题吗?

有没有用其他语言写的驱动程序?

XP,Vista和Solaris是用哪种语言编写的?

C编译为机器代码,不需要语言本身的任何运行时支持。 这意味着可以编写可以在文件系统,虚拟内存,进程以及除寄存器和RAM之外的任何其他内容之前运行的代码。

在安全关键环境中(想想航空电子设备,航天器,医疗设备,运输,过程控制的控制软件),系统(以及驱动程序)通常使用Ada甚至SPARK / Ada编写。

澄清一下:C通常被认为是相当低的水平,并且非常像assembly本身的“宏语言”,它也是它的力量来源(速度,大小,可移植性)。

另一方面,Ada专门针对具有可validation性的安全关键应用而设计,引用Ada 2005 for Mission-Critical Systems :

Ada [9]是许多关键系统的首选语言,因为它精心设计并且存在建立高完整性系统的明确指南[10]

这也是Ada对强类型的支持,以及其他一些重要function(引用安全设计 ):

编程语言在安全相关系统中的适用性方面存在很大差异。 Carré等人。 确定了影响语言是否适用于高完整性应用的六个因素[Carré1990]。 这些是:

  • 逻辑健全
  • 定义的复杂性
  • 表现力量
  • 安全
  • 可validation
  • 有限的时间和空间限制

没有标准编程语言在所有这些领域都表现良好,尽管有些(如Pascal和Ada)比C或C ++等语言表现更好。 在高度关键的应用程序中,“可validation性”非常重要。 某些语言允许使用function强大的软件validation工具对代码执行各种静态测试,以检测一系列编程错误。 […]选择编程语言的一个重要问题是可用编译器和其他工具的质量。 对于某些语言,可以使用经过validation的编译器。 虽然不能保证完美,但validation大大增加了我们对工具的信心。 遗憾的是,经过validation的编译器仅适用于有限数量的语言,例如Ada和Pascal。 除编译器外,关键系统的开发人员还将使用一系列其他工具,如静态代码分析包。 可以对一段代码执行的静态测试根据所使用的语言而有很大差异。 为了帮助这个过程,通常将某些语言中使用的function限制为该语言的“安全子集”。 结构良好且定义良好的语言(如Ada,Pascal和Modula-2的子集)允许执行大量测试,例如数据流分析,数据使用分析,信息流分析和范围检查。 不幸的是,许多这些测试无法在C和C ++等语言上执行。

更详细地讨论这个问题真的超出了本问题的范围,但您可能需要查看以下一些指针:

  • Ada与C和C ++相比
  • 阿达与C
  • 量化辩论:Ada与C ++
  • 为什么选择Ada作为教学语言? (Ada vs. C in University)
  • 比较C和Ada的开发成本 ( 摘要 )
  • C / C ++ / Java陷阱和Ada的好处
  • Ada是更好的C吗?
  • Ada,C,C ++和Java vs. The Steelman
  • 阿达:消除神话
  • Java和Ada中的实时编程安全性

如果有人想再看看Ada,请看看: Ada Programming(wikibooks)

甚至还有专为高度关键应用开发的编程语言,例如JOVIAL或HAL / S ,后者由航天飞机程序使用。

是否有任何其他语言的驱动程序?

我看到一些用于Ada编写的特殊硬件的Linux驱动程序,但不了解其他操作系统。 但是,此类驱动程序通常最终会包装C API。

“为什么我们使用C语言编写驱动程序和操作系统代码。?”

因此,程序员不必为每种新型机器学习每种新汇编语言的新语法。

“有没有用其他语言写的驱动程序?”

从历史上看,汇编语言。 我不记得PL / S或BLISS是否可以用于司机。 也许B.在现代,一些勇敢的人使用C ++,但他们必须非常小心。 在某些情况下,可以在用户模式驱动程序中更轻松地使用C ++。

因为C具有速度,低内存使用,低级别硬件访问和流行度的最佳组合。

大多数操作系统都有一个用C编写的内核,以及用C,C ++,C#或Obj-C编写的应用程序。

到目前为止,C是最简单的语言(除了程序集)在裸机硬件上“开始”。 使用C,(假设您有一个32位的引导加载程序,如GRUB来进行硬模式切换),你所要做的就是制作一个小的crt0.asm文件来设置堆栈,就是这样(你得到的语言,不包括libc) 。 使用C ++,您必须担心动态转换,exception,全局构造函数,覆盖新的等等。使用C#,您必须移植.Net运行时(它本身基本上需要内核)并且我不确定Obj-C ,但我确定它也有一些要求……

C是用于驱动程序的最简单的语言。 它不仅易于入门,而且很容易确切地知道机器级别发生了什么。 他们没有操作员超载来混淆你等等。 当然它在“好”环境中很方便,但在Ring 0中,坏指针不仅会使应用程序崩溃,而且通常会导致三重故障(重启),蓝屏或内核崩溃。 你真的很想知道机器上发生了什么……

Lisp机器的操作系统是用Lisp编写的,这表明你不必使用C语言或汇编语言。 Lisp机器业务被廉价PC的销毁所摧毁,其操作系统当然是用C语言和汇编语言编写的。

C是最适合编写操作系统的第一种语言(不是汇编语言)之一,因此它很早就流行起来。 虽然其他语言已经出现,因为它也适合编写操作系统,但C仍然很受欢迎,这可能源于其悠久的历史以及程序员对其结构和语法的熟悉程度。

C也是一种教授很多内存管理的语言,并且低级别足以显示硬件和软件之间的障碍。 这在当今的许多方法中是罕见的,在硬件层面上已经越来越多地采用抽象方式。 我发现C是学习这些东西的好方法,同时能够编写快速代码。

请记住,C最初是为编写操作系统(在本例中为Unix)和类似的低级内容而开发的。 它非常接近系统架构,不包含我们想要控制的任何额外function,它们是如何工作的。 但请注意,操作系统的其余部分(包括编程库)不必使用与内核相同的语言编写。 内核函数是通过中断系统提供的,实际上这样的编程库可以用支持汇编程序片段的任何语言编写。

目前最流行的操作系统是用C语言编写的:Windows,Linux和许多其他Unix克隆,但这不是规则。 有一些面向对象的操作系统,其中内核和编程接口都是用客观语言编写的,例如:

  • NeXTSTEP – Objective-C
  • BeOS – C ++
  • 音节 – C ++

请参阅: Wikipedia上面向对象的操作系统

请注意,在Linux中,可以使用C以外的语言编写内核驱动程序(但不建议这样做)。 无论如何,在运行它时,一切都变成了机器代码。

“C编译为机器代码,不需要语言本身的任何运行时支持。”

这是C的最佳function

我相信像Python,Java等语言很受欢迎主要是因为它们提供了广泛的标准库,允许程序员用更少的代码编写解决方案。 从字面上看,ruby程序员可以在一行中打开和读取文件,其中在C中它需要多行。 然而,在这种抽象之下是多行。 因此,在C中进行相同的抽象,建议使用它。 奇怪的是,C哲学似乎并不是为了减少代码总数,所以没有有组织的努力去做。 C似乎被视为所有处理器芯片的语言,自然这意味着很难创建任何“标准”抽象的一线解决方案。 但是C确实允许你使用#ifdef预处理器命令,所以理论上你可以在一个头文件中为多个处理器和平台提供多种实现变体。 这不是python或java的情况。 因此,虽然C没有花哨的标准库,但它对于可移植性很有用。 如果您的公司想要提供在计算机,嵌入式和便携式设备上运行的程序,那么C就是您的选择语言。 很难取代C在世界上的用处。

另外,对于具有其他语言驱动程序的计算机,还有SunSpot机器人平台。 连接设备的驱动程序(传感器,电机以及可通过I / O引脚通信的所有其他设备)由用户以Java编写。