【问题标题】:How is C cross platform?C如何跨平台?
【发布时间】:2019-06-16 20:44:24
【问题描述】:

C 语言最终被编译成机器特定的汇编语言。那么,如果每个处理器都有自己的汇编语言语法,C 怎么可能是跨平台的呢?如果我用 C 语言编写一个操作系统内核,那么我怎样才能让它在各种处理器上运行呢?

【问题讨论】:

  • 通过为不同的处理器/平台编译 C 代码。您可以使用相同的 C 代码并为 x86、ARM 等编译它。当然,一个特定的编译二进制文件不会神奇地在不同的架构上运行,但这不是“跨平台”的意思。
  • 您希望操作系统内核如何在不同的处理器上运行? 因为操作系统的核心组件需要不同的处理器。
  • 我认为“可移植”一词与 C 本身一起使用的比“跨平台”更多,这意味着您可以将 C 源重新编译/移植到其他平台。然后有 C 的跨平台库,这意味着他们处理平台细节(通常以#ifdef ...方式,包括替换功能/API的平台特定部分)以使库API在所有平台上都相同,但仍然是针对特定目标进行编译的步骤必须存在(某些平台允许“胖”二进制文件包含用于不同架构的多个可执行文件,但这些就像不同的构建连接
  • 对于操作系统内核,情况更具体,因为操作系统内核的机器代码很大程度上取决于平台细节,所以可以肯定的是,只有内核的通用部分是用纯 C 编写的,而且很可能有一些一小块平台特定的程序集支持内核,具有上下文切换、内存单元管理等专门任务……这完全是特定于平台的。
  • 所有 C 代码都不可移植。如果您编写操作系统,与特定 CPU 通信的最低级别的硬件是不可移植的。只有它上面的抽象层。驱动程序等也是如此。

标签: c assembly operating-system cross-platform


【解决方案1】:

C 语言本身是跨平台的,因为您不直接在机器上运行 C 代码。 C 源代码被编译为汇编,而 assembly 是平台特定的代码。唯一的非跨平台部分是编译器和生成的程序集。

本质上,您可以使用相同的 C 代码和不同的编译器来创建所需的特定程序集。由于您使用相同的 C 源代码,因此它被认为是跨平台的。

【讨论】:

    【解决方案2】:

    C 在源代码级别是可移植的。这意味着您可以在选择的平台上重新编译您的程序并让您的应用程序在那里运行。

    例如,您可以找到history of C in the wikipedia。那时,每台特定机器的编程都是用汇编语言进行的,因此拥有高级(到那时)编程语言是一件幸事:它加快了开发速度,也使得将程序从一台机器移植到新机器成为可能只需移植编译器(C 编译器以后可以用 C 本身编写,再次加快移植过程,但这是另一回事)。

    具体来说,在操作系统之间移植 UNIX 的想法是在 PDP-7 中运行 UNIX 时出现的,而 PDP-11 出现了。最后,甚至 UNIX 的内核也是用 C 重写的,所以它使操作系统非常受欢迎,因为它很容易移植:只需要为内核的非常特定的部分编写少量的程序集,这样你就可以启动 UNIX并很快在新机器上运行,至少与当时的其他操作系统相比。

    【讨论】:

      猜你喜欢
      • 2011-04-14
      • 1970-01-01
      • 2011-07-11
      • 1970-01-01
      • 2014-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多