Unix是用C语言还是C++语言编写的?

6
许多Unix系统调用使用重载和默认变量。这个概念在C语言中不存在,所以Unix也是用C++编写的,对吗?

6
当你提到“UNIX”时,你指的是哪个操作系统?如今,“UNIX”是一个商标,而不是一个操作系统。http://www.unix.org/ - Mikael S
14
哪些系统调用被重载或具有默认参数? - Johannes Schaub - litb
1
系统调用中带有过载/默认参数的是奇怪的; ioctl() 就是其中之一 - 它还有一个额外的优点,就是没有标准化。你可以认为“2个参数 vs 3个参数的open()”是一种重载/默认参数机制。其他一些更深奥的系统调用也略微类似于这些。但是,“很多”让我感到有些夸张。 - Jonathan Leffler
ptrace()是另一个奇怪的函数,但越少谈论它越好... - caf
6
ioctl()open() 使用可变参数而非函数重载。 - bk1e
7个回答

16
Unix最早于1969年在贝尔实验室创建,早于C++的构思。(参考文献:Unix) 你可以通过阅读Lions' Commentary on Unix或类似于BSD Net/2BSD 4.4-Lite(可通过tarball或从FreeBSD获取cvs)来确认这一点。或者从The Unix Heritage Society的档案中查看来自贝尔实验室/ AT&T版本的旧版本。

Bjarne Stroustrup大约在1983年创建了C++,此前他曾参与开发了 "C++的历史"中提到的"C with Classes"。根据Bjarne Stroustrup的FAQ,最早的"C with Classes"可以追溯到1979年。

希望这能澄清一个不可能的想法,即Unix是基于C++构建的。请注意,自1960年代Simula 67以来,面向对象编程语言就已经存在了,因此不要将对象和类与C++混淆。


2
事实上,UNIX是在C语言诞生之前(1972年)创建的(1969年)。根据维基百科的说法,最初的UNIX是用PDP-11/20汇编语言编写的,然后在1973年改用C语言重写。 - el.pescado - нет войне
4
几乎正确。最初的Unix是在一台8千字节的PDP-7计算机上用PDP-7汇编语言编写的(1968-9年)。当Bell公司在1970年购买了PDP-11/20后,Unix被移植到了PDP-11汇编语言上。后来,在PDP-11上的Unix于1973年被重写为C语言。资料来源:丹尼斯·里奇 http://cm.bell-labs.com/cm/cs/who/dmr/chist.html - mctylr

12

从头到尾都是纯C...

所有主流的Unix版本在内核方面完全采用了纯C。(嗯,Mac OS X 在一个接口中有一点 C++。)

如果不计算桌面层,那么除了极少数例外,核心库和实用程序也是用C编写的。我能想到唯一使用C ++编写的核心实用程序是groff

但是,在软件包方面,情况就不同了...


2
澄清一下,在Mac OS X中的C++仅用于IOKit,即设备驱动程序接口。Mach和BSD层是纯C语言。 - gavinb
我知道IOKit,但不知道其他地方是否使用C++。感谢提醒,我稍微调整了措辞。 - DigitalRoss

5
当你谈论类Unix操作系统的内核,如Linux、Solaris、Mac OS X、NetBSD、FreeBSD等,它们通常都是C语言编写的。同时,我也不确定您所说的过载或默认变量的含义 - 当然不适用于内核调用。
当DigitalRoss提到Mac OS X在内核源代码中使用Objective C时,我感到惊讶,因此我下载了Darwin xnu内核源码的MacOS X 10.6.2版本,实际上,并没有Objective C。然而,我还是有些震惊地发现了一些C++代码。
无论如何,“用户空间”(非内核)程序所依赖的许多内容,如虚拟内存、异常处理、设备I/O等,都是由内核完成的。但是内核不能使用自己来完成这些任务,就像您不能通过用手拿鞋子抬起自己一样。
面向对象的语言,如C++和Objective C,广泛使用内核无法为自己完成的东西。这就是为什么内核大多数都是用C语言编写的原因。至于我在xnu源代码中看到的那个C++代码,我确信它被非常小心地编写,以避免在内核中执行不安全的操作。
至于用户空间程序是用C还是C++编写,我认为这主要取决于传统、个人偏好和人们的习惯。作为一名精通两种语言的人,我认为这很愚蠢。

3

我不知道你指的是哪些系统调用,但我敢打赌大多数类Unix操作系统都是用纯C编写的。可能只有对于系统调用使用了C++包装。


1

绝对是C语言 - 尝试使用man syscallman -s2 read命令 - 这将为您提供C库接口,没有C++的影子。


1
有一些操作系统内核是用C++编写的。我相信Chorus内核(举个例子)几乎完全是用C++编写的(它有点像Mach:一个微内核,几乎完全通过作为用户模式服务器运行的UNIX模拟器使用)。

还有一些其他的半实验性C++系统。其中一个相对较新的是名为Hybrid的系统。更早的一个系统发布在comp.sources.misc上( 四个 连续的 帖子中)多年前 - 我非常确定需要大量工作才能使其与当前的C++编译器编译。这个系统运行在虚拟机上,并包括模拟硬件的源代码。


0

UNIX系统通常使用纯C编写,出于某种原因,大多数UNIX开发人员似乎也不喜欢C++。


3
据我所知,在构建大部分核心UNIX内核时,C++尚未出现,但即使忽略这一点,C具有标准ABI,而C++则没有。这使得系统中不同部分之间的兼容性更容易实现。并不是说他们"不喜欢"C++,只是在选择C时有历史和技术原因。 - Toji
Linus Torvalds不喜欢C++,但这只对一个(诚然非常重要的)系统有影响。我不知道有多少其他在Unix上开发各种级别的人不喜欢C++。有些人不喜欢,但也有很多人喜欢。 - David Thornley
@David:虽然他最近似乎没有进行过太多的开发工作,但Eric S. Raymond的观点似乎相当有影响力,他的许多长篇大论中有一些(大多数是无知的胡言乱语)关于C++中(所谓的)问题。http://esr.ibiblio.org/?p=532 - Jerry Coffin
1
@Toji:C语言实际上没有标准ABI。它只有最低要求,因此在任何给定的硬件上为其设计ABI通常相当容易。一旦主要供应商设计了一个ABI,大多数其他供应商通常会跟随它。而对于C++来说,ABI需要更多的工作,并且存在更多的差异机会。 - Jerry Coffin
@Jerry:说得有道理。实际结果是互操作性变得更加容易了,所以无论它是如何发生的,我都支持它! :) - Toji

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