写点什么

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

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

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

关注

评论

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

hive的DQL查询语法详细剖析

大数据技术指南

大数据 hive 3月日更

MapReduce的运行机制详解

五分钟学大数据

大数据 mapreduce 3月日更

区块链BaaS应用平台的搭建,BaaS平台的应用场景

13828808769

#区块链#

百度Feed稳定性架构实践

百度Geek说

解决方案 IDC feed

【里程碑】Linkis 1.0.0-RC1 版本发布

WeDataSphere

大数据 开源 WeDataSphere Linkis 计算中间件

已拿到蚂蚁金服Offer!阿里内部二十三万字Java面试题总结

Java架构之路

Java 程序员 架构 面试 编程语言

『设计模式』80年代的人们竟然领悟了设计模式-- 发布者/订阅者模式 (包括发布者/订阅者模式和观察者模式的区别)

风骨散人

Java 设计模式 发布订阅模式

vivo 应用商店中的断点续传技术剖析

vivo互联网技术

2021最新分享快手/百度/蚂蚁/字节面经总结

比伯

Java 程序员 架构 面试 程序人生

OKR之一

张老蔫

28天写作

adb工具的基本使用

行者AI

软件测试

智慧公安重点人员系统开发,情报研判管控平台的搭建

13828808769

行业资讯

智慧公安重点人员系统开发,情报研判管控平台的搭建

13828808769

『Python爬虫』Python实现刷B站、爱奇艺等视频网站播放量(Python教学文章)

风骨散人

Python 爬虫

大多数人不知道的Java知识 - Java内省机制

陈皮的JavaLib

Java 内省 java反射

GitHub已爆火!2021金三银四Java面试突击手册,已助力多人拿到offer

Java 编程 程序员 架构 面试

Service Mesh是什么,为我们解决了什么问题?

xcbeyond

Service Mesh 服务网格 3月日更

Rust从0到1-基础概念-变量

rust 变量

源中瑞智慧平安社区-为社区居民保驾护航

13530558032

区块链电子合同--助推智慧政务

13530558032

完美解决Win10“无法登陆到你的账户”问题,无法登录账户的全方面解决方案!

风骨散人

win10 系统

JDBC--批量插入

打工人!

Java MySQL JDBC MySQL性能优化

区块链数字版权-重新定义版权保护

13530558032

牛哇!看完阿里独家面试手册金三银四稳了,GitHub一天标星66K(Java岗)

Java架构之路

Java 程序员 架构 面试 编程语言

『设计模式』以为是个王者,后来班主任来了!设计模式--二五仔的观察者模式

风骨散人

设计模式 观察者模式

MySQL 索引原理 图文讲解

陈皮的JavaLib

MySQL 数据库 索引

iOS面试进阶&程序员养成文件(附下载地址)

ios 程序员 面试 iOS逆向

【Mysql实战】问题分析利器之binlog

程序员架构进阶

MySQL 数据库 Binlog 28天写作 3月日更

第九周学习总结于心得

产品经理训练营

云端身份认证和访问管理

龙归科技

身份云 云安全

进阶面试皆宜!阿里强推Java程序员进阶笔记,差距不止一点点

Java架构之路

Java 程序员 架构 面试 编程语言

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