C 您是否必须为新的操作系统构建新的编译器?
我想在将来的某个时候构建一个操作系统,现在想一些关于它的简单草图。我几乎一直在为Windows环境(和一些小Java)编译C代码。如果我想在Linux下运行任何C程序,我都必须重新编译它。因此,二进制文件(编译的产物)对于每个操作系统都必须是不同的。如果出于爱好和学术目的,我从头开始设计一个全新的操作系统,而不使用Linux内核或任何已知的操作系统基本代码,我所理解的情况是,我无法使用GCC编译我的C程序,因为我的操作系统将不在其目标系统之列。在这里,我写在标题上的问题出现了。提前感谢您的提示。不,您可以只移植现有的编译器。您甚至可以选择现有的可执行格式,如ELF,并使用标准的GCC+GNUBINUTILS工具链。您需要移植标准库和C运行时,并且需要在操作系统中编写ELF加载程序 我怀疑大部分工作将是移植C库C 您是否必须为新的操作系统构建新的编译器?,c,linux,compiler-construction,operating-system,C,Linux,Compiler Construction,Operating System,我想在将来的某个时候构建一个操作系统,现在想一些关于它的简单草图。我几乎一直在为Windows环境(和一些小Java)编译C代码。如果我想在Linux下运行任何C程序,我都必须重新编译它。因此,二进制文件(编译的产物)对于每个操作系统都必须是不同的。如果出于爱好和学术目的,我从头开始设计一个全新的操作系统,而不使用Linux内核或任何已知的操作系统基本代码,我所理解的情况是,我无法使用GCC编译我的C程序,因为我的操作系统将不在其目标系统之列。在这里,我写在标题上的问题出现了。提前感谢您的提示。
搜索显示此页面:视情况而定。您可以很容易地选择重用现有的编译器,如远古时期的示例GCC,因此您将获得现有编译器的好处。但有一些重大的限制性条款必须澄清 至于您是否选择构建一个新的编译器,挑战仍然在于移植一个C库。从技术上讲,您可以在没有标准库的情况下使用C(例如,Linux内核或任何自托管示例都必须这样做),但对于打算在操作系统下运行的程序来说,这是一个荒谬的命题,因为大多数系统都会施加内存限制等,这意味着你不能在使用记忆方面全权负责。因此,需要C库调用,例如
malloc
由于内核下的任何程序(99%的操作系统)都需要一组函数来链接,因此移植C库是您最大的任务。C库是一个巨大的庞然大物,编写自己的库是相当愚蠢的,尤其是在最著名的GCC库中。所以,你真正应该问的问题是,你想写我自己版本的libc吗?(答案几乎总是否定的,大多数替代实现都是针对特定用例的。)另外,如果你想让你的OS POSIX兼容,那么你必须实现更多的功能,这增加了麻烦
与包含哪个C库相比,是否为操作系统编写自己的编译器只是一个小细节。您可以将自己的编译器与已经编写的C库实现一起使用
我对你的观点性问题的建议是:不。移植一个现有的编译器,比如GCC或clang,然后使用它。此外,这有几个优点:
- 一些(2.1)API仿真层(以便为其他操作系统编写和编译的代码可以在您的操作系统上运行)
- 或您必须(2.2)将一些现有编译器移植到您的操作系统
- 或至少使您的操作系统成为现有编译器中可用的新的(2.3)目标平台
- 或者其他我不知道的选择