【发布时间】: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 为目标,以避免自己支持不同的架构