在 2025 收官前,看清 Data + AI 的真实走向,点击查看 BUILD 大会精华版 了解详情
写点什么

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

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

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

关注

评论

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

2020双十一终极清单!阿里云CDN&视频云最全优惠攻略

阿里云Edge Plus

CDN

元模型驱动(一)构建元模型ーGME入门

KaYa

DDD Kaya MDA GME MDD

Flink State 误用之痛,你中招了吗?

Apache Flink

flink

架构师训练营第 1 期第 7 周作业

业哥

5G应用的实时决策

VoltDB

5G 物联网 工业互联网 技术分享

1分钟教你如何整理 React 知识体系

Leo

学习 大前端 React

网络直播打赏背后的套路:刺激用户不理智消费

石头IT视角

物联网时代存储告急 边缘存储如何缓解存储压力?

京东科技开发者

云计算 云服务 云存储

训练营第二周作业

爱码士

进“大厂”的故事

北风

职业规划 职业成长 大厂

阿里二面惨败,痛定思痛狂刷1000+面试题,成功五面上岸滴滴(面经+面试题分享)

Java架构追梦

Java 架构 腾讯 面试 蚂蚁金服

Go 与异步 IO - io_uring 的思考

IceberGu

Linux 异步IO io_uring Go 语言

训练营第二周课程总结

爱码士

训练营

TCP/IP 基础知识总结

苹果看辽宁体育

后端 计算机网络 计算机

从零实现一个动态表单设计(编辑)器

徐小夕

Java 编辑器 H5 Node React

为什么 React Hooks 优于 HOCs(译)

西贝

Java 翻译 React Hooks HOC

酷睿i5-10600KF对标锐龙7 3700X,游戏表现领先且售价更香

E科讯

【架构师训练营 1 期】第六周作业

诺乐

面试官:讲一下缓存穿透、缓存雪崩和缓存击穿?

bigsai

redis 缓存穿透 缓存击穿 缓存雪崩

Redis还可以做哪些事?

Java旅途

redis

JAVA魅力之神奇的数组带给你不一样的乐趣

小Q

Java 学习 架构 面试 数组

Java-技术专题-时间工具类的使用方案

码界西柚

队列实现栈的3种方法,全都击败了100%的用户!

王磊

Java 算法和数据结构

【架构师训练营 1 期】第六周学习总结

诺乐

接口测试(apipost、jmeter和python脚本)

测试人生路

Python 接口测试 测试工具

给打工人熬一锅「毒」鸡汤

Java_若依框架教程

程序员 打工人 毒鸡汤

基于服务设计的线上展览

京东科技开发者

云安全

sharding-jdbc 分库分表的 4种分片策略,还蛮简单的

程序员小富

Java 分库分表

元模型驱动(二)构建元模型ーGME构建分层模型

KaYa

DDD Kaya MDA GME MDD

java安全编码指南之:文件和共享目录的安全性

程序那些事

代码规范 java安全 java安全编码指南 java编码 程序那些事

轻量型GPU应用首选 京东智联云推出NVIDIA vGPU实例

京东科技开发者

人工智能 gpu

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