首页 / 软件开发 / .NET编程技术 / 自己动手: 创建.NET Framework语言编译器
自己动手: 创建.NET Framework语言编译器2011-12-14 msdn Joel Pobar本文讨论:语言定义编译器各阶段CLR 抽象堆栈正确获得 IL 的工具本文使用了以下技术:.NET Framework编译器黑客在计算机科学领域算得上名声远扬。我曾在“专业开发人员大会”上看到 Anders Hejlsberg 发表一篇演讲之后走下演讲台时,立即有一群人请求他在书上签名并摆出各种姿势要求合影留念的场面。对于那些致力于学习和了解 Lambda 表达式详情、类型系统和汇编语言的人来说,黑客们的智力都颇具神秘色彩。现在,您也可以通过编写自己的 Microsoft® .NET Framework 编译器来分享某些荣耀。针对 .NET Framework 的编译器有数百种,用于对数十种语言编写的代码进行编译。这些语言在 .NET CLR 中实现交融,代码可以平稳地正常运行并执行交互操作,而不会出现冲突。在构建大型软件系统时,技术精湛的开发人员可以利用这一特性,在程序中添加一些 C# 和 Python 代码。这些开发人员确实给人留下了深刻印象,但他们无法与真正的大师(即编译器黑客)相比,因为大师们深刻了解虚拟机、语言设计以及这些语言和编译器的具体细节。在本文中,我将带您了解一个用 C# 编写的编译器(“Good for Nothing”编译器,名称很贴切)的代码,并向您介绍构建自己的 .NET 编译器所需的高级体系结构、原理和 .NET Framework API。首先介绍语言定义,接着探讨编译器的体系结构,然后带您了解一下用于生成 .NET 程序集的代码生成子系统。本文的目标是帮助您了解编译器开发的基础知识并深入了解各种语言如何有效地针对 CLR 进行编程。我并不是真的要开发一种语言来替代 C# 4.0 或 IronRuby,但是在本讨论中仍提供了大量鲜为人知的技术隐秘,相信定能激发您对编译器开发技术的热情。语言定义软件语言都是针对特定目的开发的。从改善信息表现形式(例如 Visual Basic®),到提高工作效率(例如 Python,旨在最有效地利用每一行代码),再到专用化(例如 Verilog,一种供处理器制造商使用的硬件描述语言),甚至只是为了满足作者的个人喜好(例如,Boo 的创建者对 .NET Framework 情有独钟,而对其他可用语言不屑一顾),目的千差万别,不一而足。确定目的之后,您便可以设计语言(可将这一过程视为语言蓝图)。计算机语言必须非常精确,以便编程人员准确表达所需的内容,使编译器可以准确理解和生成所表达的确切内容的可执行代码。必须指定语言蓝图才能在实施编译器的过程中消除歧义。为此,可以使用元语法,这种语法用于描述语言的语法。现在存在相当多的元语法,因此,您可以根据个人喜好选择一种。我将使用一种名为 EBNF (Extended Backus-Naur Form) 的元语法来指定“Good for Nothing”语言。有必要提一下,EBNF 非常有名:它是图灵奖得主兼 FORTRAN 主要开发人员 John Backus 发明的。对 EBNF 进行深层次的讨论不在本文论述范围之内,但我会对基本概念进行解释。