C语言 你必须为一个新的操作系统构建一个新的编译器吗?< / h1 >



我想在未来的某个时候构建一个操作系统,现在正在考虑一些简单的草图。我一直在用Windows环境下的C语言编写代码(还有一些Java语言)。如果我想在Linux下运行,我必须重新编译我的任何C程序。因此,对于每个操作系统,编译后的二进制文件必须是不同的。如果我从零开始设计一个全新的操作系统,出于爱好和学术目的,不使用Linux内核或任何已知的操作系统基础代码,我所理解的是,我无法用GCC编译我的C程序,因为我的操作系统将不在它的目标系统之列。在这里我的问题写在标题。提前感谢你的提示。

看情况。您可以轻松地选择重用现有的编译器,例如古老的示例GCC,因此您将获得现有编译器的好处。但是有一些大的附带条件必须澄清。

不管你是否选择构建一个新的编译器,挑战仍然是移植一个C库。从技术上讲,您可以在没有标准库的情况下使用C(例如,Linux内核或任何自托管示例必须这样做),但是对于打算在操作系统下运行的程序来说,这是一个荒谬的主张,因为大多数系统都有内存限制等,这意味着您不能在使用内存方面拥有自由。因此,需要调用C库,如malloc

由于内核下的任何程序(很可能99%的操作系统)都需要一组函数来链接,因此移植C库是您最大的任务。C库是一个巨大的单体,编写自己的库是相当愚蠢的,特别是在已有许多实现的情况下,最著名的是GCC。所以,你真正应该问的问题是,你想写我自己版本的libc吗?(答案几乎总是否定的,而且大多数替代实现都是针对小众用例的。)另外,如果你想让你的操作系统兼容posix,那么你将不得不实现更多的函数,这增加了麻烦。

你是否为你的操作系统编写自己的编译器是一个次要的细节,相比之下,哪个C库将包含在它。您总是可以使用自己的编译器和已经编写的C库实现。

我对你这个基于观点的问题的建议是:no。移植一个现有的编译器,如GCC或clang,然后使用它。另外,这有几个优点:

  1. 与现有工具和工具链的兼容性
  2. 一个熟悉的程序(不需要你的用户学习如何使用新的编译器)
  3. 它们是开源的——尽管如此,你一个人去做是疯了。见鬼,即使是苹果公司也把两个已经存在的编译器——GCC和clang——集成到他们的工具链中,而不是自己做,他们是一个数十亿美元的公司。

看一下这页。它演示了如何使用Newlib作为您的C库将GCC移植到您的操作系统。

(1)不,你通常不需要编写自己的编译器。写一个好的优化编译器实际上可能是一个很大的任务,我最好避免。

但是为了能够为你的操作系统编写一些高级语言的应用程序,你要么需要提供

  • some(2.1) API仿真层(以便为其他操作系统编写和编译的代码可以在您的操作系统上运行)
  • 你必须移植一些现有的编译器 (2.2)到你的操作系统
  • 至少使您的操作系统成为一个新的可用的(2.3)目标平台在现有的编译器
  • 或者其他我不知道的选项

选择有很多,每个都有自己的优缺点。

一些示例(除了@dietrich-epp, @sevenbits已经提到的明显的GCC)可以帮助您决定要遵循哪种方式:

(3.1) Free Pascal(见http://www.freepascal.org)编译器可以扩展到另一个目标平台

Free Pascal是一个32位,64位和16位的专业Pascal编译器。它可以针对多种处理器架构:Intel x86、AMD64/x86-64、PowerPC、PowerPC64、SPARC和ARM。支持的操作系统包括Linux、FreeBSD、Haiku、Mac OS X/iOS/Darwin、DOS、Win32、Win64、WinCE、OS/2、MorphOS、Nintendo GBA、Nintendo DS和Nintendo Wii。此外,开发版本中还提供JVM、MIPS(大端和小端变体)、i8086和Motorola 68k体系结构目标…

<子>来源:http://www.freepascal.org

(3.2) Inferno Operating System(参见http://www.vitanuova.com/inferno)有自己的应用语言(参见Limbo),带有操作系统特定的单词,自己的编译器等。应用程序在虚拟机中运行(参见Dis)

Inferno®是一个紧凑的操作系统,设计用于在各种设备和平台上构建分布式和网络化系统。与许多先进的和独特的功能,地狱把一套无与伦比的工具到您的手中…Inferno可以作为用户应用程序运行在现有的操作系统之上,也可以作为一个独立的操作系统…

<子>来源:http://www.vitanuova.com/inferno

(3.3) Squeak(参见http://en.wikipedia.org/wiki/Squeak)是一个独立的操作系统,具有图形和其他功能。它使用Smalltalk-80作为语言。包含编译器,应用程序在虚拟机中运行(参见Cog VM)。VM可以作为可移植的C代码发布,然后移植到裸机硬件。

Squeak是一个现代的、开源的、全功能的Smalltalk编程语言和环境的实现。Squeak是高度可移植的,几乎可以在任何平台上运行,你可以真正地写一次,在任何地方运行。Squeak是一个广泛项目的载体,从多媒体应用程序和教育平台到商业web应用程序开发…

<子>来源:http://www.squeak.org

(3.4) MenuetOS(参见http://www.menuetos.net/)是用汇编语言编写的64位操作系统。Flat Assembler(参见FASM)编译器,它可以发出本地二进制文件,被移植到包含OS API的操作系统上,并包含在基本安装中。后来C库也被移植了

MenuetOS是一个正在开发的PC操作系统,完全用32/64位汇编语言编写…支持32/64位x86汇编编程,用于更小,更快,更少资源消耗的应用程序…Menuet既不基于其他操作系统,也不植根于UNIX或POSIX标准。自2000年第一次发布以来,其设计目标一直是消除操作系统不同部分之间的额外层,这些层通常会使编程复杂化并产生错误…

<子>来源:http://www.menuetos.net

(3.5) Google的Android OS(参见Wikipedia: Android(操作系统))移植了Java虚拟机(参见Dalvik后来被Android Runtime取代),并为Java编程语言提供了操作系统api,重用现有的编译器和ide,只是使用生成的二进制文件

Android Runtime (ART)是Android移动操作系统使用的一个应用程序运行时环境。ART取代了Dalvik,这是Android最初使用的进程虚拟机,并将应用程序的字节码转换为本机指令,稍后由设备的运行时环境执行…

<子>来源:http://en.wikipedia.org/wiki/Android_Runtime

还有很多有用的例子。您是否必须这样做基本上取决于您的新操作系统将引入的编程范例。你为什么要构建它,它与现有的有什么不同。

no示例(3.1), (3.4), (3.5)yes示例(3.2), (3.3)

不,您可以直接移植现有的编译器。您甚至可以选择现有的可执行格式,例如ELF,并使用标准的GCC + GNU Binutils工具链。您将需要移植标准库和C运行时,并且您将需要在您的操作系统中编写一个ELF加载器。

我猜想大部分的工作将是移植C库。

搜索出现了这个页面:将GCC移植到您的操作系统

相关内容

最新更新