SlideShare une entreprise Scribd logo
1  sur  12
Télécharger pour lire hors ligne
METAPROGRAMMING IN
C++
MITSUTAKA TAKEDA
MITSUTAKA.TAKEDA@GMAIL.COM
TABLE OF CONTENTS
1. Metaprogrammingとは?
2. コンパイル時数値計算
2.1. 寄り道(C++14)
3. 今日の進め方
4. 次元解析(コンパイル時数値計算 & 型操作)
4.1. Murphy's law
5. 直列化コードの生成(Generative Programming)
5.1. Virtues of Programmer & Style
6. キーワード
7. 参考情報
1 METAPROGRAMMINGとは?
"a program about a program"
プログラムを操作するコード。
コンパイル時数値計算
型操作
Generative Programming(コード生成)
2 コンパイル時数値計算
2進数リテラルのシミュレーション。
template <unsigned long N>
struct binary {
static_assert((N%10 == 0) || (N%10 == 1), "N is not binary literal!");
// 再帰
static unsigned const value = binary<N/10>::value * 2 + N%10;
};
template <> // 特殊化。再帰の基底。
struct binary<0> {
static unsigned const value = 0;
};
static_assert(1 == binary<1>::value);
static_assert(3 == binary<11>::value);
static_assert(5 == binary<101>::value);
static_assert(7 == binary<111>::value);
static_assert(9 == binary<1001>::value);
// static_assert(9 == binary<9>::value); // 2進数でないのでコンパイル・エラー。
2.1 寄り道(C++14)
// constexprでコンパイル時数値計算は楽に。
constexpr
auto binary(unsigned long n){
assert((n % 10 == 0) || (n % 10 == 1));
if(n == 0) return 0ul;
return binary(n/10) * 2 + (n % 10);
}
// バイナリ・リテラルをそもそもサポート。。。
static_assert(0b1 == binary(1)); // この形式のstatic_assertはC++1Zから。
static_assert(0b10001 == binary(10001));
3 今日の進め方
エンジニアはコードで語る!
導入でモチベーションの話、その後コード・リーディング。
4 次元解析(コンパイル時数値
計算 & 型操作)
バナナ + ゴリラ = ?
0バナナ? 1バナナ&1ゴリラ?
バナナとゴリラは足せません!
4.1 MURPHY'S LAW
Anything that can go wrong, will go wrong.
バナナとゴリラは足さないかもしれませんが。。。
double distanceFromStationToHo = ...;
double timeFromStationToHo = ...;
double distanceFromHoToLab = ...;
double timeFromHoToLab = ...;
// 平均の歩く速さを計算する。
double walkingSpeedAvg = distanceFromStationToHo + distanceFromHoToLab/timeFromHoToLab;
// 過去の歩く速さから分散と標準を計算。
recode.push_back(walkingSpeedAvg);
double avg = sum(recode)/recode.size();
double var = accumulate(recode, [avg](auto x) { return square(x - avg); })/recode.size();
5 直列化コードの生成
(GENERATIVE PROGRAMMING)
ゴール: 構造体を定義し、その型をシリアライズ・デシリアライズす
るコードを生成する。
enum class msg_type_t : uint8_t {
request;
response;
};
struct header {
uint8_t magic_byte; // 質問。コイツは構造体のメンバ変数である必要はあるか?
uint8_t version; // プロトコル・バージョン。メンバ変数?
uint32_t length; // メッセージ・サイズ。
msg_type_t type; // メッセージ・タイプ。
};
// 上のユーザ型を定義すると同時に以下のような直列化コードを生成したい。
header h0 = read(buffer);// バッファ(バイト列)からheader型のオブジェクトを読み込む。
header h1 = ...;
write(buffer, h1); //header型オブジェクトをバイト列に変換しバッファへ書き込む。
5.1 VIRTUES OF PROGRAMMER & STYLE
Laziness!
プログラマは怠け者。自分でコード書きたくない。
IDE駆動: コード補完、自動テンプレート実装
トライ&エラーのコストが低い
More Code & (Possibly) More Bugs
TextEditor駆動: シンキング & タイピング
正しい抽象化を見つけるのが難しい。(どのように関数を組み
立てたかに注目)
Less Code & (Possibly) Less Bugs
Productivity:
"I wrote N lines of code today."
Much greater productivity:
"I eliminated N lines of code today."
Leslie Lamport@ Programming Should Be More than Coding
6 キーワード
Boost Fusion/Asio
Concept
Generative Programming
IIFE(Immediately-Invoked Function Expression)
SFINAE(Substitution Failure Is Not An Error)
constexpr
7 参考情報

Contenu connexe

Similaire à Metaprogramming

(ゲームじゃない方の)switchで遊びたい話
(ゲームじゃない方の)switchで遊びたい話(ゲームじゃない方の)switchで遊びたい話
(ゲームじゃない方の)switchで遊びたい話Masanori Masui
 
TokyoR24 - PerformanceRvsC#
TokyoR24 - PerformanceRvsC#TokyoR24 - PerformanceRvsC#
TokyoR24 - PerformanceRvsC#ta2c
 
Python physicalcomputing
Python physicalcomputingPython physicalcomputing
Python physicalcomputingNoboru Irieda
 
【SQiP2014】システム操作インターフェイス最適化によるテスト自動化ROI向上
【SQiP2014】システム操作インターフェイス最適化によるテスト自動化ROI向上【SQiP2014】システム操作インターフェイス最適化によるテスト自動化ROI向上
【SQiP2014】システム操作インターフェイス最適化によるテスト自動化ROI向上Tatsuya Ishikawa
 
CAP Custom Handlers をクリーンにしよう
CAP Custom Handlers をクリーンにしようCAP Custom Handlers をクリーンにしよう
CAP Custom Handlers をクリーンにしようksugi
 
新しい並列for構文のご提案
新しい並列for構文のご提案新しい並列for構文のご提案
新しい並列for構文のご提案yohhoy
 
Rtm講習会 140626 02
Rtm講習会 140626 02Rtm講習会 140626 02
Rtm講習会 140626 02openrtm
 
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)NTT DATA Technology & Innovation
 
Transfer Learning & API Azure
Transfer Learning & API AzureTransfer Learning & API Azure
Transfer Learning & API AzureYuki Hattori
 
.NETラボ 勉強会 2021年1月 「C#で機械学習」
.NETラボ 勉強会 2021年1月 「C#で機械学習」.NETラボ 勉強会 2021年1月 「C#で機械学習」
.NETラボ 勉強会 2021年1月 「C#で機械学習」Fujio Kojima
 
2019年度未踏: 開発者が行ったソースコード修正作業を学習し代行するボット-DevReplay-
2019年度未踏: 開発者が行ったソースコード修正作業を学習し代行するボット-DevReplay-2019年度未踏: 開発者が行ったソースコード修正作業を学習し代行するボット-DevReplay-
2019年度未踏: 開発者が行ったソースコード修正作業を学習し代行するボット-DevReplay-Yuki Ueda
 
GaucheでCGIプログラミング
GaucheでCGIプログラミングGaucheでCGIプログラミング
GaucheでCGIプログラミングKazuhiro Hishinuma
 
CA15卒勉強会 メタプログラミングについて
CA15卒勉強会 メタプログラミングについてCA15卒勉強会 メタプログラミングについて
CA15卒勉強会 メタプログラミングについてHuy Do
 
090821 Ruby Sapporo Night Ruby Cocoa
090821 Ruby Sapporo Night Ruby Cocoa090821 Ruby Sapporo Night Ruby Cocoa
090821 Ruby Sapporo Night Ruby CocoaTomoki Maeda
 
130710 02
130710 02130710 02
130710 02openrtm
 
TypeScriptで書くLambdaをCDKでいい感じに管理する.pptx
TypeScriptで書くLambdaをCDKでいい感じに管理する.pptxTypeScriptで書くLambdaをCDKでいい感じに管理する.pptx
TypeScriptで書くLambdaをCDKでいい感じに管理する.pptxssuser8b389c
 
JAZUG クラウドデザインパターンのコードを覗く
JAZUG クラウドデザインパターンのコードを覗くJAZUG クラウドデザインパターンのコードを覗く
JAZUG クラウドデザインパターンのコードを覗くTakekazu Omi
 

Similaire à Metaprogramming (20)

(ゲームじゃない方の)switchで遊びたい話
(ゲームじゃない方の)switchで遊びたい話(ゲームじゃない方の)switchで遊びたい話
(ゲームじゃない方の)switchで遊びたい話
 
TokyoR24 - PerformanceRvsC#
TokyoR24 - PerformanceRvsC#TokyoR24 - PerformanceRvsC#
TokyoR24 - PerformanceRvsC#
 
Python physicalcomputing
Python physicalcomputingPython physicalcomputing
Python physicalcomputing
 
【SQiP2014】システム操作インターフェイス最適化によるテスト自動化ROI向上
【SQiP2014】システム操作インターフェイス最適化によるテスト自動化ROI向上【SQiP2014】システム操作インターフェイス最適化によるテスト自動化ROI向上
【SQiP2014】システム操作インターフェイス最適化によるテスト自動化ROI向上
 
CAP Custom Handlers をクリーンにしよう
CAP Custom Handlers をクリーンにしようCAP Custom Handlers をクリーンにしよう
CAP Custom Handlers をクリーンにしよう
 
Math works gdlc2019
Math works gdlc2019Math works gdlc2019
Math works gdlc2019
 
新しい並列for構文のご提案
新しい並列for構文のご提案新しい並列for構文のご提案
新しい並列for構文のご提案
 
Rtm講習会 140626 02
Rtm講習会 140626 02Rtm講習会 140626 02
Rtm講習会 140626 02
 
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
 
Transfer Learning & API Azure
Transfer Learning & API AzureTransfer Learning & API Azure
Transfer Learning & API Azure
 
.NETラボ 勉強会 2021年1月 「C#で機械学習」
.NETラボ 勉強会 2021年1月 「C#で機械学習」.NETラボ 勉強会 2021年1月 「C#で機械学習」
.NETラボ 勉強会 2021年1月 「C#で機械学習」
 
C# 3.0 以降
C# 3.0 以降C# 3.0 以降
C# 3.0 以降
 
2019年度未踏: 開発者が行ったソースコード修正作業を学習し代行するボット-DevReplay-
2019年度未踏: 開発者が行ったソースコード修正作業を学習し代行するボット-DevReplay-2019年度未踏: 開発者が行ったソースコード修正作業を学習し代行するボット-DevReplay-
2019年度未踏: 開発者が行ったソースコード修正作業を学習し代行するボット-DevReplay-
 
GaucheでCGIプログラミング
GaucheでCGIプログラミングGaucheでCGIプログラミング
GaucheでCGIプログラミング
 
CA15卒勉強会 メタプログラミングについて
CA15卒勉強会 メタプログラミングについてCA15卒勉強会 メタプログラミングについて
CA15卒勉強会 メタプログラミングについて
 
090821 Ruby Sapporo Night Ruby Cocoa
090821 Ruby Sapporo Night Ruby Cocoa090821 Ruby Sapporo Night Ruby Cocoa
090821 Ruby Sapporo Night Ruby Cocoa
 
130710 02
130710 02130710 02
130710 02
 
TypeScriptで書くLambdaをCDKでいい感じに管理する.pptx
TypeScriptで書くLambdaをCDKでいい感じに管理する.pptxTypeScriptで書くLambdaをCDKでいい感じに管理する.pptx
TypeScriptで書くLambdaをCDKでいい感じに管理する.pptx
 
ji-2. 計算
ji-2. 計算ji-2. 計算
ji-2. 計算
 
JAZUG クラウドデザインパターンのコードを覗く
JAZUG クラウドデザインパターンのコードを覗くJAZUG クラウドデザインパターンのコードを覗く
JAZUG クラウドデザインパターンのコードを覗く
 

Metaprogramming

  • 2. TABLE OF CONTENTS 1. Metaprogrammingとは? 2. コンパイル時数値計算 2.1. 寄り道(C++14) 3. 今日の進め方 4. 次元解析(コンパイル時数値計算 & 型操作) 4.1. Murphy's law 5. 直列化コードの生成(Generative Programming) 5.1. Virtues of Programmer & Style 6. キーワード 7. 参考情報
  • 3. 1 METAPROGRAMMINGとは? "a program about a program" プログラムを操作するコード。 コンパイル時数値計算 型操作 Generative Programming(コード生成)
  • 4. 2 コンパイル時数値計算 2進数リテラルのシミュレーション。 template <unsigned long N> struct binary { static_assert((N%10 == 0) || (N%10 == 1), "N is not binary literal!"); // 再帰 static unsigned const value = binary<N/10>::value * 2 + N%10; }; template <> // 特殊化。再帰の基底。 struct binary<0> { static unsigned const value = 0; }; static_assert(1 == binary<1>::value); static_assert(3 == binary<11>::value); static_assert(5 == binary<101>::value); static_assert(7 == binary<111>::value); static_assert(9 == binary<1001>::value); // static_assert(9 == binary<9>::value); // 2進数でないのでコンパイル・エラー。
  • 5. 2.1 寄り道(C++14) // constexprでコンパイル時数値計算は楽に。 constexpr auto binary(unsigned long n){ assert((n % 10 == 0) || (n % 10 == 1)); if(n == 0) return 0ul; return binary(n/10) * 2 + (n % 10); } // バイナリ・リテラルをそもそもサポート。。。 static_assert(0b1 == binary(1)); // この形式のstatic_assertはC++1Zから。 static_assert(0b10001 == binary(10001));
  • 7. 4 次元解析(コンパイル時数値 計算 & 型操作) バナナ + ゴリラ = ? 0バナナ? 1バナナ&1ゴリラ? バナナとゴリラは足せません!
  • 8. 4.1 MURPHY'S LAW Anything that can go wrong, will go wrong. バナナとゴリラは足さないかもしれませんが。。。 double distanceFromStationToHo = ...; double timeFromStationToHo = ...; double distanceFromHoToLab = ...; double timeFromHoToLab = ...; // 平均の歩く速さを計算する。 double walkingSpeedAvg = distanceFromStationToHo + distanceFromHoToLab/timeFromHoToLab; // 過去の歩く速さから分散と標準を計算。 recode.push_back(walkingSpeedAvg); double avg = sum(recode)/recode.size(); double var = accumulate(recode, [avg](auto x) { return square(x - avg); })/recode.size();
  • 9. 5 直列化コードの生成 (GENERATIVE PROGRAMMING) ゴール: 構造体を定義し、その型をシリアライズ・デシリアライズす るコードを生成する。 enum class msg_type_t : uint8_t { request; response; }; struct header { uint8_t magic_byte; // 質問。コイツは構造体のメンバ変数である必要はあるか? uint8_t version; // プロトコル・バージョン。メンバ変数? uint32_t length; // メッセージ・サイズ。 msg_type_t type; // メッセージ・タイプ。 }; // 上のユーザ型を定義すると同時に以下のような直列化コードを生成したい。 header h0 = read(buffer);// バッファ(バイト列)からheader型のオブジェクトを読み込む。 header h1 = ...; write(buffer, h1); //header型オブジェクトをバイト列に変換しバッファへ書き込む。
  • 10. 5.1 VIRTUES OF PROGRAMMER & STYLE Laziness! プログラマは怠け者。自分でコード書きたくない。 IDE駆動: コード補完、自動テンプレート実装 トライ&エラーのコストが低い More Code & (Possibly) More Bugs TextEditor駆動: シンキング & タイピング 正しい抽象化を見つけるのが難しい。(どのように関数を組み 立てたかに注目) Less Code & (Possibly) Less Bugs Productivity: "I wrote N lines of code today." Much greater productivity: "I eliminated N lines of code today." Leslie Lamport@ Programming Should Be More than Coding
  • 11. 6 キーワード Boost Fusion/Asio Concept Generative Programming IIFE(Immediately-Invoked Function Expression) SFINAE(Substitution Failure Is Not An Error) constexpr