【问题标题】:Is Unix coded in C or C++ or both?Unix 是用 C 或 C++ 编码的,还是两者兼而有之?
【发布时间】:2010-03-07 03:01:44
【问题描述】:

Unix 中的许多系统调用使用重载和默认变量。 C中没有这个概念,所以Unix也是用C++编码的吧?

【问题讨论】:

  • 当您说“UNIX”时,您指的是哪个操作系统?如今,UNIX 是商标,而不是操作系统。 unix.org
  • 哪些系统调用被重载或有默认参数?
  • 带有重载/默认参数的系统调用是古怪的; ioctl() 让人想起这样的一个 - 它具有不标准化的额外优点。您可以争辩说“2-argument vs 3-argument open()”是一种重载/默认参数机制。其他一些更深奥的系统调用与这些略有相似。但“很多”让我觉得有些夸张。
  • ptrace() 是另一个奇怪的东西,但越少说越好......
  • ioctl()open() 使用可变参数,而不是函数重载。

标签: c++ c unix


【解决方案1】:

Unix 于 1969 年在贝尔实验室首次创建,远早于 C++ 的构思。 (源代码:Unix),您可以通过阅读Lions' Commentary on UnixBSD 4.4-Lite(类似于BSD Net/2)来确认这一点,tarball 或通过cvs(来自 FreeBSD)提供。或者来自The Unix Heritage Society 的档案,这些档案来自非常古老的贝尔实验室/AT&T 版本。

根据History of C++,Bjarne Stroustrup 大约在 1983 年创建了 C++,在此之前他从事“C with Classes”。由 Bjarne Stroustrup 的 FAQ 确认,C with Classes 的最早日期是 1979 年。

我希望澄清 Unix 基于 C++ 的想法的不可能性。请注意,面向对象的语言从 1960s in Simula 67 开始就已经存在,所以不要将对象和类与 C++ 混淆。

【讨论】:

  • 事实上,UNIX 是在 1969 年创建的,甚至 C 是在 1972 年被构思出来的。根据维基百科,最初的 UNIX 是用 PDP-11/20 汇编语言编写的,然后在 1973 年用 C 重写。
  • 是的,差不多。最初的 Unix 是用 PDP-7 汇编编写的(1968-9),在一个 8 千字的 PDP-7 上。当贝尔在 1970 年购买 PDP-11/20 时,Unix 被移植到 PDP-11 程序集上,后来 Unix 在 1973 年被用 C 重写,而仍在 PDP-11 上。来源:丹尼斯·里奇cm.bell-labs.com/cm/cs/who/dmr/chist.html
【解决方案2】:

几乎是直的 C 一路向下...

所有主要版本的 Unix 都使用完全直接的 C 作为内核。 (嗯,Mac OS X 在一个界面中包含一点 C++。)

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

现在,有了包裹,情况就不同了...

【讨论】:

  • 澄清一下,Mac OS X 中的 C++ 仅适用于设备驱动接口 IOKit。 Mach 和 BSD 层是直接的 C。
  • 我知道 IOKit,但不知道 C++ 是否在其他地方使用过。感谢您的来信;我稍微调整了措辞。
【解决方案3】:

当您谈论 Unix-y 操作系统(如 Linux、Solaris、Mac OS X、NetBSD、FreeBSD 等)的内核时,它们通常都是 C。我也不确定您所说的重载或默认是什么意思变量——当然不在内核调用中。

当 DigitalRoss 说 Mac OS X 在内核源代码中有 Objective C 时我很惊讶,所以我下载了 MacOS X 10.6.2 版本的 Darwin xnu 内核源代码,确实没有 Objective C。但是,有点震惊地发现了一点 C++。

无论如何,“用户空间”(非内核)程序所依赖的很多东西,例如虚拟内存、异常处理、设备 I/O 等等,都是由内核完成的。但是内核不能用自己来做这些事情,就像你不能用手拿起鞋子把自己举起来一样。

像 C++ 和 Objective C 这样的面向对象语言充分利用了内核无法为自己做的事情。这就是为什么内核大多是用 C 编写的。就我在 xnu 源代码中看到的那个 C++ 而言,我确信它是非常非常仔细地编写的,以避免在内核中做不安全的事情。

就用户空间程序是用 C 还是 C++ 编写的而言,我认为这主要是传统、个人偏好和人们习惯的。作为精通两种语言的人,我认为我自己很傻。

【讨论】:

    【解决方案4】:

    我不知道您指的是哪个系统调用,但我敢打赌,大多数 UNIX-ee 操作系统都是直接用 C 编码的。系统调用可能只有 C++ 包装器。

    【讨论】:

      【解决方案5】:

      绝对是 C - 试试 man syscallman -s2 read - 给你 C 库接口,看不到 C++。

      【讨论】:

        【解决方案6】:

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

        在 C++ 中还有一些其他的半实验系统。一个相当近的一个被命名为混合。 几年前在 comp.sources.misc (in four consecutive posts) 上发布了一个更老的帖子——我很确定这需要相当多的时间努力让它与当前的 C++ 编译器一起编译。这个在虚拟机上运行,​​并包含模拟硬件的源代码。

        【讨论】:

          【解决方案7】:

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

          【讨论】:

          • AFAIK C++ 在构建大量核心 UNIX 内核时还不存在,但即使忽略 C 具有 C++ 所缺乏的标准 ABI。这使得系统不同位之间的兼容性变得更加容易。并不是他们“不喜欢”C++,只是选择C有历史和技术原因。
          • 好吧,Linus Torvalds 不喜欢 C++,但这仅对一个(诚然非常重要的)系统很重要。我不知道有多少其他在 Unix 上进行不同级别开发的人不喜欢 C++。有些会,很多不会。
          • @David:虽然他最近似乎并没有做太多的开发,但 Eric S. Raymond 的观点似乎相当有影响力,他的许多谩骂中的一些已经(主要是生病-关于(假定的)C++ 中/使用问题的废话。 esr.ibiblio.org/?p=532
          • @Toji:C 并没有真正的标准 ABI。它具有最低要求,因此在任何给定硬件上为其设计 ABI 通常非常容易。一旦主要供应商设计了一个,大多数其他供应商通常会效仿。使用 C++,ABI 需要更多的工作,并为差异提供更多机会。
          • @Jerry:有道理。但是,实际结果仍然是互操作性要容易得多,所以无论它如何发生,我都支持它! :)
          猜你喜欢
          • 2011-10-16
          • 2016-09-22
          • 1970-01-01
          • 2014-07-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-17
          相关资源
          最近更新 更多