読者です 読者をやめる 読者になる 読者になる

M12i.

学術書・マンガ・アニメ・映画の消費活動とプログラミングについて

Rich Landerの".NET Core Guide"を読む

C#

Microsoftが公開している.NET Core関連のドキュメントのうち".NET Core Guide"(Rich Lander)を読んでみました。例によって雑な翻訳を載せておきます(2016/07/19取得)。

         * * *

.NET CoreはMicrosoftおよびGitHub上の開発コミュニティによりメンテナンスされる汎用のアプリケーション開発プラットフォームです。.NET Coreはクロスプラットフォームです。WindowsmacOSそしてLinuxがサポートされており、デバイス上で(訳者:PCや携帯端末などのデバイス上で)、クラウド環境で、そして組込み/IoTのシナリオで利用できます。

.NET Coreには次のような特徴があります:

  • 柔軟な開発:アプリケーションやインストールされたユーザ環境もしくはマシーンに縛られることがありません。
  • クロスプラットフォーム開発:WindowsmacOS、そしてLinux上で動作します。その他のOSにも移植することが可能です。サポートされているOS、CPU、そしてアプリケーション・シナリオは徐々に拡大しています。それらはMicrosoftやその他の企業、そして個人により実現されています。
  • コマンドラインツール群:すべての開発シナリオにわたりコマンドラインツールを活用できます。
  • 互換性:.NET Coreは.NET標準ライブラリに関して.NET Framework、XmarinそしてMonoと互換性を持ちます。
  • オープンソース.NET Coreプラットフォームはオープンソースです。コードはMITライセンスおよびApache2ライセンス下で、またドキュメントはCC-BYライセンス下で公開されています。.NET Coreは.NET Foundationのプロジェクトです。

構成

.NET Coreは以下のパーツ群から構成されています:

  • .NETランタイム。ランタイムは型システム、アセンブリのロード、ガーベッジコレクション、異なるアーキテクチャ間での相互運用性、そしてその他各種の基本的なサービスを提供します。
  • フレームワーク・ライブラリの集合。ライブラリは基本データ型、アプリケーションを構成する各種の型、そして基本的なユーティリティを提供します。
  • SDKツールとコンパイラ群。これらは.NET Core SDKにおける開発作業の基盤を提供します。
  • dotnetアプリケーションホスト。これは.NETCoreアプリケーションを起動するために利用されるプログラムです。dotnetは適切なランタイムを選択してそれを起動し、アセンブリロードに指針を与えて、アプリケーションを起動します。このツールはまたSDKを構成するツール群の起動にも利用されています。

言語

C#言語(そして早晩F#とVBも)が.NET Coreアプリケーションおよびライブラリの開発に利用できます。.NET Core上で稼動するそのコンパイラを使用することで、.NET Coreが動作するあらゆる環境向けに開発をすることが可能になります。一般にはコンパイラを直接利用することはないでしょう。それでも裏側ではそれらが働いています。

C#のRoslynコンパイラと.NET Coreツール群は、Visual StudioVisual Studio CodeSublime TextそしてVimを含むいくつかのテキストエディタIDEにすでに統合されているか、これからされようとしています。これにより.NET Coreアプリケーション開発にコーディング環境とOSに開発者の好みに基づく選択の余地が生み出されます。これらの統合の一部はOmniSharpプロジェクトの有志たちによって実現しています。

.NET APIと互換性

.NET Framework 基本クラスライブラリ(BCL)のレイヤでは、.NET Coreは.NET Frameworkクロスプラットフォームなバージョンであると考えることができます。そのAPIは.NET標準ライブラリ仕様を実装しています。.NET Coreは.NET FrameworkやMono/Xamarinにおいて利用可能なAPIのサブセットを提供するものです。いくつかのケースでは提供される型の実装は不完全なものです(いくつかのメンバーは利用可能でないか、取り払われています)。

API開発ロードマップについてより詳しく知りたい方は、.NET Coreロードマップを参照してください。

.NET標準ライブラリとの関係性

.NET標準ライブラリは、.NET開発者がいかなる.NET実装にも期待することが可能な一連のAPIのセットを定義する仕様です。いずれの.NET実装も、.NET標準ライブラリ仕様に準拠したAPIの実装を行い、それを主たるターゲットとしたライブラリ群をサポートしていかなくてはなりません。

.NET Coreは.NET標準ライブラリを実装し、.NET標準ライブラリ群をサポートしています。

その役割(Workloads)

.NET Coreはそれ自身では単一のアプリケーションモデル(だけ)を持ちます。コンソールアプリケーションです。それは何かしらのツールであったり、ローカルサービスでありテキストベースのゲームであったります。これに加えて.NET Coreの上に、その機能を拡張するかたちで他のアプリケーションモデルが構築されています。例えば:

オープンソース

.NET Coreはオープンソース(MITライセンス)です。そのコードは2014年にMicrosoftから.NET Foundationに対して寄贈されました。.NET Foundationのプロジェクトの中で、.NET Coreは目下のところもっとも活発なものの1つです。そこには個人と企業が、私的、学術的あるいは商業的な目的のもとで自由に参加することができます。複数の企業が.NET Coreを自らのアプリケーション、ツール、新しいプラットフォームやホスティングサービスの構成部品として活用しています。それらの企業のうちのいくつかはGitHub上で.NET Coreの開発に対して重要な貢献をしており、.NET Foundationの技術指揮グループの一員として製品開発に指導的役割を果たしています。

取得

.NET Coreは主に2つの方法で配布されています。1つはNuGet.org上のパッケージとして、もう1つはスタンドアロンの配布物としてです。

スタンドアロンの配布物

.NET Core Getting Startedページでダウンロードできます。

  • Microsoft .NET CoreはCoreCLRランタイムと、関連ライブラリ群、コンソールアプリケーションホスト、そしてdotnetアプリケーションランチャを含んでいます。これについてはMicrosoft.NETCore.Appメタパッケージで解説されています。
  • Microsoft .NET Core SDKは.NET CoreとNuGetパッケージを取得し、アプリケーションをコンパイルしてビルドするためのツール群を含んでいます。

通常、.NET Coreアプリケーション開発をはじめるにあたってまずは.NET Core SDKをインストールすることになるでしょう。インストールに際しては別の.NET Coreビルド(おそらくプレリリース段階のもの)を選択することも可能です。

NuGetパッケージ

アーキテクチャ

.NET Coreはクロスプラットフォームな.NET実装です。.NET Coreに特有のアーキテクチャに関する第一の関心事項は、サポート対象のプラットフォームのための、各プラットフォーム固有の実装の提供に関連しています。

さまざまな環境

.NET Coreの実行環境としてはMicrosoftによりWindowsmacOS、そしてLinuxがサポートされています。Linuxについては、まずRed Hat Enterprise LinuxRHEL)とDebianディストリビューション・ファミリー上での稼動がサポートされています。

.NET Coreは現在X64アーキテクチャのCPUをサポートしています。WindowsではX86アーキテクチャもまたサポートされています。ARM64とARM32は現在対応に向けた作業中です。

.NET Coreロードマップではこのフレームワークの役割(workload)、OSとCPU環境のサポート状況と今後の計画についてより詳しい情報を提供しています。

他の企業やグループが異なるアプリケーション形態や環境のために.NET Coreのサポートを提供する可能性もあります。

互換性のための設計

.NET Coreは他の.NET製品に対して非常に似通っていると同時にそれと際立った差異を持ったものとして構築されました。新しいプラットフォーム、新しい役割(new workloads)そして新しいコンパイラ・ツールチェインのため、広範な互換性の実現が可能となるよう設計されています。いくつかのOSとCPU向けの移植が現在進行中であり、さらに多くの移植が行われる可能性があります。例えばLLILCプロジェクトはLLVMコンパイラを用いて.NET Coreのためのネイティブ・コンパイルを行う試験的取り組みを行うものです。

.NET Coreがいくつかの部品に分割されることで、それぞれの部品を独立したスケジュールのもとで新しいプラットフォームに対応させていくことができるようになります。ランタイムとプラットフォーム固有の基本的ライブラリは不可分なものとして移植されなくてはなりません。プラットフォーム固有でないライブラリはすべてのプラットフォームで現状通りに動作するよう組み上げられるべきでしょう。.NET Coreプロジェクトには、開発効率を向上させるためプラットフォーム固有の実装を省き、アルゴリズムAPIを実装する上で、プラットフォーム中立なC#コードで実装できるときにはいつでもそうするというバイアスが存在します。

.NET Coreは複数のOSをサポートするためにどのように実装されているのか?としばしば質問されます。典型的な質問は、複数の独立した実装があるのでは?とか、プリプロセッサ・ディレクティブを使用した条件付きコンパイルをつかっているのでは?といったものです。いずれの質問も条件付きコンパイルを念頭に置いたものです(訳注:そしてこの点について続くパラグラフのなかに回答はない)。

下図をご覧になってください。CoreFX(訳注:.NET Coreの基本的ライブラリのプロジェクト名)の大半がプラットフォーム中立コードです。これらはすべてのプラットフォームで共有されています。プラットフォーム中立のコードはすべてのプラットフォームで利用される単一のポータブル・アセンブリとしてビルドすることが可能です。

f:id:m12i:20160730132112p:plain
(".NET Core Guide"より転載)

Windows向けの実装とUnix向けの実装はコード分量の上で似通っています。Windows向け実装はこのOSに固有のいくつかの機能を持つため大きめです。これは例えばMicrosoft.Win32.Registryなどです。一方でUnix固有の概念のいくつかはまだ実装されていません。LinuxmacOS向けの実装の多くはUnix向けのそれと多くを共有していることもわかるでしょう(訳注:何を持って「わかる」と述べているのかは不明)。LinuxmacOS固有の実装はおおよそ似たような分量です。

.NET Coreではプラットフォーム固有のライブラリとプラットフォーム中立のライブラリが混在しています。いくつかの例からその様子を垣間見ることができるでしょう:

  • CoreCLRはプラットフォーム固有です。これはC/C++で構築されているので構造的にプラットフォーム固有なものです。
  • System.IOSystem.Security.Cryptography.Algorithmsは、それぞれのOSは非常に異なるストレージや暗号化のAPIに関してプラットフォーム固有です。
  • System.CollectionsSystem.Linqは、その生成とデータ構造に対する操作に関してプラットフォーム中立です。

他の.NETプラットフォームとの比較

既存の.NETプラットフォームと比較をすることで.NET Coreの姿形を理解するのに役立つかもしれません。

.NET Frameworkとの比較

.NETプラットフォームは2000年にMicrosoftにより発表され、そこから発展を遂げてきました。.NET Frameworkは15年以上の長期にわたりMicrosoftにより製造される.NET製品の中核にあり続けてきました。

.NET Coreと.NET Frameworkの大きな違いは:

  • アプリケーションモデル: .NET Coreは.NET Frameworkがサポートするアプリケーションモデルのすべてをサポートしているわけではありません。その理由のある部分は、それらのモデルがWindows OSのテクノロジの上に構築されているからです。これは例えばWPFDirectXの上に構築されている)などです。コンソールアプリケーションモデルとASP.NET Coreアプリケーションモデルは.NET Coreおよび.NET Frameworkのいずれにおいてもサポートされています。
  • API群: .NET Coreは.NET Frameworkと多くの場合で共通の、しかしながらより少数のAPI群を持ち、そこにはモジュール構成の差異も存在します(アセンブリ名が異なったり、より重要なものとしては型のメンバーが異なったりするケースがあります)。これらの差異は目下のところ典型的には.NET Frameworkから.NET Coreへとソースコードを移植する過程で必要になったものです。.NET Coreは.NET標準ライブラリAPIを実装しています。このAPI.NET Framework BCL APIのより多くの部分を含むかたちへと徐々に成長中です。
  • サブシステム: .NET Core実装はよりシンプルな実装とプログラミングモデルの提供を目的とする、.NET Frameworkにおけるサブシステムのサブセットです。例えば、コードアクセスセキュリティ(CAS)はサポートされていませんが、一方でリフレクションはサポートされています。
  • プラットフォーム: .NET FrameworkはWindowsWindows Serverをサポートしています。一方、.NET CoreはmacOSLinuxをもサポートしています。
  • オープンソース .NET Coreはオープンソースです。一方、.NET Framework読み取り専用サブセットオープンソースです。

とはいえ、.NET Coreはそのコードの真っ正直な公開と、ソースおよびバイナリの両面にわたる公開された技術の活用という点において、.NET Frameworkやその他の.NETプラットフォームと際立った差異をなしています。

Monoとの比較

Monoは独自のクロスプラットフォームかつオープンソースの.NET実装で、2004年に最初のバージョンが公開されました。これはコミュニティによる.NET Frameworkのクローンと考えることができます。Monoプロジェクトチームは、サードパーティによる実装の提供を可能にするためMicrosoftにより公開されている.NET標準(ECMA 335)に基づき開発を行ってきました。

.NET CoreとMonoの大きな違いは:

  • アプリケーションモデル: Monoは.NET Frameworkのアプリケーションモデルのサブセットをサポートしており(例えばWindows Forms)、加えてXamarin製品のかたちで独自のモデルも持っています(例えばXamarin.iOS)。.NET Coreはこれらをサポートしていません。
  • API群: Monoは.NET Framework API群のより大きなサブセットをサポートしています。同じアセンブリ名とモジュール構成をとっています。
  • プラットフォーム: Monoは多くのプラットフォームとCPUをサポートしています。
  • オープンソース Monoと.NET CoreはいずれもMITライセンスの下で公開されており、またいずれも.NET Foundationのプロジェクトです。
  • 焦点: 最近Monoが主要な焦点をおいているのはモバイルプラットフォームです。一方、.NET Coreはクラウドの分野に焦点をおいています。

         * * *

原典は".NET Core Guide"(Rich Lander執筆。2016/07/19取得)です。