Download free for 30 days
Sign in
Upload
Language (EN)
Support
Business
Mobile
Social Media
Marketing
Technology
Art & Photos
Career
Design
Education
Presentations & Public Speaking
Government & Nonprofit
Healthcare
Internet
Law
Leadership & Management
Automotive
Engineering
Software
Recruiting & HR
Retail
Sales
Services
Science
Small Business & Entrepreneurship
Food
Environment
Economy & Finance
Data & Analytics
Investor Relations
Sports
Spiritual
News & Politics
Travel
Self Improvement
Real Estate
Entertainment & Humor
Health & Medicine
Devices & Hardware
Lifestyle
Change Language
Language
English
Español
Português
Français
Deutsche
Cancel
Save
Submit search
EN
KY
Uploaded by
Kinuko Yasuda
36,504 views
C++でCプリプロセッサを作ったり速くしたりしたお話
1. C プリプロセッサを使ってみよう 2. C プリプロセッサを作った話 3. C プリプロセッサを高速化した話
Technology
◦
Read more
40
Save
Share
Embed
Embed presentation
Download
Downloaded 28 times
1
/ 28
2
/ 28
3
/ 28
4
/ 28
5
/ 28
6
/ 28
7
/ 28
8
/ 28
9
/ 28
10
/ 28
11
/ 28
12
/ 28
13
/ 28
14
/ 28
15
/ 28
Most read
16
/ 28
17
/ 28
Most read
18
/ 28
19
/ 28
20
/ 28
21
/ 28
Most read
22
/ 28
23
/ 28
24
/ 28
25
/ 28
26
/ 28
27
/ 28
28
/ 28
More Related Content
PDF
新たなgitのブランチモデル「Git Feature Flow」!Git Flow,Git Hub Flow,Git Lab Flowを超えれるか?
by
naoki koyama
PDF
俺のTerraform CI/CD ライフサイクル
by
HonMarkHunt
PDF
Oss貢献超入門
by
Michihito Shigemura
PPTX
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx
by
Shota Shinogi
PDF
Easybuggy(バグ)の召し上がり方
by
広平 田村
PDF
いまさら聞けないarmを使ったNEONの基礎と活用事例
by
Fixstars Corporation
PDF
こわくない Git
by
Kota Saito
PPTX
[DL輪読会]Objects as Points
by
Deep Learning JP
新たなgitのブランチモデル「Git Feature Flow」!Git Flow,Git Hub Flow,Git Lab Flowを超えれるか?
by
naoki koyama
俺のTerraform CI/CD ライフサイクル
by
HonMarkHunt
Oss貢献超入門
by
Michihito Shigemura
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx
by
Shota Shinogi
Easybuggy(バグ)の召し上がり方
by
広平 田村
いまさら聞けないarmを使ったNEONの基礎と活用事例
by
Fixstars Corporation
こわくない Git
by
Kota Saito
[DL輪読会]Objects as Points
by
Deep Learning JP
What's hot
PPTX
C# 8.0 非同期ストリーム
by
信之 岩永
PDF
Python 3.9からの新定番zoneinfoを使いこなそう
by
Ryuji Tsutsui
PDF
テスト文字列に「うんこ」と入れるな
by
Kentaro Matsui
PPTX
Slurmのジョブスケジューリングと実装
by
Ryuichi Sakamoto
PPTX
画像処理ライブラリ OpenCV で 出来ること・出来ないこと
by
Norishige Fukushima
PDF
GoによるWebアプリ開発のキホン
by
Akihiko Horiuchi
PDF
ネットワークOS野郎 ~ インフラ野郎Night 20160414
by
Kentaro Ebisawa
PPTX
MongoDBが遅いときの切り分け方法
by
Tetsutaro Watanabe
PPT
Glibc malloc internal
by
Motohiro KOSAKI
PDF
それはYAGNIか? それとも思考停止か?
by
Yoshitaka Kawashima
PDF
組み込み関数(intrinsic)によるSIMD入門
by
Norishige Fukushima
ODP
Guide To AGPL
by
Mikiya Okuno
PPT
Raft
by
Preferred Networks
PPTX
CEDEC2019 大規模モバイルゲーム運用におけるマスタデータ管理事例
by
sairoutine
PDF
プログラムを高速化する話
by
京大 マイコンクラブ
PDF
マイクロにしすぎた結果がこれだよ!
by
mosa siru
PDF
分散学習のあれこれ~データパラレルからモデルパラレルまで~
by
Hideki Tsunashima
PDF
超実践 Cloud Spanner 設計講座
by
Samir Hammoudi
PPTX
TensorFlowで会話AIを作ってみた。
by
tak9029
PDF
三次元表現まとめ(深層学習を中心に)
by
Tomohiro Motoda
C# 8.0 非同期ストリーム
by
信之 岩永
Python 3.9からの新定番zoneinfoを使いこなそう
by
Ryuji Tsutsui
テスト文字列に「うんこ」と入れるな
by
Kentaro Matsui
Slurmのジョブスケジューリングと実装
by
Ryuichi Sakamoto
画像処理ライブラリ OpenCV で 出来ること・出来ないこと
by
Norishige Fukushima
GoによるWebアプリ開発のキホン
by
Akihiko Horiuchi
ネットワークOS野郎 ~ インフラ野郎Night 20160414
by
Kentaro Ebisawa
MongoDBが遅いときの切り分け方法
by
Tetsutaro Watanabe
Glibc malloc internal
by
Motohiro KOSAKI
それはYAGNIか? それとも思考停止か?
by
Yoshitaka Kawashima
組み込み関数(intrinsic)によるSIMD入門
by
Norishige Fukushima
Guide To AGPL
by
Mikiya Okuno
Raft
by
Preferred Networks
CEDEC2019 大規模モバイルゲーム運用におけるマスタデータ管理事例
by
sairoutine
プログラムを高速化する話
by
京大 マイコンクラブ
マイクロにしすぎた結果がこれだよ!
by
mosa siru
分散学習のあれこれ~データパラレルからモデルパラレルまで~
by
Hideki Tsunashima
超実践 Cloud Spanner 設計講座
by
Samir Hammoudi
TensorFlowで会話AIを作ってみた。
by
tak9029
三次元表現まとめ(深層学習を中心に)
by
Tomohiro Motoda
Similar to C++でCプリプロセッサを作ったり速くしたりしたお話
PDF
C++コミュニティーの中心でC++をDISる
by
Hideyuki Tanaka
PDF
中3女子でもわかる constexpr
by
Genya Murakami
PDF
Define and expansion of cpp macro
by
digitalghost
PDF
第1回勉強会スライド
by
koturn 0;
PPTX
C++ tips1 #include編
by
道化師 堂華
PDF
C++ lecture-0
by
sunaemon
PDF
Ocamlでpfffを拡張した話
by
Rie Nakau
PDF
Write good parser in perl
by
Jiro Nishiguchi
PDF
2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」
by
Hiro H.
KEY
You Can Be a CPAN Auhor
by
moznion
C++コミュニティーの中心でC++をDISる
by
Hideyuki Tanaka
中3女子でもわかる constexpr
by
Genya Murakami
Define and expansion of cpp macro
by
digitalghost
第1回勉強会スライド
by
koturn 0;
C++ tips1 #include編
by
道化師 堂華
C++ lecture-0
by
sunaemon
Ocamlでpfffを拡張した話
by
Rie Nakau
Write good parser in perl
by
Jiro Nishiguchi
2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」
by
Hiro H.
You Can Be a CPAN Auhor
by
moznion
Recently uploaded
PDF
第21回 Gen AI 勉強会「NotebookLMで60ページ超の スライドを作成してみた」
by
嶋 是一 (Yoshikazu SHIMA)
PDF
2025→2026宙畑ゆく年くる年レポート_100社を超える企業アンケート総まとめ!!_企業まとめ_1229_3版
by
sorabatake
PDF
Starlink Direct-to-Cell (D2C) 技術の概要と将来の展望
by
CRI Japan, Inc.
PDF
自転車ユーザ参加型路面画像センシングによる点字ブロック検出における性能向上方法の模索 (20260123 SeMI研)
by
Yuto Matsuda
PDF
ST2024_PM1_2_Case_study_of_local_newspaper_company.pdf
by
akipii ogaoga
PDF
Team Topology Adaptive Organizational Design for Rapid Delivery of Valuable S...
by
akipii ogaoga
PDF
PMBOK 7th Edition Project Management Process Scrum
by
akipii ogaoga
PDF
100年後の知財業界-生成AIスライドアドリブプレゼン イーパテントYouTube配信
by
e-Patent Co., Ltd.
PDF
PMBOK 7th Edition_Project Management Context Diagram
by
akipii ogaoga
PDF
Reiwa 7 IT Strategist Afternoon I Question-1 Ansoff's Growth Vector
by
akipii ogaoga
PDF
Reiwa 7 IT Strategist Afternoon I Question-1 3C Analysis
by
akipii ogaoga
PDF
FY2025 IT Strategist Afternoon I Question-1 Balanced Scorecard
by
akipii ogaoga
PDF
PMBOK 7th Edition_Project Management Process_WF Type Development
by
akipii ogaoga
第21回 Gen AI 勉強会「NotebookLMで60ページ超の スライドを作成してみた」
by
嶋 是一 (Yoshikazu SHIMA)
2025→2026宙畑ゆく年くる年レポート_100社を超える企業アンケート総まとめ!!_企業まとめ_1229_3版
by
sorabatake
Starlink Direct-to-Cell (D2C) 技術の概要と将来の展望
by
CRI Japan, Inc.
自転車ユーザ参加型路面画像センシングによる点字ブロック検出における性能向上方法の模索 (20260123 SeMI研)
by
Yuto Matsuda
ST2024_PM1_2_Case_study_of_local_newspaper_company.pdf
by
akipii ogaoga
Team Topology Adaptive Organizational Design for Rapid Delivery of Valuable S...
by
akipii ogaoga
PMBOK 7th Edition Project Management Process Scrum
by
akipii ogaoga
100年後の知財業界-生成AIスライドアドリブプレゼン イーパテントYouTube配信
by
e-Patent Co., Ltd.
PMBOK 7th Edition_Project Management Context Diagram
by
akipii ogaoga
Reiwa 7 IT Strategist Afternoon I Question-1 Ansoff's Growth Vector
by
akipii ogaoga
Reiwa 7 IT Strategist Afternoon I Question-1 3C Analysis
by
akipii ogaoga
FY2025 IT Strategist Afternoon I Question-1 Balanced Scorecard
by
akipii ogaoga
PMBOK 7th Edition_Project Management Process_WF Type Development
by
akipii ogaoga
C++でCプリプロセッサを作ったり速くしたりしたお話
1.
Photo by Markus
Spiske · CC-License: CC BY www.temporausch.com C++でCプリプロセッサを 作ったり速くしたりしたお話 Ladies++meetup#1 @kinu/KinukoYasuda
2.
やすだ きぬこ (@kinu) WhoamI 普段は
C++ でブラウザ (Chrome) を作ってます ときどきルンバをハックしたり家庭運用の ための趣味アプリを作ったりしている C++11 勉強中
3.
C++ の話…と見せかけて 概ね CPP
(C Preprocessor・プリプロセッサ) のお話をしたいと思います 1. C Preprocessor を使ってみよう! 2. C Preprocessor を (C++で) 作った話 3. C Preprocessor を高速化した話 今日のお話!
4.
Part1:CPreprocessor を 使ってみよう!
5.
❄ #include とか
#define とかを解釈するアレ ❄ C や C++ とはまったく関係ない独立した文法/処理 ○ コメント処理 (削除)・’¥’ で終わる行の連結 ○ 外部ファイル読み込み (#include, #include_next) ○ 条件分岐 (#ifdef / #if / #else / #elif / #endif) ○ 単語置換・マクロ展開 (#define) ○ 文字列化 (#google → “google”) ○ 結合 (a##b → ab) ❄ 頑張れば割といろいろできる ○ でもマクロ展開の仕様が謎で使いこなすのはけっこう難しい ○ というか使いこなす必要は特にない… CPreprocessorのキホン
6.
❄ ファイルを include
する。以上! ❄ その他の使い方は特に C++ ではあまり推奨されない ○ C で型共通のツールを書く (リンクリストとか) ○ template では面倒なちょっとしたマクロ ○ デバッグ用や個人用コードでの手抜き ○ 任意個引数 template の繰り返し記述を手抜きする (可変長 template で出番がなくなった気がする) CPreprocessor何に使う?
7.
❄ # による文字列化
(べんり) に展開 ❄ ## による結合 (べんり) ❄ マクロ名でもなんでも結合できる (なかなかキモい) 33 に展開される CPPのややマイナー機能を使う
8.
これは “fooVER.h” を
include してしまう! ❄ 以下のように書き換えれば動く… まず base と v を展開させる これは “foo1.h” を include! CPPの悩ましい展開例 (1) ・・・!?
9.
❄ 再帰呼び出しはできない になる; 再帰しない ❄
こんな風に擬似的に回避するのが普通 ❄ (もっとトリッキーにちゃんと再帰する方法もある) CPPの悩ましい展開例 (2) ・・・
10.
❄ 少し一般化するとやや汎用的に (boost
風味) ❄ 使い方例 CPPのマクロ展開で繰り返しを頑張る
11.
なかなか便利。 とはいっても…
12.
C++11, C++14 で
C++ 本体が 大幅パワーアップ! range for や可変長テンプレートなどで オワコン化が進む 基本機能以外は FizzBuzz を書いたり 謎マクロ展開を楽しむための趣味言語になった… (私感)
13.
…気にせず次のパートへ
14.
Part2:CPreprocessor を C++で作ってみた
15.
❄ 背景:クラウドコンパイラ ○ Chromium
のコンパイルが遅い! ○ Google インフラを使って大量のファイルを高速コンパイルするた めのシステムが ukai, shinh らにより開発される (参照) ■ このシステムのためにコンパイルに必要な include ファイルを 検知してクラウドに送りつける部分が必要に ● → #include 行を適当に処理すればいいじゃん? ● → 適当に作ったら問題たくさん発覚 ● → マジメな C Pre Processor を作ることに ❄ ということで 20% タイムで作ってみた (5年くらい前) なぜ CPP を作ったのか?
16.
❄ C++ で
2500 行くらい ❄ 基本構造 ○ シンプルな手書き再帰下降パーサ ■ # ではじまる行を探して ■ define ならマクロ定義部分を記録 ■ include や include_next ならファイルを読み込む ■ if, ifdef, else, elif, endif なら条件分岐 ○ include ファイルリストを求める機能に特化 ■ C や C++ のプログラム部分はパースしなくてよい ● でも include のためにマクロ展開と演算評価は必要 ❄ そこそこ高速 ○ gcc -E の 6倍くらい (単純比較はできないけど) お手製 CPP パーサの概要
17.
❄ CPP のマクロ展開は謎が多い ○
→ なぜなら仕様が謎だった! ■ 仕様通り実装しても書かれてない部分があって完全に実装 できない・現在知られてる挙動にならない ○ ANSI C Standard Committee の Dave Prosser とい う人によるアルゴリズムが公開されている ■ http://www.spinellis.gr/blog/20060626/ CPP のマクロ展開を実装する これなかったら実装できなかった…
18.
CPP のマクロ展開アルゴリズム (1)
19.
CPP のマクロ展開アルゴリズム (2)
20.
CPP のマクロ展開アルゴリズム (3) ❄
…とにかくアルゴリズム通りに書けば動く ❄ なんとなくの概要: ○ 各トークンに “hide set” (HS)というのが結びついている ○ マクロを展開するたびに展開結果のトークンの HS にそのマクロ が足される ○ 展開は再帰的に行われるが、”hide set” に入っているマクロはそ のスキャン中はもう展開されない (再帰の限定的禁止) ○ ## はマクロ展開より先に起こる (遅延させて回避可能) 。。。。。
21.
CPP を作る・完成 ❄ その他 ○
__LINE__ や __DATE__ もちまちま作る ○ 条件分岐のために数式のパースと整数演算評価もする ❄ 少しずつ複雑そうなソースを使ってテストしながら修正・テ ストケースに足していく ○ Chromium, WebKit, elfutils, Linux Kernel, boost, ... ❄ だいたい正しく動くように (∩´∀`)∩
22.
Part3:CPreprocessor を 高速化してみた
23.
マジメに作ってみたのはいいが… ❄ 最初に作られた単純な実装 (string::find
+ substr + いろ んなハック) に比べると半分くらいの速度 ❄ コンパイル速度を速くするのがクラウドコンパイラの目標 なので、高速に動かないと意味がない… → 高速化しよう! なんか遅い。。
24.
❄ まずは細かい部分を端から修正 ○ switch
などはできるだけテーブルに ○ locale 依存の ctype.h の関数 (isalnum など) は使わない ○ 再帰的なアルゴリズムを再帰を使わない形で再実装 ○ ホットな場所での深いポインタ参照は避ける ○ stringstream は激重なので (例えエラー出力でも) 避ける ○ トークンのサイズをなるべく小さく・頻度の高いトークンに最 適化 (ちなみに小さくし過ぎたら遅くなった) 1文字の記号など用 2文字の演算子用 (“==” など) CPP の高速化 (1)
25.
❄ 一旦処理したファイルはなるべくもう読まない ○ マクロを再定義して自分を再帰的に
include するファイルもある ので単純にはできない ■ → ファイル毎に評価されたマクロと変更したマクロを覚えておき、 評価されたマクロが変更されない限り二度は読まない ■ → 全マクロIDの評価と変更を記録するとメモリを食いすぎて逆に遅 くなるので、bloomfilter っぽく false positive は許す → 20% 高速化! ❄ #endif やコメント終端までできるだけ速くジャンプ ○ ‘if/ifdef’ 毎に対応する endif の位置を憶えておく → ~15% 高速化! (でも後に削除) CPP の高速化 (2)
26.
❄ ‘#’ ディレクティブマッチに
Double-Array Trie を使う ○ 大した種類はないけど頻繁に呼ばれる・テーブルは静的なので 更新の心配はなし → 5% 高速化! ❄ 読み飛ばし処理に SSE を使う ○ 次の ‘#’ まで読み飛ばす、次の ‘*/’ まで読み飛ばす、次の改行ま で読み飛ばすなど、最頻出処理 ○ SSE2 で16文字一度に compare し、popcount で改行も数える (__LINE__ のために行カウントが必要なため) → 25% 高速化! CPP の高速化 (3)
27.
❄ 最終的には最初の単純実装より2倍くらい速くなった ○ (現在は社内で引き継がれてさらに高速化されたようです) ❄
雑な知見 ○ ctype.h, stringstream は速度が気になるなら使わない SSE は意外と普通に速くなる ○ 大幅高速化は大体「速くする」より「処理しない」 めでたしめでたし! CPP の高速化まとめ
28.
おしまい HappyC++(andCPP)Life!
Download