Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
libdcompile
Search
Fadis
May 09, 2015
Programming
0
250
libdcompile
LLVMとclangを使ってC++を実行時にコンパイルする方法を解説します
Fadis
May 09, 2015
Tweet
Share
More Decks by Fadis
See All by Fadis
ゲームの物理
fadis
5
1.6k
バイラテラルアップサンプリング
fadis
4
860
Kernel/VM探検隊@関西 11回目 大阪駅から会場までの道のりマップ
fadis
0
250
C++でシェーダを書く
fadis
6
5k
ライトたくさんReSTIRを実装しよう
fadis
3
1.4k
コンピュータグラフィクスの空
fadis
8
2.6k
NNEFを読めるようになろう
fadis
0
1.1k
低レイヤーから始める GUI
fadis
18
12k
いまどきのVulkan
fadis
14
7.9k
Other Decks in Programming
See All in Programming
今から始めるClaude Code入門〜AIコーディングエージェントの歴史と導入〜
nokomoro3
0
170
個人軟體時代
ethanhuang13
0
320
Ruby Parser progress report 2025
yui_knk
1
440
CJK and Unicode From a PHP Committer
youkidearitai
PRO
0
110
@Environment(\.keyPath)那么好我不允许你们不知道! / atEnvironment keyPath is so good and you should know it!
lovee
0
120
MCPとデザインシステムに立脚したデザインと実装の融合
yukukotani
4
1.4k
AIと私たちの学習の変化を考える - Claude Codeの学習モードを例に
azukiazusa1
10
4.2k
テストコードはもう書かない:JetBrains AI Assistantに委ねる非同期処理のテスト自動設計・生成
makun
0
320
GitHubとGitLabとAWS CodePipelineでCI/CDを組み比べてみた
satoshi256kbyte
4
240
詳解!defer panic recover のしくみ / Understanding defer, panic, and recover
convto
0
240
AI時代のUIはどこへ行く?
yusukebe
18
8.9k
AIコーディングAgentとの向き合い方
eycjur
0
270
Featured
See All Featured
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
22k
Being A Developer After 40
akosma
90
590k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.1k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
126
53k
Site-Speed That Sticks
csswizardry
10
820
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
53
2.9k
Testing 201, or: Great Expectations
jmmastey
45
7.7k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
48
9.7k
A Tale of Four Properties
chriscoyier
160
23k
Building an army of robots
kneath
306
46k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
31
2.2k
Building a Scalable Design System with Sketch
lauravandoore
462
33k
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.ͷόʔδϣϯ্͕͕Δͨͼʹ ΠϯλʔϑΣʔε͕มΘΔ
݁ $ Ͱ࣮ߦ࣌ίϯύΠϧ Ͱ͖Δ
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠