速来报名!AICon北京站鸿蒙专场~ 了解详情
写点什么

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

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

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

关注

评论

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

Iframe在Vue中的状态保持技术 | 京东云技术团队

京东科技开发者

html Vue iframe 跨域 iframe 企业号 5 月 PK 榜

公网对讲SDK——对讲应用场景

anyRTC开发者

音视频 视频会议 指挥调度 快对讲 公网对讲

深度学习进阶篇-预训练模型[2]:Transformer-XL、Longformer、GPT原理、模型结构、应用场景、改进技巧等详细讲解

汀丶人工智能

人工智能 深度学习 nlp 预训练模型 Transformer

开源堡垒机和免费商业堡垒机哪个用的更香?

行云管家

开源 网络安全 免费堡垒机

Spring Validated 校验框架,让你的项目更简洁,提升开发效率

做梦都在改BUG

Java spring Validated

CMake常用命令大全:提高项目构建效率

小万哥

程序员 面试 后端 C/C++ cmake

文档关键信息提取形成知识图谱:基于NLP算法提取文本内容的关键信息生成信息图谱教程及码源(含pyltp安装使用教程)

汀丶人工智能

nlp 知识图谱 信息抽取 命名实体识别 pyltp

成功加冕!用友大易获评2023最佳招聘管理软件供应商

用友BIP

招聘

一名开发者眼中的 TiDB 与 MySQL 的选择丨TiDB Community

PingCAP

MySQL 数据库 TiDB

万字长文详述ClickHouse在京喜达实时数据的探索与实践 | 京东云技术团队

京东科技开发者

数据库 flink Clickhouse 企业号 5 月 PK 榜

前端微服务无界实践 | 京东云技术团队

京东科技开发者

微服务 前端 企业号 5 月 PK 榜 无界

Elasticsearch之join关联查询及使用场景 | 京东云技术团队

京东科技开发者

数据库 elasticsearch sql join 企业号 5 月 PK 榜

什么是数字藏品|数字藏品系统开发源码?

Congge420

羊了个羊游戏|链游dapp系统开发方案

Congge420

又一开发者公布高分方案源代码,助力软件杯选手高效解题

飞桨PaddlePaddle

百度飞桨 中国软件杯

牛客网最新开源!共1600+页 ,堪称Java面试八股文的天花板

采菊东篱下

程序员 java面试

CST 电磁仿真计算时,为什么要关闭超线程?【操作教程】

思茂信息

cst cst使用教程 cst电磁仿真 cst仿真软件

财务共享中心释放企业“数据”生产力

用友BIP

财务共享

Nautilus Chain开启全球行,普及Layer3概念加速其采用

鳄鱼视界

浅析 Redis 中 String 数据类型及其底层编码

做梦都在改BUG

redis 数据结构 string

首个机器学习实时特征平台测试基准论文被 VLDB 2023 录取

第四范式开发者社区

人工智能 机器学习 数据库 开源 特征

1个Java程序员需要具备什么样的素质和能力才可以称得上高级工程师?

Java永远的神

程序员 后端 架构师 java面试 Java性能优化

Gamefi很有潜力?分析链游gamefi系统开发源码!

Congge420

【参考设计】16芯串联电池包储能系统

元器件秋姐

芯片 电池 元器件 电源 驱动器

PAI-Diffusion中文模型全面升级,海量高清艺术大图一键生成

阿里云大数据AI技术

人工智能 模型 Stable Diffusion 企业号 5 月 PK 榜

3种分页列表缓存方式,速收藏~~

华为云开发者联盟

开发 华为云 华为云开发者联盟 企业号 5 月 PK 榜

为什么说财务共享是财务数智化转型的基石?

用友BIP

财务共享

5人5月用容器技术保卫蓝天

华为云开发者联盟

云计算 后端 华为云 华为云开发者联盟 企业号 5 月 PK 榜

如何做好需求管理?华为云需求管理利器CodeArts Req解读

华为云PaaS服务小智

云计算 产品经理 需求管理 华为云

CFS第十二届财经峰会7月举行, 候选品牌:行云管家

行云管家

云计算 商业 财经峰会

Chrome分组插件

soap said

Chrome插件

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