【问题标题】:How do compilers compile for different machines编译器如何针对不同的机器进行编译
【发布时间】:2018-02-16 05:17:58
【问题描述】:

我是 Comp Sci 专业的学生,​​我正在努力创建自己的编程语言作为本学期的项目之一。但我被困在编译阶段的某一部分。

据我了解,这是从 C# 等语言编译的过程。

C# 源代码 -> 由 .NET 编译成 IL -> 由 CLR 执行(根据需要将 IL 转换为本机机器代码 - 显然它不会一次完成所有操作),这会给您留下一个 .exe 程序.

  • 所有方便的东西,例如内存管理/垃圾收集。

我感到困惑的是从中间语言 (IL) 到本机机器代码的阶段。

  • CLR 如何知道要转换为哪个本机代码?
  • 它有所有可能的 CPU 架构的字典吗?
  • 另外,我是否需要为我的编译器学习这些原生架构?

我的意思是,我想我可以为 .NET (mylang.NET) 编写我的语言,使其以 CLR 为目标,并让它完成其余的工作,在这种情况下,我只需要学习中级语言。但是,我仍然有兴趣制作一种不受托管语言限制的非托管语言。 (像 C++ 一样不受管理)。但这意味着我需要以某种方式知道我遇到的每个可能版本的机器代码..

任何帮助将不胜感激!

凯蒂

【问题讨论】:

  • CLR 以它运行​​的任何平台为目标——也就是说,如果你在 x86 PC 上运行 .net 应用程序,它知道生成 x86 机器代码,因为它知道它在 x86 机器上运行——它甚至知道它运行在哪种确切类型的 x86 CPU 上,因此它可以生成更具体的指令。这就是 JIT 与传统的提前编译器相比的优势:您始终知道您的目标是哪个 CPU,因为编译发生在同一个系统上。对于非托管语言,您可以考虑以 LLVM 为目标,以避免自己支持不同的架构

标签: compiler-construction


【解决方案1】:

当您制作编译器时,您可以选择目标架构。对于内置在 CLR 或 JVM 等虚拟机中的编译器,选择很简单,您可以针对运行 VM 的架构,即在您的 PC 上运行的 CLR 将生成 x86 代码,而在您的手机上运行的 JVM 将生成 Arm 代码。

对于独立编译器,选择更加随意,取决于您希望代码在哪里运行。如果您希望代码在您的 PC 上运行,您生成 x86 代码,为您的手机生成 Arm 代码,为您的洗碗机生成 8051 代码,为您汽车中的引擎控制器生成代码,例如 RH850。

当您决定编译器的目标架构后,您需要为每个架构构建一个代码生成器。通常,您专注于主要架构,并且仅在增益很大时才引入特定于模型的调整,即您构建的是 Arm 编译器而不是 Cortex-A9 编译器。这意味着可以为多种不同架构生成代码的编译器将为每个架构包含一个代码生成器,而同一架构的所有不同版本都由一个代码生成器处理。

构建代码生成器需要了解目标架构及其工作原理。因此,在不学习目标架构的情况下尝试构建编译器注定要失败。我对您项目的个人建议是您选择一种特定的架构并以此为目标。我个人会选择 x86,因为你可以在你的电脑上测试生成的代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-10
    • 2013-07-10
    • 2016-03-23
    • 1970-01-01
    • 2021-09-01
    • 2021-05-03
    相关资源
    最近更新 更多