公共语言运行时和表达式计算
重要
在 Visual Studio 2015 中,这种实现表达式计算器的方法已弃用。 有关实现 CLR 表达式计算器的信息,请参阅 CLR 表达式计算器 和 托管表达式计算器示例。
面向公共语言运行时(CLR)的编译器(如 Visual Basic 和 C# (发音的 C# )生成 Microsoft 中间语言(MSIL),后者后来编译为本机代码。 CLR 提供调试引擎(DE)来调试生成的代码。 如果计划将专有编程语言集成到 Visual Studio IDE 中,可以选择编译为 MSIL,因此不必编写自己的 DE。 但是,必须编写能够在编程语言上下文中计算表达式的表达式计算器(企业版)。
讨论 (Discussion)
计算机语言表达式通常经过分析,以生成一组数据对象和一组用于操作它们的运算符。 例如,可以分析表达式“A+B”以将加法运算符(+)应用于数据对象“A”和“B”,这可能会导致另一个数据对象。 数据对象、运算符及其关联总数集通常以树的形式表示,树节点的运算符和分支上的数据对象。 已分解为树形式的表达式通常称为已分析的树。
分析表达式后,将调用符号提供程序(SP)来计算每个数据对象。 例如,如果在多个方法中同时定义了“A”,则必须在确定 A 的值之前回答“哪个 A?” 问题。 SP 返回的答案类似于“第五个堆栈帧上的第三项”或“超出分配给此方法的静态内存的开始时间的 50 字节的 A”。
除了为程序本身生成 MSIL 之外,CLR 编译器还可以生成写入 Program DataBase (.pdb) 文件中的非常描述性的调试信息。 只要专有语言编译器以与 CLR 编译器相同的格式生成调试信息,CLR 的 SP 就能识别该语言的命名数据对象。 标识命名数据对象后,企业版使用绑定器对象将数据对象关联(或绑定)数据对象与保存该对象的值的内存区域。 然后,DE 可以获取或设置数据对象的新值。
专有编译器可以通过调用 ISymbolWriter
接口(在命名空间 System.Diagnostics.SymbolStore
中的 .NET Framework 中定义)来提供 CLR 调试信息。 通过编译到 MSIL 并通过这些接口编写调试信息,专有编译器可以使用 CLR DE 和 SP。 这大大简化了将专有语言集成到 Visual Studio IDE 中。
当 CLR DE 调用专有企业版来计算表达式时,DE 会向 SP 和绑定器对象提供接口企业版。 因此,编写基于 CLR 的调试引擎意味着只需要实现适当的表达式计算器接口;CLR 负责绑定和符号处理。