2025上半年,最新 AI实践都在这!20+ 应用案例,任听一场议题就值回票价 了解详情
写点什么

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

  • 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:232652
用户头像

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

关注

评论

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

[架构实战营]模块一作业

xyu

#架构实战营

有道互动内容引擎Ceramics的业务实践

有道技术团队

信息技术 web tech 网易有道

视频云峰会|“科技 X 艺术” 的颗粒度体验是什么?

阿里云CloudImagine

阿里云 AR 艺术 摄影 vr

论文解读丨图神经网络应用于半结构化文档的命名实体识别和关系提取

华为云开发者联盟

文档 识别 图神经网络 半结构化文档 关系提取

虚拟币合约交易平台搭建,永续合约交易系统源码

万字长文,Spark 架构原理和RDD算子详解一网打进!

云祁

大数据 spark 7月日更

模块一作业

王小森

统一服务门户,让运维不再成为“背锅侠”和“救火队”

BoCloud博云

FIL币价值与未来, FIL币价值预估

模块一作业

燕燕 yen yen

#架构实战营

5W1H聊开源之Why——为什么要参与开源?

禅道项目管理

开源 项目

如何成长为高级工程师?

行者AI

重磅!不容错过的阿里内部微服务速成手册也太赞了(2021版)

Java

两者可兼得,在IDEA中使用Git!

Ayue、

git 学习

面试扣分点:什么是鸭子类型?

367W字!京东商城Java架构师设计的亿级高并发秒杀手抄笔记

Java架构追梦

Java 架构 秒杀系统 亿级并发 京东商城

CDH的安装(三)

大数据技术指南

CDH 7月日更

Hive学习笔记(二)

五分钟学大数据

hive 7月日更

行业痛点今何在?产业安全专家共话云安全

腾讯安全云鼎实验室

云计算 云安全

简单四步学会在数字孪生可视化场景中创建小地图!

ThingJS数字孪生引擎

大前端 地图 物联网 可视化 数字孪生

模块八作业

c

架构实战营

SQL巩固测试题

Flychen

成功收到美团、字节、蚂蚁Offer后!我把狂刷 5 遍的面试题整理出来了!

Java 程序员 架构 面试

一个成功的 Git 分支模型如何构建?

白亦杨

公安重点人员研判分析平台解决方案,智慧派出所

架构实战营 -- 模块1作业

发酵的死神

官宣!ElasticJob 3.0.0 版本正式发布

SphereEx

架构师实战营模块一命题作业

郑立新

架构实战营

存储大师班 | RDMA简介与编程基础

QingStor分布式存储

云原生 对象存储 分布式存储

模块一作业

hello

架构实战营

直播之变,5G为豹

脑极体

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