编译器如何为不同的机器编译

时间:2018-02-16 05:17:59

标签: compiler-construction

我是Comp Sci专业,正在努力创建我自己的编程语言作为本学期的一个项目。但我仍然坚持编制阶段的一部分。

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

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

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

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

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

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

非常感谢任何帮助!

凯蒂

1 个答案:

答案 0 :(得分:1)

制作编译器时,您可以选择要定位的体系结构。对于内置于虚拟机(如CLR或JVM)中的编译器,选择很简单,您可以定位运行VM的体系结构,即在PC上运行的CLR将生成x86代码,并且在手机上运行的JVM将生成Arm代码。

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

当您决定编译器的目标体系结构时,您需要为每个体系结构构建代码生成器。通常,您只关注主体系结构,如果增益很大,则只引入特定于模型的调整,即构建Arm编译器而不是Cortex-A9编译器。这意味着可以为许多不同体系结构生成代码的编译器将为每个体系结构包含一个代码生成器,而同一体系结构的所有不同版本都由一个代码生成器处理。

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