SlideShare a Scribd company logo
CLI と BCL
荒井 省三
日本マイクロソフト株式会社
アジェンダ
• CLI とは
• 共通型システム (CTS)
• .NET Standard Library
• まとめ
標準化
• Common Language Infrastructure
ISO/IEC 2721
ECMA-335
JIS X3016
• Microsoft Open Promise
• Microsoft Reference Source
• .NET Core - MIT License
CLI とは (※)
• 第1章 概念とアーキテクチャ
• 第2章 メタデータ定義及び意味論
• 第3章 CIL 命令集合
• 第4章 プロファイル及びライブラリ
• 第5章 デバッグ情報交換形式
• 第6章 付属書
適用範囲、見本プログラム、CIL アセンブラの実装、
クラス ライブラリの設計ガイドライン、可搬性に関する考察、
厳密でない違反、並列ライブラリ
※JIS X3016 より引用
第 1 章 概念とアーキテクチャ (※)
• 6. 共通言語基盤の概要
型安全との関係、管理下駆動実行との関係
• 7. 共通言語仕様 (CLS)
• 8. 共通型システム (CTS)
• 9. メタデータ
• 10. 共通言語仕様のための名前及び型の規則
※JIS X3016 より引用
6. 共通言語基盤の概要 (※)
• 共通型システム (CTS)
• メタデータ
• 共通言語仕様 (CLS)
• 仮想実行システム (VES)
仮想実行システム(VES)はCTSモデルを実装し強制する。VESは,
CLIのために書かれたプログラムのロード及び実行を行う。
• CLIのこれらの側面は,分散コンポーネント及びアプリケーション
を設計し,開発し,配置し,実行するための統一フレームワークを
形作る。
※JIS X3016 より引用
第 2 章 メタデータ及び意味論 (※)
• 24. メタデータの物理的な配置
PE (Portable Executable) フォーマット
※JIS X3016 より引用
PE ヘッダー
PE 拡張ヘッダー
メタデータ
ヘッダー
メタデータ
CLI と仮想実行システムの関係
CLI
VES
CTS
CLS
CLI と実装系の関係とは
CLI/VES
CoreCLRCLR
Mono
Runtime
VES の仕組みを考えてみる
アセンブリ メタデータ
ローダー 実行時クラス情報
EEClass
クラス
ローダー
フィールド データ
インスタンス
メソッド テーブル
メソッドA
メソッドB
メソッドC
…
CIL テーブル
実装A
実装B
実装C
…
Native Cache
実装A
実装B
実装C
…
JIT
実行時クラス
インスタンス
VES の特徴
• ターゲットを特定していない仮想実行システム
• アセンブリ (PE フォーマット) をロードする
• 管理下データ (Managed Data) = GC
• 型安全 (Type Safe) = スタック ウォークなど
• アプリケーション ドメインが実行単位
CLRは、アプリ、Shared、System の 3ドメイン
• コードの最適化 = JIT による実行時の最適化
ターゲット プラットフォームごとに異なる JIT 実装が可能
AOT や NGEN は、実行時の最適化ではない
1.8 共通型システム
• 目的:関数型、手続型、オブジェクト指向にも提供される
型
値型 参照型 AppDomain 内の同一性
AssemblyLoadContext
Built-in 利用者定義 自己記述 Interface ポインタ Built-in
delegate
array
基底クラスは、System.Object
CLR は mscorlib.dll、CoreCLR 2.x は System.Private.CoreLib.dll
Object
String
.NET Standard とは何か
• BCL あるいは FCL を置き換えるための仕様
• パッケージの依存関係を管理するためのメタ パッケージ
• CoreFx のアセンブリ群は、細分化されたパッケージで構成
• バージョンは、各パッケージの開発ペースで変化
• ターゲット プラットフォーム単位にサポート バージョンを定義
• 2.0 と 1.6 では仕組みが大幅に変更となった
.NET Core と Target Platform
• 対象フレームワークに応じてメタ パッケージを決定
対象フレームワーク 最新Ver フレームワーク モニカ NET Standard メタ パッケージ
.NET Standard 2.0 netstandard2.0 N/A NETStandard.Library
Net Core App 2.0 netcoreapp2.0 2.0 Microsoft.NetCore.App
.NET Framework 4.7.1 net47 1.5 N/A
.NET Core とパッケージ
• ターゲット プラットフォーム
• メタ パッケージを決定
• メタ パッケージ
• パッケージの依存関係を定義
• .NET Standard 2.0 では状況が異なる
• パッケージ
• nuget パッケージ
• マルチ プラットフォーム サポート
• Runtime.json による プラットフォーム識別子
test.csproj
• フレームワークを 「netcoreapp2.0」と定義
• Microsoft.NET.Sdk が、.NET Core SDK を意味する
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp2.0</TargetFramework>
</PropertyGroup>
</Project>
project.assets.json 抜粋 1/3
{
"version": 3,
"targets": {
".NETCoreApp,Version=v2.0": {
"Microsoft.NETCore.App/2.0.0": {
"type": "package",
"dependencies": {
"Microsoft.NETCore.DotNetHostPolicy": "2.0.0",
"Microsoft.NETCore.Platforms": "2.0.0",
"NETStandard.Library": "2.0.0"
},
"compile": {
"ref/netcoreapp2.0/Microsoft.CSharp.dll": {},
"ref/netcoreapp2.0/Microsoft.VisualBasic.dll": {},
"ref/netcoreapp2.0/Microsoft.Win32.Primitives.dll": {},
"ref/netcoreapp2.0/System.AppContext.dll": {},
"ref/netcoreapp2.0/System.Buffers.dll": {},
project.assets.json 抜粋 続き 2/3
"Microsoft.NETCore.Platforms/2.0.0": {
"type": "package",
"compile": {
"lib/netstandard1.0/_._": {}
},
"runtime": {
"lib/netstandard1.0/_._": {}
}
},
"NETStandard.Library/2.0.0": {
"type": "package",
"dependencies": {
"Microsoft.NETCore.Platforms": "1.1.0"
},
"compile": {
"lib/netstandard1.0/_._": {}
},
"runtime": {
"lib/netstandard1.0/_._": {}
project.assets.json 抜粋 続き 3/3
"NETStandard.Library/2.0.0": {
"sha512":
"7jnbRU+L08FXKMxqUflxEXtVymWvNOrS8yHgu9s6EM8Anr6T/wIX4nZ08j/u3Asz+tCufp3YVwFSEvFTPYm
BPA==",
"type": "package",
"path": "netstandard.library/2.0.0",
"files": [
"LICENSE.TXT",
"THIRD-PARTY-NOTICES.TXT",
"build/NETStandard.Library.targets",
"build/netstandard2.0/NETStandard.Library.targets",
"build/netstandard2.0/ref/Microsoft.Win32.Primitives.dll",
"build/netstandard2.0/ref/System.AppContext.dll",
"build/netstandard2.0/ref/System.Collections.Concurrent.dll",
"build/netstandard2.0/ref/System.Collections.NonGeneric.dll",
"build/netstandard2.0/ref/System.Collections.Specialized.dll",
型を参照するとは何か
using System;
namespace ConsoleApplication
{
public class Program
{
public static void Main(string[] args)
{
Console.WriteLine("Hello World!");
var s = Console.ReadLine();
}
}
}
メタデータ 1/2
Token Version Flags PublicKey Name Culture HashValue
23000001 4.1.0.0 0 b03f5f7f11d50a3a System.Runtime
23000002 4.0.0.0 0 b03f5f7f11d50a3a System.Console
AssemblyRef(0x23)
Token ResolutionScope Name Namespace
01000003 23000001 DebuggableAttribute System.Diagnostics
…
01000008 23000001 Object System
01000009 23000002 Console System
TypeRef(0x01)
TypeRef メタデータは、ResolusionScope によってアセンブリを特定する
AssemblyRef メタデータは、アセンブリ識別子を記録している
メタデータ 2/2
Token ResolutionScope Name Namespace
01000003 23000001 DebuggableAttribute System.Diagnostics
…
01000008 23000001 Object System
01000009 23000002 Console System
TypeRef(0x01)
Token MemberRefParent Name Signature
0a000001 01000001 .ctor 0x20010108 (引数1、I4、void)
…
0a000007 01000009 WriteLine 0x0001010e (引数1、string、void)
0a000008 01000009 ReadLine 0x00000e (引数無し、string)
MemberRef(0x0a)
シグネチャは、メソッドの呼び出し規約、パラメータ、戻り値などを符号化した値
シグネチャによって、オーバーロードされたメソッドを特定できる
Bait and Switch
• 型を参照することをメタデータでは
• アセンブリ参照(アセンブリ識別子)
• 型(クラス)名
• メソッド名とメソッド シグネチャ
• パッケージ システムを使ったテクニック
• コンパイル時は、メタデータのみを解決
• 配布時にプラットフォーム固有のアセンブリに置き換える
• メタデータの特徴を活用したテクニック
• AssemblyRef, TypeRef, MemberRef
まとめ
• .NET Core とは CLI を実装したもの
• CLR と完全に同じではない
• AssemblyLoadContext – AppDomain
• マルチ プラットフォーム対応
• Bait and Switch テクニックによる
• .NET Standard ライブラリ
• API セットによる依存関係管理の仕組み
• Target Platform になることで、Bait and Switch を支援

More Related Content

PDF
【Brocade OpenStack ソリューション】LBaaS プラグイン
PDF
【Brocade OpenStack ソリューション】OpenStack 概要
PDF
DCK Server プロトタイプ
PDF
Kernel overview
PDF
20131211 Neutron Havana
PDF
OpenStackやりたい人、必見!ネットワークから見たOpenStack導入のヒント
PDF
20131212 Okinawa OpenDays OpenStack
PDF
memcached + selinux engine
【Brocade OpenStack ソリューション】LBaaS プラグイン
【Brocade OpenStack ソリューション】OpenStack 概要
DCK Server プロトタイプ
Kernel overview
20131211 Neutron Havana
OpenStackやりたい人、必見!ネットワークから見たOpenStack導入のヒント
20131212 Okinawa OpenDays OpenStack
memcached + selinux engine

Similar to CLI と BCL (20)

PPTX
Dot netcore multiplatform 2
PPTX
.NET Core とマルチプラットフォーム
PDF
Cloud から IoT まで、なんでもおまかせ ~ .NET 5 正式リリース!
PDF
.NET Core と Container, そして Azure Web Apps on Linux による Web アプリ開発最前線
PDF
Linux & Mac OS でも動く! ~ オープンソース & クロスプラットフォーム .NET の歩き方 ~
PPTX
Modern .NET
PPTX
今から始める、Windows 10&新.NETへの移行戦略
PDF
DEV-002_.NET Core/ASP.NET Core が実現するクロスプラットフォーム .NET の今と未来
PDF
.NET Core 1.0
PPTX
今から始める、Windows 10&新.NETへの移行戦略
PDF
Linux & Mac OS でも動く! ~ クロスプラットフォーム対応に見る ASP.NET Core 5 の可能性 ~
PDF
.NET Core 5 ~ Windows, Linux, OS X そして Docker まで ~
PPTX
20170311 Developing & Deploying .NET Core on Linux
PPTX
dotnetconfJP2017_netcore2
PDF
.NET Coreから概観する.NETのOSSへの取り組み
PDF
True Cloud Native Batch Workflow for .NET with MicroBatchFramework
PPTX
.NET vNext
PDF
The Next Generation for C# Developers
PDF
Introduction to VSCode
PPTX
デブサミ2008 .NETの仕組み
Dot netcore multiplatform 2
.NET Core とマルチプラットフォーム
Cloud から IoT まで、なんでもおまかせ ~ .NET 5 正式リリース!
.NET Core と Container, そして Azure Web Apps on Linux による Web アプリ開発最前線
Linux & Mac OS でも動く! ~ オープンソース & クロスプラットフォーム .NET の歩き方 ~
Modern .NET
今から始める、Windows 10&新.NETへの移行戦略
DEV-002_.NET Core/ASP.NET Core が実現するクロスプラットフォーム .NET の今と未来
.NET Core 1.0
今から始める、Windows 10&新.NETへの移行戦略
Linux & Mac OS でも動く! ~ クロスプラットフォーム対応に見る ASP.NET Core 5 の可能性 ~
.NET Core 5 ~ Windows, Linux, OS X そして Docker まで ~
20170311 Developing & Deploying .NET Core on Linux
dotnetconfJP2017_netcore2
.NET Coreから概観する.NETのOSSへの取り組み
True Cloud Native Batch Workflow for .NET with MicroBatchFramework
.NET vNext
The Next Generation for C# Developers
Introduction to VSCode
デブサミ2008 .NETの仕組み
Ad

CLI と BCL

  • 1. CLI と BCL 荒井 省三 日本マイクロソフト株式会社
  • 2. アジェンダ • CLI とは • 共通型システム (CTS) • .NET Standard Library • まとめ
  • 3. 標準化 • Common Language Infrastructure ISO/IEC 2721 ECMA-335 JIS X3016 • Microsoft Open Promise • Microsoft Reference Source • .NET Core - MIT License
  • 4. CLI とは (※) • 第1章 概念とアーキテクチャ • 第2章 メタデータ定義及び意味論 • 第3章 CIL 命令集合 • 第4章 プロファイル及びライブラリ • 第5章 デバッグ情報交換形式 • 第6章 付属書 適用範囲、見本プログラム、CIL アセンブラの実装、 クラス ライブラリの設計ガイドライン、可搬性に関する考察、 厳密でない違反、並列ライブラリ ※JIS X3016 より引用
  • 5. 第 1 章 概念とアーキテクチャ (※) • 6. 共通言語基盤の概要 型安全との関係、管理下駆動実行との関係 • 7. 共通言語仕様 (CLS) • 8. 共通型システム (CTS) • 9. メタデータ • 10. 共通言語仕様のための名前及び型の規則 ※JIS X3016 より引用
  • 6. 6. 共通言語基盤の概要 (※) • 共通型システム (CTS) • メタデータ • 共通言語仕様 (CLS) • 仮想実行システム (VES) 仮想実行システム(VES)はCTSモデルを実装し強制する。VESは, CLIのために書かれたプログラムのロード及び実行を行う。 • CLIのこれらの側面は,分散コンポーネント及びアプリケーション を設計し,開発し,配置し,実行するための統一フレームワークを 形作る。 ※JIS X3016 より引用
  • 7. 第 2 章 メタデータ及び意味論 (※) • 24. メタデータの物理的な配置 PE (Portable Executable) フォーマット ※JIS X3016 より引用 PE ヘッダー PE 拡張ヘッダー メタデータ ヘッダー メタデータ
  • 10. VES の仕組みを考えてみる アセンブリ メタデータ ローダー 実行時クラス情報 EEClass クラス ローダー フィールド データ インスタンス メソッド テーブル メソッドA メソッドB メソッドC … CIL テーブル 実装A 実装B 実装C … Native Cache 実装A 実装B 実装C … JIT 実行時クラス インスタンス
  • 11. VES の特徴 • ターゲットを特定していない仮想実行システム • アセンブリ (PE フォーマット) をロードする • 管理下データ (Managed Data) = GC • 型安全 (Type Safe) = スタック ウォークなど • アプリケーション ドメインが実行単位 CLRは、アプリ、Shared、System の 3ドメイン • コードの最適化 = JIT による実行時の最適化 ターゲット プラットフォームごとに異なる JIT 実装が可能 AOT や NGEN は、実行時の最適化ではない
  • 12. 1.8 共通型システム • 目的:関数型、手続型、オブジェクト指向にも提供される 型 値型 参照型 AppDomain 内の同一性 AssemblyLoadContext Built-in 利用者定義 自己記述 Interface ポインタ Built-in delegate array 基底クラスは、System.Object CLR は mscorlib.dll、CoreCLR 2.x は System.Private.CoreLib.dll Object String
  • 13. .NET Standard とは何か • BCL あるいは FCL を置き換えるための仕様 • パッケージの依存関係を管理するためのメタ パッケージ • CoreFx のアセンブリ群は、細分化されたパッケージで構成 • バージョンは、各パッケージの開発ペースで変化 • ターゲット プラットフォーム単位にサポート バージョンを定義 • 2.0 と 1.6 では仕組みが大幅に変更となった
  • 14. .NET Core と Target Platform • 対象フレームワークに応じてメタ パッケージを決定 対象フレームワーク 最新Ver フレームワーク モニカ NET Standard メタ パッケージ .NET Standard 2.0 netstandard2.0 N/A NETStandard.Library Net Core App 2.0 netcoreapp2.0 2.0 Microsoft.NetCore.App .NET Framework 4.7.1 net47 1.5 N/A
  • 15. .NET Core とパッケージ • ターゲット プラットフォーム • メタ パッケージを決定 • メタ パッケージ • パッケージの依存関係を定義 • .NET Standard 2.0 では状況が異なる • パッケージ • nuget パッケージ • マルチ プラットフォーム サポート • Runtime.json による プラットフォーム識別子
  • 16. test.csproj • フレームワークを 「netcoreapp2.0」と定義 • Microsoft.NET.Sdk が、.NET Core SDK を意味する <Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>netcoreapp2.0</TargetFramework> </PropertyGroup> </Project>
  • 17. project.assets.json 抜粋 1/3 { "version": 3, "targets": { ".NETCoreApp,Version=v2.0": { "Microsoft.NETCore.App/2.0.0": { "type": "package", "dependencies": { "Microsoft.NETCore.DotNetHostPolicy": "2.0.0", "Microsoft.NETCore.Platforms": "2.0.0", "NETStandard.Library": "2.0.0" }, "compile": { "ref/netcoreapp2.0/Microsoft.CSharp.dll": {}, "ref/netcoreapp2.0/Microsoft.VisualBasic.dll": {}, "ref/netcoreapp2.0/Microsoft.Win32.Primitives.dll": {}, "ref/netcoreapp2.0/System.AppContext.dll": {}, "ref/netcoreapp2.0/System.Buffers.dll": {},
  • 18. project.assets.json 抜粋 続き 2/3 "Microsoft.NETCore.Platforms/2.0.0": { "type": "package", "compile": { "lib/netstandard1.0/_._": {} }, "runtime": { "lib/netstandard1.0/_._": {} } }, "NETStandard.Library/2.0.0": { "type": "package", "dependencies": { "Microsoft.NETCore.Platforms": "1.1.0" }, "compile": { "lib/netstandard1.0/_._": {} }, "runtime": { "lib/netstandard1.0/_._": {}
  • 19. project.assets.json 抜粋 続き 3/3 "NETStandard.Library/2.0.0": { "sha512": "7jnbRU+L08FXKMxqUflxEXtVymWvNOrS8yHgu9s6EM8Anr6T/wIX4nZ08j/u3Asz+tCufp3YVwFSEvFTPYm BPA==", "type": "package", "path": "netstandard.library/2.0.0", "files": [ "LICENSE.TXT", "THIRD-PARTY-NOTICES.TXT", "build/NETStandard.Library.targets", "build/netstandard2.0/NETStandard.Library.targets", "build/netstandard2.0/ref/Microsoft.Win32.Primitives.dll", "build/netstandard2.0/ref/System.AppContext.dll", "build/netstandard2.0/ref/System.Collections.Concurrent.dll", "build/netstandard2.0/ref/System.Collections.NonGeneric.dll", "build/netstandard2.0/ref/System.Collections.Specialized.dll",
  • 20. 型を参照するとは何か using System; namespace ConsoleApplication { public class Program { public static void Main(string[] args) { Console.WriteLine("Hello World!"); var s = Console.ReadLine(); } } }
  • 21. メタデータ 1/2 Token Version Flags PublicKey Name Culture HashValue 23000001 4.1.0.0 0 b03f5f7f11d50a3a System.Runtime 23000002 4.0.0.0 0 b03f5f7f11d50a3a System.Console AssemblyRef(0x23) Token ResolutionScope Name Namespace 01000003 23000001 DebuggableAttribute System.Diagnostics … 01000008 23000001 Object System 01000009 23000002 Console System TypeRef(0x01) TypeRef メタデータは、ResolusionScope によってアセンブリを特定する AssemblyRef メタデータは、アセンブリ識別子を記録している
  • 22. メタデータ 2/2 Token ResolutionScope Name Namespace 01000003 23000001 DebuggableAttribute System.Diagnostics … 01000008 23000001 Object System 01000009 23000002 Console System TypeRef(0x01) Token MemberRefParent Name Signature 0a000001 01000001 .ctor 0x20010108 (引数1、I4、void) … 0a000007 01000009 WriteLine 0x0001010e (引数1、string、void) 0a000008 01000009 ReadLine 0x00000e (引数無し、string) MemberRef(0x0a) シグネチャは、メソッドの呼び出し規約、パラメータ、戻り値などを符号化した値 シグネチャによって、オーバーロードされたメソッドを特定できる
  • 23. Bait and Switch • 型を参照することをメタデータでは • アセンブリ参照(アセンブリ識別子) • 型(クラス)名 • メソッド名とメソッド シグネチャ • パッケージ システムを使ったテクニック • コンパイル時は、メタデータのみを解決 • 配布時にプラットフォーム固有のアセンブリに置き換える • メタデータの特徴を活用したテクニック • AssemblyRef, TypeRef, MemberRef
  • 24. まとめ • .NET Core とは CLI を実装したもの • CLR と完全に同じではない • AssemblyLoadContext – AppDomain • マルチ プラットフォーム対応 • Bait and Switch テクニックによる • .NET Standard ライブラリ • API セットによる依存関係管理の仕組み • Target Platform になることで、Bait and Switch を支援