您是不是必须为新的操作系统构建新的编译器?
Posted
技术标签:
【中文标题】您是不是必须为新的操作系统构建新的编译器?【英文标题】:Do you have to build a new compiler for a new operating system?您是否必须为新的操作系统构建新的编译器? 【发布时间】:2014-11-11 23:50:43 【问题描述】:我想在未来的某个时间构建一个操作系统,现在正在考虑一些关于它的简单草图。我几乎一直在为 Windows 环境(和一些小 Java)编译 C 语言。如果我想在 Linux 下运行它,我将不得不重新编译我的任何 C 程序。所以二进制文件,编译的产物,对于每个操作系统来说必须是不同的。如果我出于爱好和学术目的从头开始设计一个全新的操作系统,而不使用 Linux 内核或任何已知的操作系统基本代码,我理解的情况是我无法使用 GCC 编译我的 C 程序,因为我的操作系统不会在其目标系统中。这里出现了我写在标题上的问题。提前感谢您的任何提示。
【问题讨论】:
我认为,当您完成编写自己的操作系统时,答案就会出现:) 但您也可以,是的。 @cirrus 在第一次(和第二次)尝试失败后 OP 会知道。但以人为本的方法需要提前做好准备——第一次做对 当然,如果你真的想麻烦写一个新的操作系统,为什么要做已经做过的事情。与其遵循为几十年前的范例设计的分层内核架构和 c 编译器模型,不如做一些真正不同的东西,比如功能性或不可变操作系统(google Midori,不可变操作系统)。使用不可变的操作系统,您可以在安全性、大小、性能和易于并发性方面看到巨大的好处。您几乎肯定会发现 C 不适合您的新平台,您会需要另一种语言,甚至可能需要一种新型语言编译器。 @cirrus +1 用于 Midori 操作系统。从真正不同的同一类别中,我在下面的答案中有示例(3.2)和主要(3.3) 【参考方案1】:这取决于。您可以轻松地选择重用现有编译器,例如远古示例 GCC,因此您将获得现有编译器的好处。但有一些大的附带条件必须澄清。
无论您是否选择构建一个新的编译器,挑战仍然是移植一个 C 库。从技术上讲,您可以在没有标准库的情况下使用 C(例如,Linux 内核或任何自托管示例必须这样做)但是对于预期的程序来说,这是一个荒谬的提议在操作系统下运行,因为大多数系统都会施加内存限制等,这意味着您不能只在使用内存方面拥有全权委托。因此,需要一个 C 库调用,例如 malloc
。
由于您内核下的任何程序(很可能是您操作系统的 99%)都需要一组函数来链接,因此移植 C 库是您最大的任务。 C 库是一个巨大的单体,编写自己的库是相当愚蠢的,尤其是使用many implementations already available,最著名的是 GCC。所以,你真正应该问的问题是,你想写我自己的 libc 版本吗? (答案几乎总是否定的,大多数替代实现都是针对小众用例的。)另外,如果你想让你的操作系统兼容 POSIX,那么你必须实现 more 函数,添加麻烦。
与将包含哪个 C 库相比,您是否为自己的操作系统编写自己的编译器只是一个小细节。您始终可以将自己的编译器与已编写的 C 库实现一起使用。
我对您相当基于意见的问题的建议:否。移植现有的编译器,例如 GCC 或 clang,然后使用它。另外,这有几个优点:
-
与现有工具和工具链的兼容性
熟悉的程序(您的用户无需学习如何使用新的编译器)
它们是开源的——尽管如此,你一个人去做这件事会很疯狂。哎呀,甚至 Apple 也将两个现有的编译器(GCC 和 clang)集成到了他们的工具链中,而不是自己做,而且他们是一家价值 10 亿美元的公司。
看看this page。它演示了如何使用 Newlib 作为 C 库将 GCC 移植到您的操作系统。
【讨论】:
【参考方案2】:不,您可以只移植现有的编译器。您甚至可以选择现有的可执行格式,例如 ELF,并使用您的标准 GCC + GNU Binutils 工具链。您需要移植标准库和 C 运行时,并且需要将 ELF 加载器写入您的操作系统。
我怀疑大部分工作将是移植 C 库。
搜索出现了这个页面:Porting GCC to your OS
【讨论】:
【参考方案3】:(1) 不,您通常不必编写自己的编译器。编写一个好的优化编译器实际上可能是一项我最好避免的大任务。
但为了让您的操作系统能够以某种高级语言编写应用程序,您需要提供
一些(2.1) API 仿真层(以便为其他操作系统编写和编译的代码可以在您的操作系统上运行) 或您必须(2.2) 将一些现有编译器移植到您的操作系统 或至少让您的操作系统在现有编译器中成为新的可用(2.3) 目标平台 或其他一些我不知道的选项选择多种多样,各有优缺点。
一些示例(除了@dietrich-epp 已经提到的明显的 GCC,@sevenbits)可以帮助您决定要遵循的方式:
(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 和摩托罗拉 68k 架构目标 ...
来源:http://www.freepascal.org
(3.2) Inferno 操作系统(参见http://www.vitanuova.com/inferno)有自己的应用程序语言(参见Limbo),带有操作系统特定的词、自己的编译器等。应用程序在虚拟机中运行(参见@ 987654325@)
Inferno® 是一款紧凑型操作系统,专为在各种设备和平台上构建分布式和网络化系统而设计。 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 在内的 OS,并包含在基本安装中。后来C库也被移植了
MenuetOS 是一个完全用 32/64 位汇编语言编写的 PC 操作系统...支持 32/64 位 x86 汇编编程,适用于更小、更快、资源消耗更少的应用程序...Menuet 不是基于在其他操作系统上,它也不植根于 UNIX 或 POSIX 标准。自 2000 年首次发布以来,设计目标一直是移除操作系统不同部分之间的额外层,这通常会使编程复杂化并产生错误......
来源:http://www.menuetos.net
(3.5) Google 的 Android 操作系统(参见 Wikipedia: android (operating system))移植了 Java 虚拟机(参见 Dalvik,后来被 Android Runtime 取代)并为 Java
编程语言提供了操作系统 API,重用现有的编译器和 IDE,只消耗生成的二进制文件
Android Runtime (ART) 是 Android 移动操作系统使用的应用程序运行时环境。 ART 取代了 Android 最初使用的进程虚拟机 Dalvik,将应用程序的字节码转换为本机指令,然后由设备的运行时环境执行……
来源:http://en.wikipedia.org/wiki/Android_Runtime
还有更多有用的示例可用。您是否必须基本上取决于您的新操作系统将引入的编程范例。为什么要构建它以及它与现有的有何不同。
no 的示例为:(3.1)、(3.4)、(3.5)
是的示例是:(3.2)、(3.3)
【讨论】:
感谢您提供大量示例!以上是关于您是不是必须为新的操作系统构建新的编译器?的主要内容,如果未能解决你的问题,请参考以下文章