Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
libdcompile
Search
Fadis
May 09, 2015
Programming
270
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
libdcompile
LLVMとclangを使ってC++を実行時にコンパイルする方法を解説します
Fadis
May 09, 2015
More Decks by Fadis
See All by Fadis
ソフトウェアラスタライザ
fadis
1
920
3Dシーンの圧縮
fadis
2
1k
Kernel/VM探検隊@関西 12回目 イベント会場から懇親会会場までの道のりマップ
fadis
0
120
安いハードウェアでVulkan
fadis
2
1.4k
ゲームの物理 剛体編
fadis
2
690
ゲームの物理
fadis
6
2.5k
バイラテラルアップサンプリング
fadis
5
1.3k
Kernel/VM探検隊@関西 12回目 大阪駅から会場までの道のりマップ
fadis
0
450
C++でシェーダを書く
fadis
6
5.4k
Other Decks in Programming
See All in Programming
Workers Cache を知る
syumai
0
350
コードレビューのボトルネックを"する側"と"される側"の両面から解消する
yub0n
2
1.5k
Are APIs Still Relevant in the AI Era?
soyuka
0
450
Kubernetes祭り #2 OP/ED
bells17
0
110
setup-vp GitLab対応の裏側
naokihaba
0
160
Compiling a real-world CLI tool to native with Static Hermes
tmikov2023
0
110
AI時代のコードレビューは人に向けるな、仕組みに向けろ
texmeijin
5
3.6k
JAWS-UG 東京支部が始める、JAWS-UG支部コラボ / JAWS-UG lunchtime LT Collaboration
y0hgi
0
220
Agents on Rails - Rails at Scale 2026
irinanazarova
0
530
JRuby: Past, Present, and Future
headius
0
230
Unity6 URPによる海底をテーマにしたVJシステムの解説 | Unity Shader 完全に理解した 勉強会
gam0022
0
350
更なる可用性を求めて、5年間運用したKotlinのアプリケーションをGoでリプレイスする話
ken_tunc
0
470
Featured
See All Featured
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
1
320
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
1
340
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
203
77k
Google's AI Overviews - The New Search
badams
0
1.6k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
230
23k
Designing Experiences People Love
moore
143
24k
The Limits of Empathy - UXLibs8
cassininazir
2
710
Chasing Engaging Ingredients in Design
codingconduct
0
350
Facilitating Awesome Meetings
lara
57
7.2k
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
480
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
33
5.2k
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
2
360
Transcript
libdcompile Naomasa Matsubayashi
@fadis_ ࠷ۙͷ"ࣾ $ 7JN (FOUPP มଶΛࣝผ͢Δཁૉ
int main() {! float a = 5.0f;! std::vector< boost::filesystem::path >
f;! f.push_back( "hoge.cpp" );! f.push_back( "fuga.cpp" );! dcompile::dynamic_compiler dc;! dc.getLoader().enableSystemPath();! if( !dc.getLoader().load( "jpeg" ) )! throw Ouch();! dc.getHeaderPath().enableSystemPath();! dcompile::module lib = dc( f.begin(), f.end() );! boost::optional< dcompile::function > foo =! lib.getFunction( "foo" );! if( foo )! (*foo)( &a );! else! throw Ouch();! std::cout << a << " outside" << std::endl;! }
$ ʹແͯ͘൵͍͠ͷ FWBM
FWBMͱ 1FSMͷ߹ FWBMQSJOUa)FMMP 8PSMEaOa ͔͜͜Β ͜͜·Ͱ จࣈྻ จࣈྻͰ༩͑ΒΕͨίʔυΛ࣮ߦ͢Δ
FWBMͱ จࣈྻͰ༩͑ΒΕͨίʔυΛ࣮ߦ͢Δ @45%*/ FWBM@ ਖ਼͍͠ DBUIPHFQM @45%*/ FWBM@ FDIPQSJOU)FMMP 8PSMEaOcQFSMIPHFQM
)FMMP 8PSME
FWBMͱ DBUIPHFQM @45%*/ FWBM@ FDIPQSJOU)FMMP 8PSMEaOcQFSMIPHFQM )FMMP 8PSME ॲཧ༰͕QSJOUʹܾ·ͬͨͷ࣮ߦ࣌
࣮ߦ࣌ʹίʔυΛղऍͯ͠ Ϛγϯޠʹམͱ͢खஈ͕ඞཁ
FWBMͱ ࣮ߦ࣌ʹίʔυΛղऍͯ͠ Ϛγϯޠʹམͱ͢खஈ͕ඞཁ 1FSM 0, 3VCZ 0, 1ZUIPO 0, +BWB4DSJQU
0, $ PS[ $ PS[ % ίϯύΠϧ࣌ͷΈ +BWB PS[ $ 0, )BTLFMM 0, ίϯύΠϥ͕ϥΠϒϥʹؚ·Ε͍ͯΔ
ϥΠϒϥϦʹͳͬͯΔ$ ίϯύΠϥ --7. DMBOH ͜ΕΛ͑$ ͰFWBMͰ͖Δͣ
MJCEDPNQJMF IUUQTHJUIVCDPN'BEJTMJCEDPNQJMF
Ϛγϯޠ Ϛγϯޠͷੜ DMBOH --7. VTFS $ #$ $ #$ ߏจղੳ
#$*3 ϦϯΫ
--7.ಡΈࠐΜͩ#$ͷѻ͍Λ छྨ͔ΒબΔ ίϯύΠϧ Ϛγϯޠʹมͯ݁͠ՌΛ ϑΝΠϧʹॻ͖ग़͢ ΠϯλϓϦλ ߦͮͭಡΈࠐΜͰ࣮ߦ +*5ίϯύΠϧ ඞཁ࠷খݶͷ෦͚ͩΛ ίϯύΠϧ͠ͳ͕Β࣮ߦ
௨ৗ$ ͷίʔυΛίϯύΠϧ͢Δ߹ ʮίϯύΠϧʯ͕༻͍ΒΕΔ
FWBMΛ͢Δ߹ίϯύΠϧΛ͖͢Ͱͳ͍ --7.ʹ&-'ͱ͔1&ͱ͔Λѻ͑ΔϦϯΧ͕ͳ͍ 3FRVJSFNFOU(/6CJOVUJMT ͱ͔ͯͳ͍͠ ίϯύΠϧҎ֎ͷํ๏Ͱ࣮ߦ͢Δͱ ෆࢥٞͳྗʹΑΓԿࣄແ࣮͘ߦग़དྷΔ
ϦϯΧΛΘͣʹͲ͏ͬͯ ґଘϥΠϒϥϦΛϦϯΫ͍ͯ͠Δͷ͔ --7.ΠϯλϓϦλ+*5Ͱ࣮ߦ͢Δࡍ ಉҰ#$தʹݟ͔ͭΒͳ͍γϯϘϧΛ EMGDOͰ୳ͦ͏ͱ͢Δ άϩʔόϧม JOUB ίϯύΠϧ࣌ίϯύΠϧ JODMVEFJPTUFSBN FYUFSOJOUB
JOUNBJO \ TUEDPVUB TUEFOEM ^ ࣮ߦ࣌ίϯύΠϧ ݟ͑Δʂ
--7.ΠϯλϓϦλ+*5Ͱ࣮ߦ͢Δࡍ ಉҰ--7.*3தʹݟ͔ͭΒͳ͍γϯϘϧΛ EMGDOͰ୳ͦ͏ͱ͢Δ ϦϯΧΛΘͣʹͲ͏ͬͯ ґଘϥΠϒϥϦΛϦϯΫ͍ͯ͠Δͷ͔ EMGDOͰݟ͔ͭΔͷ ݩʑόΠφϦதʹ͋ͬ ͨγϯϘϧ 35%-@(-0#"-Ͱ ϩʔυͨ͠γϯϘϧ
͋Β͔͡ΊඞཁͳϥΠϒϥϦΛEMPQFOͯ͋͠Δͱ ࣮ߦ࣌ʹίϯύΠϧ͞ΕΔίʔυͷத͔Β ͦͷϥΠϒϥϦͷ͕ؔԿͱͳ͘ݺΔ
ϦϯΧΛΘͣʹͲ͏ͬͯ ґଘϥΠϒϥϦΛϦϯΫ͍ͯ͠Δͷ͔ EMGDO104*9ݻ༗ --7.ʹ γεςϜͷμΠφϛοΫϩʔυΛநԽͨ͠ ͕ؔ༻ҙ͞Ε͍ͯΔ ͨͩ͠ϩʔυ͚ͩ MMWNTZT%ZOBNJD-JCSBSZ-PBE-JCSBSZ1FSNBOFOUMZ
ϦϯΧΛΘͣʹͲ͏ͬͯ ґଘϥΠϒϥϦΛϦϯΫ͍ͯ͠Δͷ͔ JODMVEFKQFHMJCI JOUNBJO \ TUSVDUKQFH@DPNQSFTT@TUSVDUDJOGP KQFH@DSFBUF@DPNQSFTT DJOGP ^
MJCKQFH͕ཁΔ ࣮ߦ։࢝ MJCKQFHΛ μΠφϛοΫϩʔυ ࠨ্ͷίʔυΛ +*5ίϯύΠϧ ͜ͷ࣌ͰEMGDO͔Βݟ͑Δͱ͜Ζʹ MJCKQFHͷγϯϘϧ͕͋ΔͷͰ Կࣄແ͔͔ͬͨͷΑ͏ʹ࣮ߦग़དྷΔ
int main() {! float a = 5.0f;! std::vector< boost::filesystem::path >
f;! f.push_back( "hoge.cpp" );! f.push_back( "fuga.cpp" );! dcompile::dynamic_compiler dc;! dc.getLoader().enableSystemPath();! if( !dc.getLoader().load( "jpeg" ) )! throw Ouch();! dc.getHeaderPath().enableSystemPath();! dcompile::module lib = dc( f.begin(), f.end() );! boost::optional< dcompile::function > foo =! lib.getFunction( "foo" );! if( foo )! (*foo)( &a );! else! throw Ouch();! std::cout << a << " outside" << std::endl;! } f.push_back( "hoge.cpp" );! f.push_back( "fuga.cpp" ); dcompile::dynamic_compiler dc; dc.getLoader().enableSystemPath();! if(! !dc.getLoader().load( "jpeg" ) )! throw Ouch(); dc.getHeaderPath()! .enableSystemPath(); dcompile::module lib =! dc( f.begin(), f.end() ); boost::optional<! dcompile::function! > foo = lib.getFunction( "foo" ); (*foo)( &a );
#include <jpeglib.h>! extern "C" void moo( float *a );! extern
"C" void foo( float *a ) {! struct jpeg_compress_struct cinfo;! jpeg_create_compress( &cinfo );! moo( a );! } #include <iostream>! extern "C"! void moo( float *a ) {! std::cout << *a << " inslide" << std::endl;! std::cout << "Hello, world!" << std::endl;! *a += 0.1f;! } IPHFDQQ GVHBDQQ
ಉҰϓϩηε ϗετίʔυ MJCKQFH NBJO qPBUB IPHFDQQ GPP GVHBDQQ NPP ॲཧͷྲྀΕ
JOTMJEF )FMMP XPSME PVUTJEF ͳΜ͔ ૿͑ͯΔ
%ͳΜͱ͔͞Μ͕࡞ͬͨ #0045@11ͩΒ͚ͷίʔυ தͳΜͱ͔͞Μ͕࡞ͬͨ DPOTUFYQSͩΒ͚ͷίʔυ ࣮ߦ࣌ʹ࣮ߦग़དྷΔʂ ͍͢͝ʂ ࠷ॳ͔Β࣮ߦ࣌ʹॲཧ͢ΔΑ͏ʹॻ͚ʂ
DMBOHͷา͖ํ DMBOHͷιʔεʹؔ͢Δ࠷ݶͷυΩϡϝϯτ ͦΕEPYZHFO DMBOHͷιʔεʹؔ͢ΔৄࡉͳυΩϡϝϯτ ͦΕιʔε Θ͔Βͳ͍͜ͱιʔεʹฉ͚
DMBOHͷา͖ํ --7.ͱDMBOHͷࠓ͕Θ͔Δ ߪಡແྉ HJUDMPOFIUUQMMWNPSHHJUMMWNHJU DEMMWNUPPMT HJUDMPOFIUUQMMWNPSHHJUDMBOHHJU ࠓ͙͢DMPOF
DMBOHͷา͖ํ ͰɺͲ͔͜ΒಡΊྑ͍ͷ NBJO͔ؔΒͩΖKL 0XOJOH1US$PNQJMBUJPO$ 5IF%SJWFS#VJME$PNQJMBUJPO BSHW JOU3FT DPOTU$PNNBOE 'BJMJOH$PNNBOE
JG $HFU 3FT5IF%SJWFS&YFDVUF$PNQJMBUJPO $ 'BJMJOH$PNNBOE --7.@4063$&@%*3 UPPMTDMBOHUPPMTESJWFSESJWFSDQQ DMBOHίϚϯυͷNBJOؔͷࡏॲ ߦ͋ͨΓ͔ΒNBJO
DMBOHͷา͖ํ JOU3FT$&YFDVUF+PC $HFU+PCT 'BJMJOH$PNNBOE --7.@4063$&@%*3 UPPMTDMBOHMJC%SJWFS%SJWFSDQQ ߦ͋ͨΓ͔Β&YFDVUF$PNQJMBUJPO
--7.@4063$&@%*3 UPPMTDMBOHMJC%SJWFS$PNQJMBUJPODQQ ߦ͋ͨΓ͔Β&YVFDVUF+PC MMWNTZT1SPHSBN&YFDVUF"OE8BJU 1SPH "SHW FOW 3FEJSFDUT TFDPOET5P8BJU NFNPSZ-JNJU &SSPS ॲཧͷஈ֊ຖʹׂͯ͠DMBOHΛݺͼ͢
DMBOHͷา͖ํ JG BSHWTJ[F 4USJOH3FG BSHW<> TUBSUTXJUI DD \ 4USJOH3FG5PPMBSHW<>
! JG 5PPM SFUVSODD@NBJO BSHWEBUB BSHWEBUB BSHWTJ[F BSHW<> WPJE JOUQUS@U (FU&YFDVUBCMF1BUI JG 5PPMBT SFUVSODDBT@NBJO BSHWEBUB BSHWEBUB BSHWTJ[F BSHW<> WPJE JOUQUS@U (FU&YFDVUBCMF1BUI ! 3FKFDUVOLOPXOUPPMT MMWNFSST FSSPSVOLOPXOJOUFHSBUFEUPPM5PPMaO SFUVSO ^ --7.@4063$&@%*3 UPPMTDMBOHUPPMTESJWFSESJWFSDQQ ߦ͋ͨΓ͔ΒNBJO
DMBOHͷา͖ํ MMWN*OJUJBMJ[F"MM5BSHFUT MMWN*OJUJBMJ[F"MM5BSHFU.$T MMWN*OJUJBMJ[F"MM"TN1SJOUFST MMWN*OJUJBMJ[F"MM"TN1BSTFST
--7.@4063$&@%*3 UPPMTDMBOHUPPMTESJWFSDD@NBJODQQ ߦ͋ͨΓ͔ΒDD@NBJO MMWNͷ͍͍ՃݮͳॳظԽ 4VDDFTT&YFDVUF$PNQJMFS*OWPDBUJPO $MBOHHFU --7.@4063$&@%*3 UPPMTDMBOHMJC'SPOUFOE5PPM&YFDVUF$PNQJMFS*OWPDBUJPODQQ bool clang::ExecuteCompilerInvocation(CompilerInstance *Clang) { ߦ͋ͨΓ͔Β&YFDVUF$PNQJMFS*OWPDBUJPO
DMBOHͷา͖ํ ॏཁΫϥε$PNQJMFS*OTUBODF $PNQJMFS*OTUBOD 'JMF.BOBHFS 4PVSDF.BOBHFS %JBHOPTUJDT "DUJPO 5BSHFU0QUJPO
DMBOHͷา͖ํ ॏཁΫϥε$PNQJMFS*OTUBODF Success = Clang->ExecuteAction(*Act); --7.@4063$&@%*3 UPPMTDMBOHMJC'SPOUFOE5PPM&YFDVUF$PNQJMFS*OWPDBUJPODQQ ߦ͋ͨΓ͔Β&YFDVUF$PNQJMFS*OWPDBUJPO OwningPtr<FrontendAction>
Act(CreateFrontendAction(*Clang)); "DUJPOΛ$PNQJMFS*OTUBODFʹͯ͠ &YFDVUF"DUJPO͢Δ $PNQJMFS*OTUBODF͕ύʔαΛݺͼग़͠ ߏจղੳͷ݁Ռݟ͔ͭͬͨཁૉʹԠͯ͡ "DUJPOͷରԠ͢Δϝϯό͕ؔݺΕΔ
DMBOHͷา͖ํ ࠷ॳ͔Β༻ҙ͞Ε͍ͯΔΞΫγϣϯ &NJU"TTFNCMZ"DUJPO &NJU#$"DUJPO &NJU--7."DUJPO &NJU--7.0OMZ"DUJPO &NJU$PEF(FO0OMZ"DUJPO &NJU0CK"DUJPO 0CK·Ͱ͍࣋ͬͯͬͯ͠·͏ͱ ϦϯΫग़དྷͳͯ͘٧Ή
--7.ͷา͖ํ ෳͷ--7.Ϟδϡʔϧ CDͱ͔͍ͭͯΔͭ Λ ͭͷ--7.Ϟδϡʔϧʹ·ͱΊΔ --7.-JOLFSʹ͞ΕͨϞδϡʔϧ --7.-JOLFS͕ղ์͢Δ --7.-JOLFS͕࡞ͬͨϞδϡʔϧ ໌ࣔతʹࢦఆ͠ͳ͍ͱ--7.-JOLFS͕ղ์͢Δ #$
#$ #$ ϦϯΫ
--7.ͷา͖ํ ग़དྷ্͕ͬͨϞδϡʔϧ Ͳ͏࣮ͬͯߦ͢Ε͍͍ͷ ιʔεʹฉ͚ʂ --7.@4063$&@%*3 UPPMTMMJMMJDQQ ߦ͋ͨΓ͔ΒNBJO *OJUJBMJ[F/BUJWF5BSHFU
*OJUJBMJ[F/BUJWF5BSHFU"TN1SJOUFS ωΠςΟϒλʔήοτͷॳظԽ
--7.ͷา͖ํ ϞδϡʔϧΛ&OHJOF#VJMEFSʹ͠ λʔήοτΛࢦఆͯ͠ ΠϯλϓϦλ࣮ߦ͔+*5ίϯύΠϧ͔બͼ &YFDVUJPO&OHJOFΛੜ͢Δ &OHJOF#VJMEFSCVJMEFS .PE CVJMEFSTFU."SDI ."SDI
CVJMEFSTFU.$16 .$16 CVJMEFSTFU."UUST ."UUST CVJMEFSTFU6TF.$+*5 USVF &&CVJMEFSDSFBUF
--7.ͷา͖ํ &&SVO4UBUJD$POTUSVDUPST%FTUSVDUPST GBMTF ϞδϡʔϧͷίϯετϥΫλΛ࣮ߦ JOU3FTVMU&&SVO'VODUJPO"T.BJO &OUSZ'O *OQVU"SHW FOWQ
ࢦఆͨؔ͠ΛNBJOؔͱݟͳ࣮ͯ͠ߦ ࣗͰҾΛਖ਼͘͠ઃఆ͢Ε NBJOؔͱܕͷҧ͏͔ؔΒ࣮ߦ͢Δ͜ͱՄೳ (FOFSJD7BMVF3FTVMUFOHJOFSVO'VODUJPO &OUSZ'O "SHT &&SVO4UBUJD$POTUSVDUPST%FTUSVDUPST USVF ϞδϡʔϧͷσετϥΫλΛ࣮ߦ
MJCDMBOHʹ͍ͭͯ DMBOHͷϥΠϒϥϦͬͯࠓྲྀߦͷMJCDMBOH ͕͍ͪ·͢ DMBOHͷϥΠϒϥϦ܉ஂ MJCDMBOH"3$.JHSBUF MJCDMBOH"45B MJCDMBOH"OBMZTJTB MJCDMBOH#BTJDB MJCDMBOH$PEF(FOB MJCDMBOH%SJWFSB
MJCDMBOHTP DMBOHͷϥΠϒϥϦΛ $ݴޠΠϯλʔϑΣʔεͰ ϥοϓͨ͠ͷ
MJCDMBOHʹ͍ͭͯ MJCDMBOH͞Μ ߏจղੳΛߦ͏ͱ͜Ζ·Ͱ͔͠ϥοϓ͍ͯ͠ͳ͍ MJCDMBOHͰݡ͍γϯλοΫεͱ͔͋ͬͯ MJCDMBOHͰίϯύΠϧͱ͔ฉ͔ͳ͍ͷͦͷͨΊ $ FSϥούΛհ͞ͳͯ͘ શͯͷϥΠϒϥϦΛར༻Ͱ͖Δ MJCDMBOHͱ͔͍ΒΜ͔ͬͨΜʂ $
FSʹݶΔ
ϦϯΫ͖͢ϥΠϒϥϦ 2DMBOHͱ--7.ͷϥΠϒϥϦࢁ͋Γ·͕͢ɺ ࣗͷίʔυΛಈ͔ͨ͢Ίʹඞཁͳͷ ͲΕͱͲΕͰ͠ΐ͏ ͲͷγϯϘϧ͕ͲͷϥΠϒϥϦʹؚ·Ε͍ͯΔ͔ Ͳ͜ʹॻ͔Ε͍ͯͳ͍ "શ෦ϦϯΫ͔ͯ͠Βͭͮͭ֎ͯ͠Έͯɺ ϦϯΫΤϥʔ͕ग़ΔϠπͬͯΔʂ
ϦϯΫ͖͢ϥΠϒϥϦ MJCDMBOH"3$.JHSBUF MJCDMBOH"45B MJCDMBOH"OBMZTJTB MJCDMBOH#BTJDB MJCDMBOH$PEF(FOB MJCDMBOH%SJWFSB MJCDMBOH&EJUB MJCDMBOH'SPOU&OEB MJCDMBOH'SPOU&OE5PPM
MJCDMBOH*OEFYB MJCDMBOH-FYB MJCDMBOH1BSTFB MJCDMBOH3FXSJUFB MJCDMBOH4FNBB MJCDMBOH4FSJBMJ[BUJPO MJC--7."TN1BSTFSB MJC--7."TN1SJOUFSB MJC--7.#JU3FBEFSB MJC--7.&YFDVUJPO&OHJOF MJC--7.+*5B MJC--7..$+*5B MJC--7.$PEF(FOB MJC--7.JQPB MJC--7.$PSFB MJC--7.-JOLFSB MJC--7.*OTUSVNFOUBUJPOB MJCEDPNQJMFͷ߹
ݱ࣌Ͱͷ՝ ࣮ߦ࣌ίϯύΠϧ͞Εͨίʔυͷؔݺͼग़࣌͠ ҾͷੵΈํ͕ಾ ݱঢ়όΠτҎԼͷQPEܕ͔ͤ͠ͳ͍ ϓϦϓϩηοαεςʔδͷΈ࣮ߦ͕Ͱ͖ͳ͍ ݱࡏ࣮࡞ۀத --7.ͷόʔδϣϯ্͕͕Δͨͼʹ ΠϯλʔϑΣʔε͕มΘΔ
݁ $ Ͱ࣮ߦ࣌ίϯύΠϧ Ͱ͖Δ
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠