写点什么

微软将编译器作为服务公诸于众

  • 2011-11-03
  • 本文字数:1678 字

    阅读完需:约 6 分钟

早先的报道认为 Roslyn 项目只是更好的运行时能够访问的编译器以及 REPL 样式的解释器,但是现在看来它的目的远不止如此。微软公开了整个编译器产品线,期望开发者能够在各个层次上创建出更多类型的工具。

在 Roslyn 项目中有四个“API 层”。微软将其总结如下:

编译器 APIs

编译器层中包含了一些对象模型,这些模型与编译器管道的各个阶段暴露出来的信息——包括句法和语义上的信息——相关。编译器层还包含了对编译器单独调用的展现,其中包括集成的引用、编译器选项以及源代码文件。针对 C#和 Visual Basic 语言有两种不同的 API,但大小差不多。

脚本 APIs

脚本层代表的是 C#或者 Visual Basic 代码片段的运行时执行上下文(runtime execution context)。它包含了一种脚本引擎,这让我们可以把声明和对表达式的求值作为程序中的顶级结构。

工作空间 API

工作空间层是对整个解决方案执行代码分析和重构的起点。它会帮助你把解决方案中所有关于项目的信息组织到一个对象模型中,这让你可以直接访问编译器层的对象模型,而不需要对文件进行解析、配置选项或者管理项目之间的依赖关系。

服务 APIs

服务层中包含了所有 Visual Studio IDE 特性,像智能感知、重构以及代码格式化等。它还包含了各种服务 API,这让用户可以轻松地扩展 Visual Studio。

在四种层中,只有服务 API 对 Visual Studio 组件有很强的依赖关系。其它层都可以在任何一种应用程序中使用,但是工作空间 API 在 Visual Studio 中会更有效地工作。

大多数与代码打交道的开发者——或者是分析代码,或者是重新编写代码——都需要从工作空间层开始。工作空间或者是由宿主(host)提供(像一种 IDE),或者是通过载入解决方案文件手动创建。如果是由宿主提供,那么当解决方案中的项目发生变化时,就会触发事件并通知开发者。

从 ISolution 开始,所有工作空间层下的内容都会表现为一种不变的快照。这让我们可以用线程安全的方式来访问所有包含在解决方案中的项目、文档、语法和符号树。想要做出改变,我们需要复制语法树,并替换需要变更的部分。因为它们都是不可变的,所以我们还可以安全地重用那些没有做出改变的分支。

如果树表现为文本形式,那么在最底层就是源代码本身。编译器的首个编译过程会将其编译成 _ 语法树 _。我们可以从完整的文件创建语法树,也可以从松散的声明或者表达式生成它。在 Roslyn 中,语法树有一种有趣的特性,它完全忠实于最初的源代码,包括所有的注释和空格。这意味着所有语法树都能够转换回源代码,这对于代码生成器和重构工具都是非常重要的功能。

语法树是由语法节点、令牌和一些琐碎的内容(trivia)组成的。语法节点总会是包含其它节点、令牌和琐碎内容的组合。NamespaceDeclarationSyntax、ForStatementSyntax 和 BinaryExpressionSyntax 都是这样的例证。令牌是单独的关键字、符号和标识符。琐碎内容包括空格和注释,这些都是编译器不需要的信息,但是对于重新创建出最初的源代码展现是非常重要的。

变更是针对语法树做出的,变更时会使用了构造器和 ReplaceNode 方法的组合。这个方法让我们不需要手动复制语法树中没有变更的部分。

语法树只能够表现出源代码的词法和句法结构。想要看到它的语义内容,我们需要创建 _ 编译集(compilation)_。编译集是基于一个或多个语法树、一组引用的集合以及所有编译器标识创建的。编译集的主要功能就是要保存符号列表,像命名空间、类型、方法、字段、事件、局部变量以及标签等等。

开发者通常会使用语义模型。他们可以通过把语法树回馈给编译集来创建语义模型,从而用符号数据对其进行注解。然后我们可以对语义模型进行查询,以获得以下信息:

  • 源代码中特定位置引用的符号
  • 所有表达式的结果类型
  • 所有诊断信息,包括错误和警告
  • 变量是如何进入源代码区域,以及如何从其中传出的
  • 对更多不确定问题的答案

在语义模型之上是“控制和数据流分析 API”。这让我们可以迅速获得信息,像在区域中为哪个变量赋值、引用了哪个变量以及该变量是否包含在某个跳转和返回的声明中。

Roslyn CPT 已经提供下载。它需要 Visual Studio 2010 SP 1。

查看英文原文: Microsoft Unveils its Compiler as a Service

2011-11-03 02:232864
用户头像

发布了 340 篇内容, 共 145.2 次阅读, 收获喜欢 13 次。

关注

评论

发布
暂无评论
发现更多内容

一文盘点PoseiSwap近期的生态利好

股市老人

深入理解 ThreadLocal:原理及源码解读

Java你猿哥

Java 源码 多线程 ssm ThreadLocal

美团二面:聊聊ConcurrentHashMap的存储流程

Java你猿哥

Java 源码 ssm ConcurrentHashMap 红黑树

双模齐下,提质增效:CODING 携手知微共创 BizDevOps 体系新篇章

CODING DevOps

由斯坦福、Nautilus Chain等联合主办的 Hackathon 活动,现已接受报名

西柚子

使用Go语言实现工厂模式的三种方式

Jack

UserDAO(UWT)会是WEB3.0中新的宠儿吗?

币离海

Web3.0 UserDAO UWT

AIGC背后的技术分析 | 机器学习中的卷积神经网络

TiAmo

卷积神经网络 AIGC

文心一言 VS 讯飞星火 VS chatgpt (19)-- go语言的slice和rust语言的Vec的扩容流程是什么?

福大大架构师每日一题

福大大 文心一言 讯飞星火

吃透阿里2023版Java性能优化小册后,我让公司系统性能提升了200%

Java 性能优化 性能调优

Cloud Studio 高阶玩家:强大的 YAML 模板

CODING DevOps

Turbo Boost Switcher Pro for mac(cpu温度监测工具) 2.10.2

真大的脸盆

Mac Mac 软件 CPU温度监测工具

mac端好用的建模软件分享~

真大的脸盆

Mac Mac 软件 建模工具 三维建模软件

熬了一个月肝出这份32W字Java面试手册,在Github标星31K+

程序知音

Java java面试 后端技术 Java八股文 Java面试题

求爷爷告奶奶,阿里大佬才甩出这份Spark+Hadoop+中台实战pdf

程序知音

大数据 hadoop spark 后端技术

Django笔记三十三之缓存操作

Hunter熊

Python redis django 缓存

一文读懂大语言模型

俞凡

人工智能

硬核!阿里出品2023版Java架构师面试指南,涵盖Java所有核心技能

Java java面试 Java八股文 Java面试题 Java面试八股文

Python潮流周刊#2:Rust 让 Python 再次伟大

Python猫

Python

由斯坦福、Nautilus Chain等联合主办的 Hackathon 活动,现已接受报名

鳄鱼视界

Midjourney|文心一格prompt教程[进阶篇]:Midjourney Prompt 高级参数、各版本差异、官方提供常见问题

汀丶人工智能

人工智能 AI绘画 MidJourney 文生图 prompt learning

轻松建模、编辑、分析尽在Rhino 7中文激活版~

真大的脸盆

Mac 3D Mac 软件 建模软件 3d建模

太猛了!Github大佬那白嫖的分布式进阶宝典,啃完感觉能吊锤面试官

Java你猿哥

Java 架构 软件开发 ssm 架构设计

专精特新 ︱ 腾讯云 CODING 助力消费电子类企业高速发展期的研运一体化

CODING DevOps

斯坦福、Nautilus Chain等联合主办的 Hackathon 活动,现已接受报名

股市老人

低代码实现探索(五十八)低代码平台

零道云-混合式低代码平台

2023-05-20:go语言的slice和rust语言的Vec的扩容流程是什么?

福大大架构师每日一题

golang rust 福大大

Midjourney|文心一格 Prompt:完整参数列表、风格汇总、文生图词典合集

汀丶人工智能

人工智能 AI绘画 MidJourney 文生图 prompt learning

如何让 300 万程序员爱上 CODING?

CODING DevOps

开源字节 CRM 系统

源字节1号

开源 软件开发 小程序开发

微软将编译器作为服务公诸于众_.NET_Jonathan Allen_InfoQ精选文章