Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 您是否必须为新的操作系统构建新的编译器?_C_Linux_Compiler Construction_Operating System - Fatal编程技术网

C 您是否必须为新的操作系统构建新的编译器?

C 您是否必须为新的操作系统构建新的编译器?,c,linux,compiler-construction,operating-system,C,Linux,Compiler Construction,Operating System,我想在将来的某个时候构建一个操作系统,现在想一些关于它的简单草图。我几乎一直在为Windows环境(和一些小Java)编译C代码。如果我想在Linux下运行任何C程序,我都必须重新编译它。因此,二进制文件(编译的产物)对于每个操作系统都必须是不同的。如果出于爱好和学术目的,我从头开始设计一个全新的操作系统,而不使用Linux内核或任何已知的操作系统基本代码,我所理解的情况是,我无法使用GCC编译我的C程序,因为我的操作系统将不在其目标系统之列。在这里,我写在标题上的问题出现了。提前感谢您的提示。

我想在将来的某个时候构建一个操作系统,现在想一些关于它的简单草图。我几乎一直在为Windows环境(和一些小Java)编译C代码。如果我想在Linux下运行任何C程序,我都必须重新编译它。因此,二进制文件(编译的产物)对于每个操作系统都必须是不同的。如果出于爱好和学术目的,我从头开始设计一个全新的操作系统,而不使用Linux内核或任何已知的操作系统基本代码,我所理解的情况是,我无法使用GCC编译我的C程序,因为我的操作系统将不在其目标系统之列。在这里,我写在标题上的问题出现了。提前感谢您的提示。

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

我怀疑大部分工作将是移植C库


搜索显示此页面:

视情况而定。您可以很容易地选择重用现有的编译器,如远古时期的示例GCC,因此您将获得现有编译器的好处。但有一些重大的限制性条款必须澄清

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

由于内核下的任何程序(99%的操作系统)都需要一组函数来链接,因此移植C库是您最大的任务。C库是一个巨大的庞然大物,编写自己的库是相当愚蠢的,尤其是在最著名的GCC库中。所以,你真正应该问的问题是,你想写我自己版本的libc吗?(答案几乎总是否定的,大多数替代实现都是针对特定用例的。)另外,如果你想让你的OS POSIX兼容,那么你必须实现更多的功能,这增加了麻烦

与包含哪个C库相比,是否为操作系统编写自己的编译器只是一个小细节。您可以将自己的编译器与已经编写的C库实现一起使用

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

  • 与现有工具和工具链的兼容性
  • 熟悉的程序(用户无需学习如何使用新编译器)
  • 它们是开源的——尽管如此,你一个人去做是疯了。见鬼,即使是苹果公司也将两个已经存在的编译器——GCC和clang——集成到他们的工具链中,而不是自己完成,而且他们是一家价值数十亿美元的公司
  • 看一看。它演示了如何将GCC作为C库移植到操作系统。

    (1)不,您通常不必编写自己的编译器。编写一个好的优化编译器实际上是一项大任务,我最好避免

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

    • 一些(2.1)API仿真层(以便为其他操作系统编写和编译的代码可以在您的操作系统上运行)
    • 您必须(2.2)将一些现有编译器移植到您的操作系统
    • 至少使您的操作系统成为现有编译器中可用的新的(2.3)目标平台
    • 或者其他我不知道的选择
    选择多种多样,各有其优缺点

    一些例子(除了@dietrich epp、@sevenbits已经提到的明显的GCC)可以帮助您决定要采用哪种方式:

    (3.1)免费Pascal(请参阅)编译器可以使用其他目标平台进行扩展

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

    资料来源:

    (3.2)Inferno操作系统(请参阅)有自己的应用程序语言(请参阅),其中包含操作系统特定的单词、自己的编译器等。应用程序在虚拟机中运行(请参阅)

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

    资料来源:

    (3.3)Squeak(请参阅)是一个包含图形和所有内容的独立操作系统。它使用Smalltalk-80作为语言。包括编译器,在虚拟机中运行的应用程序(请参阅)。VM可以作为可移植的C代码发出,然后移植到裸骨硬件

    Squeak是一个现代的、开源的、功能齐全的实现