A Peek Under the Hood of the .NET Compiler Platform โ€“ Roslyn

Introduction

Today’s compilers are magical beings. They transform human written source code into binaries that computers can execute. What happens once the compile command is given at the command line or via the IDE is a mystery to everyone besides the compiler developers.

Developers have gotten used to smart features offered by the IDE like Intellisense, renaming and refactoring support to name a few. These features have just worked for developers, so having knowledge of how they work resides with the developers who build these compilers.

Project Roslyn is Microsoft’s attempt to open up internals of how the .NET compilers operate, by exposing the compiler as a platform and providing developers APIs, which they can use for various code related tasks.

This transition from Microsoft signals a major milestone for platform developers. With Roslyn, platform developers can now build developer tools for Microsoft frameworks – tools related to (i) meta-programming, (ii) code generation and transformation, (iii) interactive use of C# and VB languages, and (iv) embedding VB and C# in domain specific languages.

The .NET Compiler platform, aka Roslyn, exposes two main categories of APIs – compiler APIs (for compiling) and Worksplace APIs (for IDEs).

Compiler Features and Analogous APIs

The classic compiler pipeline includes a few steps. In the table below, we map the .NET compiler platform APIs to the compiler pipeline features.

Compiler Pipeline Feature

Compile API group

Parser

Syntax Tree API

Symbols

Symbol API

Metadata Import

Symbol API

Binder

Binding and Flow Analysis API

IL Emitter

Emit API

Prerequisites

To use Roslyn features, there are a few requisites that need to be present.

1. You need Visual Studio 2013 Professional or a higher variant.

2. Next, you will need to update Nuget Package Manager to the latest version. You can do this from the Tools menu of Visual Studio 2013. Go to Tools -> Extensions and Updates and select Updates. Follow the steps to update the Nuget installation.

3. Next, we need to install the pre-release version of Nuget package “Microsoft.CodeAnalysis”. Open Nuget Package Manager Console and execute the following command. When you execute the command, you will see the output as follows, indicating the installation is successful.

PM> Install-Package Microsoft.CodeAnalysis -Pre
Attempting to resolve dependency 'Microsoft.CodeAnalysis.CSharp.Workspaces (≥ 0.6.4033103-beta)'.
Attempting to resolve dependency 'Microsoft.CodeAnalysis.Workspaces.Common (≥ 0.6.4033103-beta)'.
Attempting to resolve dependency 'Microsoft.CodeAnalysis.Common (≥ 0.6.4033103-beta)'.
Attempting to resolve dependency 'Microsoft.Bcl.Immutable (≥ 1.1.20-beta)'.
Attempting to resolve dependency 'Microsoft.Bcl.Metadata (≥ 1.0.9-alpha)'.
Attempting to resolve dependency 'Microsoft.CodeAnalysis.CSharp (≥ 0.6.4033103-beta)'.
Attempting to resolve dependency 'Microsoft.CodeAnalysis.VisualBasic.Workspaces (≥ 0.6.4033103-beta)'.
Attempting to resolve dependency 'Microsoft.CodeAnalysis.VisualBasic (≥ 0.6.4033103-beta)'.
Installing 'Microsoft.Bcl.Immutable 1.1.20-beta'.
You are downloading Microsoft.Bcl.Immutable from Microsoft, the license agreement to which is available at http://go.microsoft.com/fwlink/?LinkId=329769. Check the package for additional dependencies, which may come with their own license agreement(s). Your use of the package and dependencies constitutes your acceptance of their license agreements. If you do not accept the license agreement(s), then delete the relevant components from your device.
Successfully installed 'Microsoft.Bcl.Immutable 1.1.20-beta'.
Installing 'Microsoft.Bcl.Metadata 1.0.9-alpha'.
You are downloading Microsoft.Bcl.Metadata from Microsoft, the license agreement to which is available at http://go.microsoft.com/fwlink/?LinkId=329769. Check the package for additional dependencies, which may come with their own license agreement(s). Your use of the package and dependencies constitutes your acceptance of their license agreements. If you do not accept the license agreement(s), then delete the relevant components from your device.
Successfully installed 'Microsoft.Bcl.Metadata 1.0.9-alpha'.
Installing 'Microsoft.CodeAnalysis.Common 0.6.4033103-beta'.
You are downloading Microsoft.CodeAnalysis.Common from Microsoft, the license agreement to which is available at http://go.microsoft.com/fwlink/?LinkId=394369. Check the package for additional dependencies, which may come with their own license agreement(s). Your use of the package and dependencies constitutes your acceptance of their license agreements. If you do not accept the license agreement(s), then delete the relevant components from your device.
Successfully installed 'Microsoft.CodeAnalysis.Common 0.6.4033103-beta'.
Installing 'Microsoft.CodeAnalysis.Workspaces.Common 0.6.4033103-beta'.
You are downloading Microsoft.CodeAnalysis.Workspaces.Common from Microsoft, the license agreement to which is available at http://go.microsoft.com/fwlink/?LinkId=394369. Check the package for additional dependencies, which may come with their own license agreement(s). Your use of the package and dependencies constitutes your acceptance of their license agreements. If you do not accept the license agreement(s), then delete the relevant components from your device.
Successfully installed 'Microsoft.CodeAnalysis.Workspaces.Common 0.6.4033103-beta'.
Installing 'Microsoft.CodeAnalysis.CSharp 0.6.4033103-beta'.
You are downloading Microsoft.CodeAnalysis.CSharp from Microsoft, the license agreement to which is available at http://go.microsoft.com/fwlink/?LinkId=394369. Check the package for additional dependencies, which may come with their own license agreement(s). Your use of the package and dependencies constitutes your acceptance of their license agreements. If you do not accept the license agreement(s), then delete the relevant components from your device.
Successfully installed 'Microsoft.CodeAnalysis.CSharp 0.6.4033103-beta'.
Installing 'Microsoft.CodeAnalysis.CSharp.Workspaces 0.6.4033103-beta'.
You are downloading Microsoft.CodeAnalysis.CSharp.Workspaces from Microsoft, the license agreement to which is available at http://go.microsoft.com/fwlink/?LinkId=394369. Check the package for additional dependencies, which may come with their own license agreement(s). Your use of the package and dependencies constitutes your acceptance of their license agreements. If you do not accept the license agreement(s), then delete the relevant components from your device.
Successfully installed 'Microsoft.CodeAnalysis.CSharp.Workspaces 0.6.4033103-beta'.
Installing 'Microsoft.CodeAnalysis.VisualBasic 0.6.4033103-beta'.
You are downloading Microsoft.CodeAnalysis.VisualBasic from Microsoft, the license agreement to which is available at http://go.microsoft.com/fwlink/?LinkId=394369. Check the package for additional dependencies, which may come with their own license agreement(s). Your use of the package and dependencies constitutes your acceptance of their license agreements. If you do not accept the license agreement(s), then delete the relevant components from your device.
Successfully installed 'Microsoft.CodeAnalysis.VisualBasic 0.6.4033103-beta'.
Installing 'Microsoft.CodeAnalysis.VisualBasic.Workspaces 0.6.4033103-beta'.
You are downloading Microsoft.CodeAnalysis.VisualBasic.Workspaces from Microsoft, the license agreement to which is available at http://go.microsoft.com/fwlink/?LinkId=394369. Check the package for additional dependencies, which may come with their own license agreement(s). Your use of the package and dependencies constitutes your acceptance of their license agreements. If you do not accept the license agreement(s), then delete the relevant components from your device.
Successfully installed 'Microsoft.CodeAnalysis.VisualBasic.Workspaces 0.6.4033103-beta'.
Installing 'Microsoft.CodeAnalysis 0.6.4033103-beta'.
You are downloading Microsoft.CodeAnalysis from Microsoft, the license agreement to which is available at http://go.microsoft.com/fwlink/?LinkId=394369. Check the package for additional dependencies, which may come with their own license agreement(s). Your use of the package and dependencies constitutes your acceptance of their license agreements. If you do not accept the license agreement(s), then delete the relevant components from your device.
Successfully installed 'Microsoft.CodeAnalysis 0.6.4033103-beta'.
Adding 'Microsoft.Bcl.Immutable 1.1.20-beta' to ConsoleApplication1.
Successfully added 'Microsoft.Bcl.Immutable 1.1.20-beta' to ConsoleApplication1.
Adding 'Microsoft.Bcl.Metadata 1.0.9-alpha' to ConsoleApplication1.
Successfully added 'Microsoft.Bcl.Metadata 1.0.9-alpha' to ConsoleApplication1.
Adding 'Microsoft.CodeAnalysis.Common 0.6.4033103-beta' to ConsoleApplication1.
Successfully added 'Microsoft.CodeAnalysis.Common 0.6.4033103-beta' to ConsoleApplication1.
Adding 'Microsoft.CodeAnalysis.Workspaces.Common 0.6.4033103-beta' to ConsoleApplication1.
Successfully added 'Microsoft.CodeAnalysis.Workspaces.Common 0.6.4033103-beta' to ConsoleApplication1.
Adding 'Microsoft.CodeAnalysis.CSharp 0.6.4033103-beta' to ConsoleApplication1.
Successfully added 'Microsoft.CodeAnalysis.CSharp 0.6.4033103-beta' to ConsoleApplication1.
Adding 'Microsoft.CodeAnalysis.CSharp.Workspaces 0.6.4033103-beta' to ConsoleApplication1.
Successfully added 'Microsoft.CodeAnalysis.CSharp.Workspaces 0.6.4033103-beta' to ConsoleApplication1.
Adding 'Microsoft.CodeAnalysis.VisualBasic 0.6.4033103-beta' to ConsoleApplication1.
Successfully added 'Microsoft.CodeAnalysis.VisualBasic 0.6.4033103-beta' to ConsoleApplication1.
Adding 'Microsoft.CodeAnalysis.VisualBasic.Workspaces 0.6.4033103-beta' to ConsoleApplication1.
Successfully added 'Microsoft.CodeAnalysis.VisualBasic.Workspaces 0.6.4033103-beta' to ConsoleApplication1.
Adding 'Microsoft.CodeAnalysis 0.6.4033103-beta' to ConsoleApplication1.
Successfully added 'Microsoft.CodeAnalysis 0.6.4033103-beta' to ConsoleApplication1.
 
PM>

Now, our development environment is ready to use to play with the .NET Compiler platform. In upcoming articles, we will dive deep into the .NET compiler platform.

Summary

In this article, we got an introduction of Roslyn, the .NET compiler platform. Watch for more articles where we will dig deeper into each API of Rolsyn in more detail.

About the Author

Vipul Patel is a Program Manager currently working at Amazon Corporation. He has formerly worked at Microsoft in the Lync team and in the .NET team (in the Base Class libraries and the Debugging and Profiling team). He can be reached at vipul.patel@hotmail.com



Related Articles

Comments

  • re interesting

    Posted by will on 06/01/2014 03:24pm

    more

    Reply
Leave a Comment
  • Your email address will not be published. All fields are required.

Top White Papers and Webcasts

  • Companies undertaking an IT project need to find the right balance between cost and functionality. It's important to start by determining whether to build a solution from scratch, buy an out-of-the-box solution, or a combination of both. In reality, most projects will require some system tailoring to meet business requirements. Decision-makers must understand how much software development is enough and craft a detailed implementation plan to ensure the project's success. This white paper examines the different …

  • On-demand Event Event Date: February 12, 2015 The evolution of systems engineering with the SysML modeling language has resulted in improved requirements specification, better architectural definition, and better hand-off to downstream engineering. Agile methods have proven successful in the software domain, but how can these methods be applied to systems engineering? Check out this webcast and join Bruce Powel Douglass, author of Real-Time Agility, as he discusses how agile methods have had a tremendous …

Most Popular Programming Stories

More for Developers

RSS Feeds

Thanks for your registration, follow us on our social networks to keep up-to-date