Cloud Programmability Team
C#やVBの言語設計に携わり、LINQを共同開発した後、Erik MeijerはLive Labsチーム、後にSQL Serverの組織に移り、2007年頃にBrian Beckmanと共に「Cloud Programmability Team」を結成しました。
After his involvement with C# and VB language design and co-creating LINQ, Erik Meijer moved to the Live Labs team and later the SQL Server organization to form the “Cloud Programmability Team” somewhere around 2007, with Brian Beckman.
このチームの目的は、クラウドコンピューティングのためのプログラミングモデルを検討することでしたが、それはちょうど、レイ・オジーの時代にマイクロソフトがクラウドコンピューティングに最初の一歩を踏み出した頃でした。主なプロジェクトの1つが「Volta」で、典型的なLOB(Line-of-Business)アプリケーションをクラウドに「リフト&シフト」するための階層分割アプローチを提供しました(これが確立された用語になるずっと前のことです)。その基本的な考え方は、開発者が言語に関係なく、クラスやメンバーの階層分割カスタム属性を使って、どこでコードを実行すべきかを示すことで、.NETアプリケーションに注釈を付けられるようにすることでした。この技術は、Google Web Toolkit(GWT)に似た精神を持っていました。
The goal of this team was to look at programming models for cloud computing, right at the start of Microsoft’s first steps into cloud computing in the Ray Ozzie days. One of the main projects was “Volta” and provided a tier-splitting approach to “lift and shift” (long before this was established terminology) typical line-of-business (LOB) applications to the cloud. The basic philosophy was to enable developers to annotate their .NET applications - regardless of the language they were written in - using tier-splitting custom attributes on classes and members, indicating where code should run. This technology was similar in spirit to Google Web Toolkit (GWT).
Live Labsの組織の中で、ちょっとした回り道をした痕跡が残っている。Reactive Extensions(Rx)のロゴは、"Volta "プロジェクトから引き継がれたもので、アレサンドロ・ボルタにちなんで、電気ウナギが描かれています。
Voltaの使用例を以下に示します。
One trace of the small detour through the Live Labs organization remains. The logo of Reactive Extensions (Rx) was inherited from the “Volta” project and depicts an electric eel, as a reference to Allesandro Volta.
An example of using Volta is shown below:
code:C#
// presentation layer, e.g. user/password inputs
class LoginForm : Form
{
}
// business logic layer, e.g. login attempt count and lockout
class AuthenticationProvider
{
}
// data access layer, e.g. stored procs
class ContosoDatabase
{
}
上の例では、LoginForm のコードは、リッチ UI アプリケーションや Web ブラウザなどのクライアント上で実行される必要があります。これを実現するために、"Volta "プロジェクトでは、オリジナルのモノリシックなアプリケーションを、階層分割されたILコードを含む小さなアセンブリに分割することをサポートしました。クラウド化されたアプリケーションでリッチデスクトップクライアントをターゲットにする場合は、単純にWindowsフォームを使い続けます。プラグインによるインブラウザ体験をターゲットにする場合は、Silverlightをターゲットにします。ネイティブなブラウザ体験をターゲットにする場合は、チームが構築したIL2JS技術を使用して、ILコードをJavaScriptにトランスパイルします。[RunOnServer]でアノテーションされたコードは、クラウド上でワーカーロールをターゲットにほぼそのまま実行され、[RunOnDatabase]でアノテーションされたコードは、SQL CLRをターゲットにデータベース内で実行されるように分割されます。
In the example shown above, the code in the LoginForm should run on the client, which could be a rich UI application or a web browser. To achieve this, the “Volta” project supported splitting the original monolithic application into smaller assemblies containing the tier-split IL code, which can then be retargeted to a client-compatible execution environment. When targeting rich desktop clients for the cloud-lifted application, it’d simply continue to use Windows Forms. When targeting in-browser experiences with plug-ins, it’d target Silverlight. When targeting native browser experiences, it’d transpile the IL code to JavaScript using the IL2JS technology built by the team. Code annotated with RunOnServer would run largely as-is in the cloud, targeting a worker role, while code annotated with RunOnDatabase would get split off to run in the database, targeting SQL CLR. 入力プログラムの形式的な解析と変換により、アプリケーション(開発者の意図を巨視的なスケールで表現したもの)を分散実行用の小さなピースに分割するティアスプリットは、Voltaプロジェクトに続く多くの研究の基礎となっています。特に、Reaqtorの文脈における式木の委譲という概念は、実装方法は全く異なりますが、階層分割の概念に非常に似ています。
Tier-splitting of applications (which express developer intent at a macroscopic scale) into little pieces for distributed execution by means of formal analysis of and transformations on the input program form the basis of a lot of work that succeeds the Volta project. In particular, the notion of delegation of expression trees in the context of Reaqtor is very akin to the concept of tier-splitting, albeit implemented in quite a different way.
この大胆な野望を支えるために、チームは相互に連携した多くの技術を構築しました。
To support these bold ambitions, the team built a number of technologies that were interconnected:
IL2JSは、MSILからJavaScriptへのトランスパイラーです。MSILからトランスパイルすることで、CLR上のすべての言語を対象とすることができます。このアプローチは、C#をJavaScriptにコンパイルしていたScript#とは異なります。振り返ってみると、どちらのアプローチも、JavaScriptとCLRやJVM上の言語との間にある意味的なギャップに悩まされていました。とはいえ、ウェブ環境でマネージドコードをクライアント上で実行するというアイデアは前進しています。この分野での最近の技術はBlazorで、WebAssemblyのような新しい機能の恩恵を受けることができます。
IL2JS, an MSIL to JavaScript transpiler. By transpiling from MSIL, all languages on the CLR can be targeted. This approach differed from Script#, which was compiling C# to JavaScript. In retrospect, both approaches suffered from the semantic gap between JavaScript and languages on the CLR and JVM. This said, the idea of running managed code in a web environment on the client has carried forward. A recent technology in this space is Blazor which can benefit from newer functionality such as WebAssembly.
クラス、モジュール、静的型付けを追加したJavaScriptのスーパーセットである言語(名前は公表されなかった)のためのコンパイラです。これは、階層分割のための代替的なコンパイル対象となり、リッチな OO 言語から JavaScript のプロトタイプベースの型システムへのトランスパイルダウンに伴う複雑さを軽減することを目的としていました。この取り組みは現在、TypeScriptに取って代わられていますが、この2つのプロジェクトには直接的なつながりはありません。今日では、JavaScriptを強化する試み(ClojureScript、CoffeeScript、TypeScriptなど)や、JavaScriptを置き換える試み(Dartなど)が多く見られるようになりました。
A compiler for a language (whose name was never publicly released) that was a superset of JavaScript adding classes, modules, and static typing. This was meant to become an alternative compilation target for tier splitting, reducing the complexities involved with transpiling down from rich OO languages to a prototype-based type system in JavaScript. This effort is now superseded by TypeScript, though there is no direct link between the two projects. In retrospect, it was an idea ahead of its time; today, we’re seeing a lot of attempt to beef up JavaScript (ClojureScript, CoffeeScript, TypeScript, etc.) or replace JavaScript (most notably Dart).
CloudBuildは、クラウド上のVMを使用して高度なビルド並列性を実現する分散型ビルドシステムで、私たちのチームが使用するためのものです。ビルド用のオーサリング言語は、プレーンバニラの.NETコードをベースに、オブジェクトグラフとビルドの依存関係を宣言しました。ビルドシステムの多くのコンポーネント間のイベント処理には、Reactive Extensions(Rx)が使用されました。今日では、クラウドを利用した分散ビルドの使用は標準的な手法となっていますが、当時は大きな飛躍となりました。
CloudBuild, a distributed build system for high degrees of build parallelism using VMs in the cloud, for use by our team. The authoring language for build was based on plain vanilla .NET code, declaring object graphs and build dependencies. Reactive Extensions (Rx) was used for the eventing glue between many components of the build system. Today, the use of cloud-powered distributed builds is standard practice, but it was a giant leap forward at the time.
Reactive Extensions (Rx)は、オブザーバーパターンの改良版を記述したIObservable<T>およびIObserver<T>インターフェイスを使用して、「LINQ to Events」をサポートするクロスプラットフォーム技術です。これはReaqtorの基礎となり、以下でさらに詳しく説明します。最初のバージョンは.NET用にのみ出荷されましたが(NuGetの前の時代にMSIインストーラーとして)、チームはJavaScript(RxJS)とC++(RxCpp)への移植に取り組みました。
Reactive Extensions (Rx), a cross-platform technology to support “LINQ to Events” using the IObservable<T> and IObserver<T> interfaces describing an improved version of the observer pattern. This became the foundation of Reaqtor and we’ll describe it in much more detail below. While the initial version only shipped for .NET (as an MSI installer back in the pre-NuGet days), the team worked on ports to JavaScript (RxJS) and C++ (RxCpp).
Reactive Extensions(Rx)の開発に貢献した人たちを、姓のアルファベット順に紹介します。
Folks who were instrumental to the development of Reactive Extensions (Rx) include, in alphabetic order by last name:
Brian Beckman
Gavin Bierman (Microsoft Research)
Bart De Smet
Wes Dyer
Aaron Lahman (RxCpp)
Daan Leijen (Microsoft Research)
Erik Meijer
Matthew Podwysocki (RxJS)
Jeffrey van Gogh
Danny van Velzen