SlideShare a Scribd company logo
1 of 30
Download to read offline
C++20 モジュールの概要
2019-06-26
C++ MIX #4
Tetsuro Matsumura
目次
1. モジュール、インポート、
エクスポート
2. モジュール実装
3. モジュールパーティション
4. グローバルモジュール
5. 後方互換性のための機能
6. モジュールリンケージ
7. モジュールのビルド
1
Modules
2
C++20では、ヘッダーファイルに代わる仕組みとしてモジュールが導入され、
プリプロセッサを用いずにプログラムを分割できる。 (P1103R3)
それぞれの場合について、モジュールによる分割へ移行するとどうなるか、
サンプルコードと共に紹介する。
 ヘッダーファイル1つの場合
 ヘッダーファイル1つとソースファイル1つの場合
 複数のヘッダーファイルの場合
 複数のヘッダーファイルとソースファイルの場合
※ モジュールをすべて実装した処理系はまだ無いので動かない可能性があります
ヘッダーファイル1つの場合
3
// datetime.h
#ifndef LIB_DATETIME_H
#define LIB_DATETIME_H
namespace lib {
class Date {
private:
int year=0,month=0,day=0;
public:
// ...
};
}
#endif
// datetime.cpp
export module lib.datetime;
export namespace lib {
class Date {
private:
int year=0,month=0,day=0;
public:
// ...
};
}
// main.cpp
#include "datetime.h“
int main() {
lib::Date cppmix4{2019, 6, 26};
}
// main.cpp
import lib.datetime;
int main() {
lib::Date cppmix4{2019, 6, 26};
}
インポート宣言
モジュール宣言
エクスポート宣言
モジュール宣言とモジュールユニット
4
モジュール宣言は翻訳単位の先頭で一回だけ書くことができる。
export module lib.datetime;
モジュール宣言を含む翻訳単位をモジュールユニットという。
 モジュール名にはドットが使えるが、特別な意味はない。
モジュールユニットの分類
5
モジュール宣言の書式によって4つに分類できる(詳しくは後述)
export module lib.datetime;
モジュールインターフェースユニット
module lib.datetime;
モジュール実装ユニット
export module lib.datetime:date;
モジュールインターフェース
パーティション
module lib.datetime:date;
モジュール実装パーティション
エクスポート宣言
6
モジュールインターフェースユニット内では、宣言をエクスポートできる。
export (宣言)
export { (宣言)… }
エクスポートできる宣言は、変数・関数・型・名前空間・テンプレート・インポートなど。
(構文上は、どんな宣言でもexportは付けられる)
export {…}で囲むと、まとめてエクスポートできる(スコープは作らない)。
インポート宣言
7
インポートした翻訳単位でエクスポートしている宣言は見えるようになる。
 マクロは取り込まれない
 using namespaceは取り込まれない (using namespace std し放題)
// main.cpp
import lib.datetime;
int main() {
lib::Date cppmix4{2019, 6, 26};
}
インポート宣言によってモジュールインターフェースユニットをインポートする。
8
補足: 「見える」と「到達可能」およびODRの緩和
宣言が見える(visible)とは、その宣言が名前探索で見つかることをいう。
宣言が到達可能(reachable)とは、その宣言の意味論的な性質(semantic property)が使え
ることをいう。
• 例えば、クラス定義はクラスの完全性という性質があり、クラス定義に到達可能なとき、
クラスは完全である。
モジュールインターフェースユニットをインポートすると、
すべての宣言が到達可能となり、エクスポートしている宣言は見えるようになる。
このように、見える宣言は到達可能であるが、逆は成立しない。
C++20では定義が複数あっても、同時に到達可能にならなければODR違反ではない。
(注:すべての定義は宣言である)
再エクスポート
9
このようなモジュールをインポートすると、
再エクスポートしているモジュールも同時にインポートする。
export module lib;
export import lib.datetime;
インポート宣言をエクスポートすることを再エクスポートという。
ヘッダーファイル1つとソースファイル1つの場合
10
// datetime.h
#ifndef LIB_DATETIME_H
#define LIB_DATETIME_H
class Date {
private:
int year=0,month=0,day=0;
public:
Date() = default;
Date(int year, int month, int day);
};
#endif
// datetime.cpp
export module lib.datetime;
export class Date {
private:
int year=0,month=0,day=0;
public:
Date() = default;
Date(int year, int month, int day);
};
// datetime_impl.cpp
module lib.datetime;
Date::Date(int y, int m, int d)
: year(y)
, month(m)
, day(d)
{}
// datetime.cpp
#include "datetime.h"
Date::Date(int y, int m, int d)
: year(y)
, month(m)
, day(d)
{}
インターフェースと実装
11
モジュールはインターフェースと実装に分けることができる。
モジュール実装ユニットは、モジュールインターフェースを暗黙的にインポートする。
モジュールインターフェースユニットはモジュールにつきただ1つ存在する。
モジュール実装ユニットの個数は任意。
モジュール実装ユニットではエクスポートができない。
export module lib.datetime;
モジュールインターフェースユニット
→ ヘッダーファイルに相当
export可
module lib.datetime;
モジュール実装ユニット
→ ソースファイルに相当
export不可
module lib.datetime;
module lib.datetime;
複数のヘッダーファイルの場合
12
// date.h
#ifndef LIB_DATE_H
#define LIB_DATE_H
class Date {
private:
int year=0,month=0,day=0;
public:
// ...
};
#endif
// date.cpp
export module lib.datetime:date;
export class Date {
private:
int year=0,month=0,day=0;
public:
// ...
};
// datetime.h
#include "date.h"
#include "time.h"
// datetime.cpp
export module lib.datetime;
export import :date;
export import :time;
モジュールパーティション
13
モジュールは部分的なモジュール(パーティション)に分けることができる。
モジュールパーティションは別のモジュールからインポートできず、
同一モジュール内でのみインポートできる。
 このとき、エクスポートしていない宣言も見えるようになる。
export module lib.datetime;
export import :date;
(プライマリー)
モジュールインターフェースユニット
export module lib.datetime:date;
モジュールインターフェース
パーティション
14
補足: パーティションの再エクスポート
プライマリーモジュールインターフェースユニットは、すべてのモジュールインター
フェースパーティションを再エクスポートしなければならない。そうでない場合はill-
formedだが、診断はされない。
これにより、モジュールインターフェースパーティションでエクスポートした宣言は、外
部からも見えるようになる。
複数のヘッダーファイルとソースファイルの場合
15
// date.h
#ifndef LIB_DATE_H
#define LIB_DATE_H
class Date {
private:
int year=0,month=0,day=0;
public:
// ...
};
#endif
// date.cpp
export module lib.datetime:date;
export class Date {
private:
int year=0,month=0,day=0;
public:
// ...
};
// datetime.h
#include "date.h"
#include "time.h"
// datetime.cpp
export module lib.datetime;
export import :date;
export import :time;
// date.cpp
#include "date.h"
// ...
// date_impl.cpp
module lib.datetime:date_impl;
// ...
モジュール実装パーティション
16
モジュールパーティションかつモジュール実装でもある翻訳単位も作れる。
モジュール実装パーティションは再エクスポートできない。
export module lib.datetime:date;
モジュールインターフェース
パーティション
export可
module lib.datetime:date;
モジュール実装パーティション
export不可
モジュール内外の依存関係
17
export module lib.datetime;
(プライマリー)モジュールインターフェースユニット
module lib.datetime;
モジュール実装ユニット
export module lib.datetime:date;
モジュールインターフェース
パーティション
module lib.datetime:impl;
モジュール実装パーティション
暗黙的インポート
インポート
インポート・
再エクスポート
外部からのインポート
パーティションはいつ使う?
18
モジュールパーティションの存在は外部からはわからないので、
 ソースファイルが長いので分けたい場合
 ユーザーにモジュールが分かれていることを意識させたくない場合
単独でも使用できるなら、独立したモジュールにしたほうが良い。
その他の機能の紹介
19
グローバルモジュール
20
名前のあるモジュールに属していない宣言は、グローバルモジュールに属している。
グローバルモジュールは名前が無く、インポートできない。
グローバルモジュールではエクスポート宣言はできない。
// datetime.cpp
export module lib.datetime;
// ...
// main.cpp
import lib.datetime;
int main() {
lib::Date cppmix4{2019, 6, 26};
}
lib.datetimeモジュール
グローバルモジュール
後方互換性のための機能
21
従来のヘッダーファイルによって提供されるライブラリのための機能が追加された。
 グローバルモジュールフラグメント
モジュール本体への影響が少ないようにインクルードできる機能
 ヘッダーユニット
ヘッダーファイルをモジュールとしてインポートできる機能
(一部のヘッダーファイルのみ)
グローバルモジュールフラグメント
22
モジュール宣言の前にグローバルモジュールの実装を書ける機能。
グローバルモジュールフラグメント内の宣言は、後続のモジュールには属さない。
グローバルモジュールフラグメントでは、
プリプロセッサディレクティブ以外は書くことができない。
module;
#include <iostream>
export module foo;
#include "lib.h"
void f() { std::cout << "foo" << std::endl; }
グローバル
モジュール
fooモジュール
ヘッダーユニット
23
特定のヘッダーファイルをモジュールとしてインポートできる機能。
効果は#includeとほぼ同じ。
どのヘッダーファイルをインポートできるのかは処理系定義である。
インポートできるヘッダーファイルを#includeすると、importに置き換わる。
export module foo;
import <iostream>;
void f() { std::cout << "foo" << std::endl; }
モジュールリンケージ
24
C++20では、新たにモジュールリンケージが追加された。
(グローバルモジュール以外の)モジュール内で
エクスポートしていない名前はモジュールリンケージを持つ。
エクスポートしている名前は外部リンケージを持つ。
モジュールリンケージを持つ名前は同一モジュール内で参照できる。
モジュールのビルド
25
モジュールのビルドの仕方 (※処理系定義)
26
一般に、モジュールは依存関係の順にコンパイルしなければならない。
#include と違って、どのソースファイルからでもコンパイルできるわけではない。
コンパイルしたモジュールは何らかの中間表現で保存され、再利用される。
モジュールをインポートする前にコンパイル済みモジュールを生成する必要がある。
モジュールは #include を置き換える仕組みであり、
(DLLなどの意味で)ライブラリの分割には関与しない。
ただし、モジュールをライブラリ分割にも活用するような処理系はありえる。
(例: MSVC)
モジュールインターフェースユニットで dllexport すると、
インポートしたとき dllimport になる
27
補足: モジュールのコンパイル条件が違う場合
モジュールは事前にコンパイルしておく必要があるので、
プリプロセスの結果は事前コンパイル時の結果に固定される。
(処理系依存)
処理系によっては、モジュールをコンパイルしたときのオプションがコンパイル済みモ
ジュールに記録され、異なるオプションでコンパイルしているときはインポートできない。
(例: MSVC)
このような処理系では、コンパイル済みモジュールをオプション別のディレクトリに格納
し、パスを切り替えるなどの運用が必要。
モジュールはプリコンパイルドヘッダーを標準化したものではないが、
処理系の実装上は似たようなものになっていることがある。
28
補足: モジュールでビルドは速くなるか
モジュールによってビルドが速くなる要因は次の通り。
• #includeと違ってコードが展開されないので、解析が速くなる
一方、ビルドが遅くなる要因もある。
• モジュールの依存関係順にコンパイルする必要があるので、並列化しにくくなる
実際はどちらが効くかによって変わる。P1441R1 でベンチマークが行われている。
• ジョブ数が増えるに従ってモジュールの方が遅くなるが、一般的なPCではモジュールの
方が速いと考えて問題なさそうである。
29
まとめ
 #includeに代わる仕組みとしてモジュールが導入された
 プリプロセッサを用いずにプログラムを分割できる
 ファイル構成はそれほど変わらない
ヘッダーファイル ≃ モジュールインターフェースユニット
ソースファイル ≃ モジュール実装ユニット

More Related Content

What's hot

組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由kikairoya
 
Effective Modern C++ 勉強会 Item 22
Effective Modern C++ 勉強会 Item 22Effective Modern C++ 勉強会 Item 22
Effective Modern C++ 勉強会 Item 22Keisuke Fukuda
 
Intro to SVE 富岳のA64FXを触ってみた
Intro to SVE 富岳のA64FXを触ってみたIntro to SVE 富岳のA64FXを触ってみた
Intro to SVE 富岳のA64FXを触ってみたMITSUNARI Shigeo
 
async/await のしくみ
async/await のしくみasync/await のしくみ
async/await のしくみ信之 岩永
 
ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門Fixstars Corporation
 
C++ マルチスレッドプログラミング
C++ マルチスレッドプログラミングC++ マルチスレッドプログラミング
C++ マルチスレッドプログラミングKohsuke Yuasa
 
Linuxの2038年問題を調べてみた
Linuxの2038年問題を調べてみたLinuxの2038年問題を調べてみた
Linuxの2038年問題を調べてみたwata2ki
 
Observableで非同期処理
Observableで非同期処理Observableで非同期処理
Observableで非同期処理torisoup
 
BuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルドBuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルドAkihiro Suda
 
いつやるの?Git入門 v1.1.0
いつやるの?Git入門 v1.1.0いつやるの?Git入門 v1.1.0
いつやるの?Git入門 v1.1.0Masakazu Matsushita
 
Nervesが開拓する「ElixirでIoT」の新世界
Nervesが開拓する「ElixirでIoT」の新世界Nervesが開拓する「ElixirでIoT」の新世界
Nervesが開拓する「ElixirでIoT」の新世界Hideki Takase
 
関数型プログラミングのデザインパターンひとめぐり
関数型プログラミングのデザインパターンひとめぐり関数型プログラミングのデザインパターンひとめぐり
関数型プログラミングのデザインパターンひとめぐりKazuyuki TAKASE
 
こわくない Git
こわくない Gitこわくない Git
こわくない GitKota Saito
 
【CEDEC2018】一歩先のUnityでのパフォーマンス/メモリ計測、デバッグ術
【CEDEC2018】一歩先のUnityでのパフォーマンス/メモリ計測、デバッグ術【CEDEC2018】一歩先のUnityでのパフォーマンス/メモリ計測、デバッグ術
【CEDEC2018】一歩先のUnityでのパフォーマンス/メモリ計測、デバッグ術Unity Technologies Japan K.K.
 
Constexpr 中3女子テクニック
Constexpr 中3女子テクニックConstexpr 中3女子テクニック
Constexpr 中3女子テクニックGenya Murakami
 
最新C++事情 C++14-C++20 (2018年10月)
最新C++事情 C++14-C++20 (2018年10月)最新C++事情 C++14-C++20 (2018年10月)
最新C++事情 C++14-C++20 (2018年10月)Akihiko Matuura
 
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭するCEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭するYoshifumi Kawai
 

What's hot (20)

組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由
 
Effective Modern C++ 勉強会 Item 22
Effective Modern C++ 勉強会 Item 22Effective Modern C++ 勉強会 Item 22
Effective Modern C++ 勉強会 Item 22
 
C++ マルチスレッド 入門
C++ マルチスレッド 入門C++ マルチスレッド 入門
C++ マルチスレッド 入門
 
Intro to SVE 富岳のA64FXを触ってみた
Intro to SVE 富岳のA64FXを触ってみたIntro to SVE 富岳のA64FXを触ってみた
Intro to SVE 富岳のA64FXを触ってみた
 
Glibc malloc internal
Glibc malloc internalGlibc malloc internal
Glibc malloc internal
 
async/await のしくみ
async/await のしくみasync/await のしくみ
async/await のしくみ
 
ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門
 
C++ マルチスレッドプログラミング
C++ マルチスレッドプログラミングC++ マルチスレッドプログラミング
C++ マルチスレッドプログラミング
 
Linuxの2038年問題を調べてみた
Linuxの2038年問題を調べてみたLinuxの2038年問題を調べてみた
Linuxの2038年問題を調べてみた
 
Observableで非同期処理
Observableで非同期処理Observableで非同期処理
Observableで非同期処理
 
BuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルドBuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルド
 
いつやるの?Git入門 v1.1.0
いつやるの?Git入門 v1.1.0いつやるの?Git入門 v1.1.0
いつやるの?Git入門 v1.1.0
 
Nervesが開拓する「ElixirでIoT」の新世界
Nervesが開拓する「ElixirでIoT」の新世界Nervesが開拓する「ElixirでIoT」の新世界
Nervesが開拓する「ElixirでIoT」の新世界
 
関数型プログラミングのデザインパターンひとめぐり
関数型プログラミングのデザインパターンひとめぐり関数型プログラミングのデザインパターンひとめぐり
関数型プログラミングのデザインパターンひとめぐり
 
こわくない Git
こわくない Gitこわくない Git
こわくない Git
 
プログラムを高速化する話
プログラムを高速化する話プログラムを高速化する話
プログラムを高速化する話
 
【CEDEC2018】一歩先のUnityでのパフォーマンス/メモリ計測、デバッグ術
【CEDEC2018】一歩先のUnityでのパフォーマンス/メモリ計測、デバッグ術【CEDEC2018】一歩先のUnityでのパフォーマンス/メモリ計測、デバッグ術
【CEDEC2018】一歩先のUnityでのパフォーマンス/メモリ計測、デバッグ術
 
Constexpr 中3女子テクニック
Constexpr 中3女子テクニックConstexpr 中3女子テクニック
Constexpr 中3女子テクニック
 
最新C++事情 C++14-C++20 (2018年10月)
最新C++事情 C++14-C++20 (2018年10月)最新C++事情 C++14-C++20 (2018年10月)
最新C++事情 C++14-C++20 (2018年10月)
 
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭するCEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
 

Similar to C++20 モジュールの概要 / Introduction to C++ modules (part 1)

Code igniterでテスト駆動開発 資料作成中
Code igniterでテスト駆動開発 資料作成中Code igniterでテスト駆動開発 資料作成中
Code igniterでテスト駆動開発 資料作成中Takako Miyagawa
 
2015 0227 OSC-Spring Tokyo NETMF
2015 0227 OSC-Spring Tokyo NETMF2015 0227 OSC-Spring Tokyo NETMF
2015 0227 OSC-Spring Tokyo NETMFAtomu Hidaka
 
成長できるエンタープライズシステムを目指して-OSGiによるモジュール型アーキテクチャの実現-
成長できるエンタープライズシステムを目指して-OSGiによるモジュール型アーキテクチャの実現-成長できるエンタープライズシステムを目指して-OSGiによるモジュール型アーキテクチャの実現-
成長できるエンタープライズシステムを目指して-OSGiによるモジュール型アーキテクチャの実現-Hiroki Kondo
 
はじめてのCodeIgniter
はじめてのCodeIgniterはじめてのCodeIgniter
はじめてのCodeIgniterYuya Matsushima
 
php-src の歩き方
php-src の歩き方php-src の歩き方
php-src の歩き方do_aki
 
Groovy base gradle_20130309
Groovy base gradle_20130309Groovy base gradle_20130309
Groovy base gradle_20130309Nobuhiro Sue
 
20121115 fukuoka sublime0_kuroneko
20121115 fukuoka sublime0_kuroneko20121115 fukuoka sublime0_kuroneko
20121115 fukuoka sublime0_kuronekoKohki Nakashima
 
Hyperledgerのチュートリアルで理解する基幹システム向けブロックチェーンハンズオン
Hyperledgerのチュートリアルで理解する基幹システム向けブロックチェーンハンズオンHyperledgerのチュートリアルで理解する基幹システム向けブロックチェーンハンズオン
Hyperledgerのチュートリアルで理解する基幹システム向けブロックチェーンハンズオン健一 茂木
 
バージョン管理システムチュートリアル
バージョン管理システムチュートリアルバージョン管理システムチュートリアル
バージョン管理システムチュートリアルRyo Igarashi
 
今から始める、Windows 10&新.NETへの移行戦略
今から始める、Windows 10&新.NETへの移行戦略今から始める、Windows 10&新.NETへの移行戦略
今から始める、Windows 10&新.NETへの移行戦略信之 岩永
 
Cloud Foundry構成概要 111018
Cloud Foundry構成概要 111018Cloud Foundry構成概要 111018
Cloud Foundry構成概要 111018Uemura Yuichi
 
hubotで快適BOT生活
hubotで快適BOT生活 hubotで快適BOT生活
hubotで快適BOT生活 Kazufumi Otani
 
The Twelve-Factor (A|M)pp with C#
The Twelve-Factor (A|M)pp with C#The Twelve-Factor (A|M)pp with C#
The Twelve-Factor (A|M)pp with C#Yuta Matsumura
 
NPAPIを使ったandroid標準ブラウザの拡張方法
NPAPIを使ったandroid標準ブラウザの拡張方法NPAPIを使ったandroid標準ブラウザの拡張方法
NPAPIを使ったandroid標準ブラウザの拡張方法Naruto TAKAHASHI
 
オープン・ソースで構築するARMマイコン開発環境 ―― GCC,Eclipse,OpenOCDで統合開発環境,JTAGデバッグもできる!
オープン・ソースで構築するARMマイコン開発環境 ―― GCC,Eclipse,OpenOCDで統合開発環境,JTAGデバッグもできる!オープン・ソースで構築するARMマイコン開発環境 ―― GCC,Eclipse,OpenOCDで統合開発環境,JTAGデバッグもできる!
オープン・ソースで構築するARMマイコン開発環境 ―― GCC,Eclipse,OpenOCDで統合開発環境,JTAGデバッグもできる!Masaki Muranaka
 

Similar to C++20 モジュールの概要 / Introduction to C++ modules (part 1) (20)

Code ignitertalk 01
Code ignitertalk 01Code ignitertalk 01
Code ignitertalk 01
 
Clang Modules
Clang ModulesClang Modules
Clang Modules
 
Code igniterでテスト駆動開発 資料作成中
Code igniterでテスト駆動開発 資料作成中Code igniterでテスト駆動開発 資料作成中
Code igniterでテスト駆動開発 資料作成中
 
2015 0227 OSC-Spring Tokyo NETMF
2015 0227 OSC-Spring Tokyo NETMF2015 0227 OSC-Spring Tokyo NETMF
2015 0227 OSC-Spring Tokyo NETMF
 
成長できるエンタープライズシステムを目指して-OSGiによるモジュール型アーキテクチャの実現-
成長できるエンタープライズシステムを目指して-OSGiによるモジュール型アーキテクチャの実現-成長できるエンタープライズシステムを目指して-OSGiによるモジュール型アーキテクチャの実現-
成長できるエンタープライズシステムを目指して-OSGiによるモジュール型アーキテクチャの実現-
 
はじめてのCodeIgniter
はじめてのCodeIgniterはじめてのCodeIgniter
はじめてのCodeIgniter
 
php-src の歩き方
php-src の歩き方php-src の歩き方
php-src の歩き方
 
sveltekit-ja.pdf
sveltekit-ja.pdfsveltekit-ja.pdf
sveltekit-ja.pdf
 
Groovy base gradle_20130309
Groovy base gradle_20130309Groovy base gradle_20130309
Groovy base gradle_20130309
 
20121115 fukuoka sublime0_kuroneko
20121115 fukuoka sublime0_kuroneko20121115 fukuoka sublime0_kuroneko
20121115 fukuoka sublime0_kuroneko
 
Hyperledgerのチュートリアルで理解する基幹システム向けブロックチェーンハンズオン
Hyperledgerのチュートリアルで理解する基幹システム向けブロックチェーンハンズオンHyperledgerのチュートリアルで理解する基幹システム向けブロックチェーンハンズオン
Hyperledgerのチュートリアルで理解する基幹システム向けブロックチェーンハンズオン
 
バージョン管理システムチュートリアル
バージョン管理システムチュートリアルバージョン管理システムチュートリアル
バージョン管理システムチュートリアル
 
今から始める、Windows 10&新.NETへの移行戦略
今から始める、Windows 10&新.NETへの移行戦略今から始める、Windows 10&新.NETへの移行戦略
今から始める、Windows 10&新.NETへの移行戦略
 
Cloud Foundry構成概要 111018
Cloud Foundry構成概要 111018Cloud Foundry構成概要 111018
Cloud Foundry構成概要 111018
 
Odl intro20141029
Odl intro20141029Odl intro20141029
Odl intro20141029
 
hubotで快適BOT生活
hubotで快適BOT生活 hubotで快適BOT生活
hubotで快適BOT生活
 
osakapy 2014.05 LT
osakapy 2014.05 LTosakapy 2014.05 LT
osakapy 2014.05 LT
 
The Twelve-Factor (A|M)pp with C#
The Twelve-Factor (A|M)pp with C#The Twelve-Factor (A|M)pp with C#
The Twelve-Factor (A|M)pp with C#
 
NPAPIを使ったandroid標準ブラウザの拡張方法
NPAPIを使ったandroid標準ブラウザの拡張方法NPAPIを使ったandroid標準ブラウザの拡張方法
NPAPIを使ったandroid標準ブラウザの拡張方法
 
オープン・ソースで構築するARMマイコン開発環境 ―― GCC,Eclipse,OpenOCDで統合開発環境,JTAGデバッグもできる!
オープン・ソースで構築するARMマイコン開発環境 ―― GCC,Eclipse,OpenOCDで統合開発環境,JTAGデバッグもできる!オープン・ソースで構築するARMマイコン開発環境 ―― GCC,Eclipse,OpenOCDで統合開発環境,JTAGデバッグもできる!
オープン・ソースで構築するARMマイコン開発環境 ―― GCC,Eclipse,OpenOCDで統合開発環境,JTAGデバッグもできる!
 

C++20 モジュールの概要 / Introduction to C++ modules (part 1)