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
JVM の仕組みを理解して PHP で実装してみよう
Search
memory
PRO
May 23, 2025
Programming
1
300
JVM の仕組みを理解して PHP で実装してみよう
Nextbeat Tech Bar: Java/JVM祭り
memory
PRO
May 23, 2025
Tweet
Share
More Decks by memory
See All by memory
コードゴルファー道
m3m0r7
PRO
0
410
ChatGPT とつくる PHP で OS 実装
m3m0r7
PRO
3
260
事業観点から見る技術的負債の返済
m3m0r7
PRO
4
1.2k
PHP でアセンブリ言語のように書く技術
m3m0r7
PRO
1
230
PHP でアセンブリっぽく書く技術
m3m0r7
PRO
1
150
How to implement a RubyVM with PHP?
m3m0r7
PRO
3
2.8k
二郎系ラーメンのコールで学ぶ AST 解析
m3m0r7
PRO
8
2.9k
RubyVM を PHP で実装する 〜Hello World を出力するまで〜
m3m0r7
PRO
1
920
令和最新版 PHP メモリ管理術
m3m0r7
PRO
7
4.8k
Other Decks in Programming
See All in Programming
意外と簡単!?フロントエンドでパスキー認証を実現する WebAuthn
teamlab
PRO
2
680
ファインディ株式会社におけるMCP活用とサービス開発
starfish719
0
250
サーバーサイドのビルド時間87倍高速化
plaidtech
PRO
0
720
「手軽で便利」に潜む罠。 Popover API を WCAG 2.2の視点で安全に使うには
taitotnk
0
800
ProxyによるWindow間RPC機構の構築
syumai
3
1.1k
AI Coding Agentのセキュリティリスク:PRの自己承認とメルカリの対策
s3h
0
160
MLH State of the League: 2026 Season
theycallmeswift
0
230
実用的なGOCACHEPROG実装をするために / golang.tokyo #40
mazrean
1
240
コンテキストエンジニアリング Cursor編
kinopeee
1
760
Processing Gem ベースの、2D レトロゲームエンジンの開発
tokujiros
2
120
print("Hello, World")
eddie
1
520
Azure SRE Agentで運用は楽になるのか?
kkamegawa
0
1.8k
Featured
See All Featured
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.5k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
252
21k
The Invisible Side of Design
smashingmag
301
51k
Being A Developer After 40
akosma
90
590k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
44
2.5k
Making Projects Easy
brettharned
117
6.4k
Faster Mobile Websites
deanohume
309
31k
Designing Experiences People Love
moore
142
24k
Keith and Marios Guide to Fast Websites
keithpitt
411
22k
Facilitating Awesome Meetings
lara
55
6.5k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.4k
Transcript
ΊΓʔ +7.ͷΈΛཧղͯ͠ 1)1Ͱ࣮ͯ͠ΈΑ͏ /FYUCFBU5FDI#BSɿ+BWB+7.ࡇΓ 1
ΊΓʔ NNS ෳͷϕϯνϟʔاۀελʔτ Ξοϓاۀɼ্اۀͰιϑτΣ ΞΤϯδχΞ$50ͱͯ͠׆ಈɻ ීஈ3VCZͱ5ZQF4DSJQUॻ͍ͯ ·͢ɻ 2 NNS NNS
3 NEW!
1)1Ͱ+7.ͷ࣮ !1)1FS,BJHJ 4 1)1Ͱ3VCZ7.ͷ࣮ !3VCZ,BJHJ աڈͷ࡞ʜ
7.ʢ7JSUVBM.BDIJOFʣͷΈ +7.ͷ࣮ํ๏ 1)1Ͱͷ࣮ํ๏ %&.0 5 ͋͐͡Μͩ
ҙࣄ߲ 6
࣮ͷ͢͠͞ͷ؍Ͱ+%,Λڭࡐͱ͠·͢ ίϯύΠϥʹ͍ͭͯ͠·ͤΜ 1)1 +BWBͷॻ͖ํʹ͍ͭͯ͠·ͤΜ +7.4QFDJ fi DBUJPOͷৄ͍͠ಡΈํʹ͍ͭͯ 7 ҙࣄ߲ ͠·ͤΜ
8 ϦϙδτϦͷ͝հ IUUQTHJUIVCDPNQIQKBWBQIQKBWB
ଟ͘ͷਓ͕֤ʑͷ͖ͳݴޠͰ +7.Λ࣮͢Δ͜ͱ͕ྲྀߦΓ·ͨ͠Ͷ ʢલʣ 9
ࠓ--.͋Γɼੲ΄Ͳ࣮ʹ ۤ৺͠ͳ͍ͩΖ͏ͱࢥ͍·͢ɻ ϓϩάϥϛϯάॳ৺ऀͷํઓ͕Ͱ͖Δ ͱͯྑ͍͕࣌౸དྷ͖ͯ͠·ͨ͠ɻ 10
ͷͰͥͻઓͯ͠ΈͯͶʂ 11
7. 7JSUVBM.BDIJOF ʹ͍ͭͯ 12
+7.Λ࣮͢Δʹ͋ͨͬͯ7.ͷཧղඇৗʹॏཁͰ͢ɻ 7.7JSUVBM.BDIJOFͱ͍͍ɼͦͷίϯϐϡʔλͷಈ࡞ΛιϑτΣΞ্Ͱ࠶ݱ ͢ΔͷͰ͢ɻ ྫ͑7JSUVBM#PYͳͲ͕Πϝʔδʹ͍ۙΜ͡Όͳ͍Ͱ͠ΐ͏͔ɻ ͨͩɼ͜ΕΒͷ΄ͱΜͲɼ+7.ͷΑ͏ͳ7.ͱগ͠ҟͳΓ·͢ɻ 13
7. 7JSUVBM.BDIJOF ʹ͍ͭͯ
ҰํͰɼ+7.ʢ+BWB7JSUVBM.BDIJOFʣ;FOE7. 1)1༻ͷ7JSUVBM.BDIJOF ɼ 3VCZ7.ͳͲશ͘ҟͳΓ·͢ɻ ઌ΄ͲͷྫϋʔυΣΞϨϕϧͷͷͰ͕͢ɼ͜ΕΒΞϓϦέʔγϣϯϨϕϧ ͷͷͰ͢ɻ 7.ͱॻ͍͍ͯͯɼ͍͔ͭ͘छྨ͕͋ΔΜͩɼͱ͓΅͓͖͑ͯ·͠ΐ͏ɻ
࣍ʹྫͷਤΛࣔ͠·͢ɻ 14 7. 7JSUVBM.BDIJOF ʹ͍ͭͯ
15 7. 7JSUVBM.BDIJOF ʹ͍ͭͯ macOS VirtualBox (VM) JVM Java ϓϩάϥϜ
JVM Java ϓϩάϥϜ Zend VM PHPϓϩάϥϜ
ͦͯ͠ɼ΄ͱΜͲͷΞϓϦέʔγϣϯϨϕϧͷ7.ελοΫϚγϯʹ͍͔ۙͨͪͰ ࣮ͯ͠͞Ε͍ͯ·͢ʢ%BMWJLͳͲআ͘ʣɻ ͪΖΜ+7.3VCZ7.ελοΫϚγϯͷΑ͏ͳܗͰɼ$16ͷ΄ͱΜͲ ʢYʣϨδελϚγϯͰ͢ɻ ελοΫϚγϯͱɼࢦఆ͞Ε͍͔ͨͭ͘ͷϨδελ্ʹԿ͔Λ֨ೲ͢ΔͷͰͳ ͘ɼσʔλΛελοΫʢੵΈ্͛ʣͳ͕Βɼॲཧ͍ͯ͘͠ํ๏Ͱ͢ɻ
ҰํϨδελϚγϯɼ͋Β͔͡ΊܾΊΒΕͨϨδελͱݺΕΔྖҬʹΛ֨ೲ ͯ͠ܭࢉΛߦ͍ͬͯ͘ͷͰ͢ɻ 16 7. 7JSUVBM.BDIJOF ʹ͍ͭͯ
ϨδελϚγϯͷݩΛ֞ؒݟ͍ͨͷͰ͋ΕɼΞηϯϒϦݴޠΛॻ͍ͯɼ֤$16ʹ ࠷దԽ͞ΕͨܗͰτϥϯεύΠϧ͢Εɼ͋ΔఔཧղͰ͖ΔΜ͡Όͳ͍͔ͳͱࢥ͍ ·͢ɻ ༨ஊͰ͕͢ɼελοΫϚγϯҰ෦ͷϨδελϚγϯͷΈΛऔΓೖΕ͍ͯΔ͜ͱ ͋Γ·͢ɻ 17 7. 7JSUVBM.BDIJOF
ʹ͍ͭͯ
ελοΫϚγϯ ʙ Λٙࣅ໋ྩηοτͰܭࢉ͢Δʙ 18
Λٙࣅ໋ྩηοτͰܭࢉ͢Δ 19 7. 7JSUVBM.BDIJOF ʹ͍ͭͯ constadd (operand: 1)
constadd (operand: 2) constadd (operand: 3) plus plus output - constadd ໋ྩ 1 ͭͷΦϖϥϯυΛऔΓɼͦΕΛελοΫ ʹϓογϡ͢Δ໋ྩ - plus ελοΫ͔Β 2 ͭΛϙοϓ͠ɼͦΕΛՃࢉͨ͠ͷ ΛελοΫʹϓογϡ͢Δ໋ྩ - output ελοΫ͔ΒҰͭϙοϓ͠ग़ྗ͢Δ໋ྩ - ্هͷ 3 ͭͷ໋ྩͰ࣮ݱՄೳͰ͢ɻ͜ͷҰ࿈ͷྲྀΕΛ໋ྩ γʔέϯεͱݴͬͨΓ͠·͢ɻ
Λٙࣅ໋ྩηοτͰܭࢉ͢Δ 20 7. 7JSUVBM.BDIJOF ʹ͍ͭͯ constadd (operand: 1)
constadd (operand: 2) constadd (operand: 3) plus plus output ελοΫ 1 ελοΫʹ 1 Λϓογϡ
Λٙࣅ໋ྩηοτͰܭࢉ͢Δ 21 7. 7JSUVBM.BDIJOF ʹ͍ͭͯ constadd (operand: 1)
constadd (operand: 2) constadd (operand: 3) plus plus output ελοΫ 1 ελοΫʹ 2 Λϓογϡ 2
Λٙࣅ໋ྩηοτͰܭࢉ͢Δ 22 7. 7JSUVBM.BDIJOF ʹ͍ͭͯ constadd (operand: 1)
constadd (operand: 2) constadd (operand: 3) plus plus output ελοΫ 1 2 ͭͷσʔλΛϙοϓ 2 3 Ճࢉͨ݁͠ՌΛϓογϡ
Λٙࣅ໋ྩηοτͰܭࢉ͢Δ 23 7. 7JSUVBM.BDIJOF ʹ͍ͭͯ constadd (operand: 1)
constadd (operand: 2) constadd (operand: 3) plus plus output ελοΫ 3 ελοΫʹ 3 Λϓογϡ 3
Λٙࣅ໋ྩηοτͰܭࢉ͢Δ 24 7. 7JSUVBM.BDIJOF ʹ͍ͭͯ constadd (operand: 1)
constadd (operand: 2) constadd (operand: 3) plus plus output ελοΫ 3 2 ͭͷσʔλΛϙοϓ 3 6 Ճࢉͨ݁͠ՌΛϓογϡ
Λٙࣅ໋ྩηοτͰܭࢉ͢Δ 25 7. 7JSUVBM.BDIJOF ʹ͍ͭͯ constadd (operand: 1)
constadd (operand: 2) constadd (operand: 3) plus plus output ελοΫ 6 1 ͭͷσʔλΛϙοϓ
ϨδελϚγϯͷΈ $16ʹΑͬͯҟͳΔͷͰׂѪ͠·͢ 26
+7.ͷ࣮ํ๏ 27
7.ͷ࣮ํ๏͕֓ͶΘ͔Γ·ͨ͠ͶɻͰɼ࣮ࡍʹ+7.ͷ࣮ํ๏ʹ͍ͭͯཧղ ΛਂΊ͍͖ͯ·͠ΐ͏ɻ +7.DMBTTϑΝΠϧͱݺΕΔσʔλߏͷू߹Λ໋ྩͱղऍͯ͠ಈ࡞ͤ͞ΔΞ ϓϦέʔγϣϯϨϕϧͷ7.Ͱ͢ɻ DMBTTϑΝΠϧɼ+7.ͷنʹଇΓɼҰൠతʹ+BWBϓϩάϥϜ͔ΒίϯύΠϧ ͞Ε·͢ɻ
͋Δ͍ɼ,PUMJO 4DBMBͷΑ͏ͳ+7.ݴޠͱݺΕΔϓϩάϥϜɼͪΖΜ ίϯύΠϥΛࣗ࡞ͯ͠+7.ݴޠͱ͢Εɼࣗࣗͷ͖ͳͷؚΈ·͢ɻ 28 +7.ͷ࣮ํ๏
ͦͯ͠ɼ͜ΕΒ+7.4QFD 5IF +BWB7JSUVBM.BDIJOF 4QFDJ fi DBUJPO ͱݺΕΔɼυΩϡϝϯτ͕ΦϯϥΠϯͰެ։͞Ε͓ͯΓɼ+7. Λࣗ࡞͢ΔڭՊॻͱͳΓ·͢ɻ
+%,͔Βɼจࣈྻॲཧͷ࠷దԽͳͲ͕͋Γ࣮͕ࡶʹͳΔͨΊɼखܰʹΔ ͨΊʹ+%,Λਪ͠·͢ɻ +%,͕͍͍ײ͡ʹಈ͍ͨΒɼ+%,ͳͲʹγϑτ͍ͯ͘͜͠ͱΛ͓͢͢Ί͠ ·͢ɻ υΩϡϝϯτͪ͜ΒIUUQTEPDTPSBDMFDPNKBWBTFTQFDTKWNTTFIUNM 29 +7.ͷ࣮ํ๏
ͱ͍͑ʜ 30
ۙͰ--.ൃల͖͍ͯͯ͠ΔͷͰɼ$IBU(15ɼ$MBVEFɼ(FNJOJͳͲΛύʔτ φʔͱͯ͠ɼ࣮͢Δશવ͋ΓͰ͢ɻ ྫ͑ɼDMBTTϑΝΠϧͷࠜఈͷσʔλߏ$MBTT'JMF4USVDUVSFͱݺΕΔͷ Ͱ͕͢ɼ$IBU(15PͰదͳճΛग़ͯ͘͠Ε·͢ɻ 31 +7.ͷ࣮ํ๏
32 +7.ͷ࣮ํ๏ +7.4QFDΛಡΜͰ͍͘߹ IUUQTEPDTPSBDMFDPNKBWBTFTQFDTKWNTTFIUNM KWNTIUNMKWNT $IBU(15ͱҰॹʹ࡞͍ͬͯ͘
ͦͯ͠$IBU(15ͱ͍ͬ͠ΐʹ ࡞͍ͬͯ͘߹ྫࣔͯ͘͠Ε·͢ 33
34 +7.ͷ࣮ํ๏ $IBU(15ͱҰॹʹ࡞͍ͬͯ͘ͱʜ
$MBTT'JMF4USVDUVSFDMBTTϑΝΠϧͷߏΛఆٛ͢ΔॏཁͳσʔλߏͰ͢ɻ 㙽ʹ֯ʹ͜ͷΈΛΒͳ͚ΕɼଞݴޠͰ࣮Ͱ͖·ͤΜɻ ຊࢿྉΛࢀߟʹ࣮தʹ͍᪴ͨ߹ɼͥͻ--.ʹฉ͖ͳ͕ΒͬͯΒ͑Δͱ εϜʔζ͔ͳͱࢥ͍·͢ɻ Ͱɼ$MBTT'JMF4USVDUVSFΛಡΈࠐΉΈ1)1Ͱ࣮ͭͭ͠ɼࠓճ )FMMP8PSMEͷग़ྗΛΰʔϧͱ࣮ͯ͠·ͰͬͯΈ·͠ΐ͏ɻ
)FMMP8PSMEͷग़ྗͰ͋Εɼ+7.4QFDʹهࡌ͞Ε͍ͯΔ༰ͯ͢Λɼ దʹཧղ࣮ͯ͢͠Δඞཁͳ͍ͷͰɼָ࣮͘͠Ͱ͖Δ͜ͱؒҧ͍ͳ͠Ͱ͢ɻ 35 +7.ͷ࣮ํ๏
1)1Ͱͷ࣮ํ๏ 36
1)1ͰόΠφϦΛಡΉʹʜʁ 37
1)1ʹόΠφϦΛಡΈࠐΉํ๏͕ఏ ڙ͞Ε͍ͯ·͢ɻ͜͏͍ͬͨέʔεͰ GPQFO GSFBE VOQBDLͳͲ͕ ศརͰ͢ɻ DMBTTϑΝΠϧσʔλߏͱ͍͑ɼ +40/ͷΑ͏ʹϚγϯϦʔμϒϧͰ
ώϡʔϚϯϦʔμϒϧͰͳ͘ɼόΠ φϦͰ͢ɻ 38 1)1ͰόΠφϦΛಡΉʹʜʁ
όΠφϦΛಡΈࠐΜͰ͍͘ྲྀΕ 39
40 όΠφϦΛಡΈࠐΜͰ͍͘ྲྀΕ ClassFile Structure ΛಡΈࠐΉ Constant Pool ΛಡΈࠐΉ ϝιουͷใΛಡΈࠐΉ Code
Attribute ΛಡΈࠐΉ ΦϖίʔυΛ࣮ߦ͢Δ ΦϖίʔυʢϓϩάϥϜʣΛ࣮ߦ͢ΔͨΊͷ લॲཧ
$MBTT'JMF4USVDUVSF 41
$MBTT'JMF4USVDUVSFDMBTTϑΝΠϧ ͷϝλใͳͲ͕֨ೲ͞Ε͍ͯΔσʔλ ߏͰ͢ɻ ྫ͑ɼίϯύΠϧ࣌ʹ༻͍ΒΕͨ +BWBͷόʔδϣϯɼ͜ͷ͋ͱղઆ͢ Δ+7.Λ࣮͢ΔࡍͷίΞͱͳΔ $POTUBOU1PPMɼϑΟʔϧυͷใɼ ϝιουͷใͳͲͰ͢ɻ
42 $MBTT'JMF4USVDUVSF
43 $MBTT'JMF4USVDUVSF $MBTT'JMF4USVDUVSFDMBTTϑΝΠϧ ͷϝλใͳͲ͕֨ೲ͞Ε͍ͯΔσʔλ ߏͰ͢ɻ ྫ͑ɼίϯύΠϧ࣌ʹ༻͍ΒΕͨ +BWBͷόʔδϣϯɼ͜ͷ͋ͱղઆ͢ Δ+7.Λ࣮͢ΔࡍͷίΞͱͳΔ
$POTUBOU1PPMɼϑΟʔϧυͷใɼ ϝιουͷใͳͲͰ͢ɻ
$POTUBOU1PPM 44
45 $POTUBOU1PPM $POTUBOU1PPM$MBTT'JMF 4USVDUVSFͷσʔλߏͷҰ෦Ͱ +7.ʹͱͬͯಛʹίΞͱͳΔσʔλߏ Ͱ͢ɻ ɼจࣈྻɼϝιου໊ʢҾؚ ΉʣͳͲͷσʔλ͕֨ೲ͞Ε͍ͯ·͢ɻ
͜ΕΒΛऔΓग़͢͜ͱʹΑͬͯ)FMMP 8PSMEΛग़ྗ͢Δ͜ͱ͕Ͱ͖ΔΑ͏ ʹͳΓ·͢ɻ
ϝιου 46
47 ϝιου ϝιουɼ$MBTT'JMF4USVDUVSFͷ σʔλߏͷҰ෦ͰɼΞΫηεम০ࢠ ɼҾͷใΛɼͲͷ$POTUBOU 1PPM͔Βࢀর͢Δ͔Λ͍ࣔͯ͠Δͷ Ͱ͢ɻ ͜ΕΛಡΈࠐΉ͜ͱͰɼ)FMMP
8PSMEͷग़ྗ͕࣮͞Ε͍ͯΔ QVCMJDTUBUJDNBJO 4USJOH<> BSHT ͷใ͕औಘͰ͖·͢ɻ
$PEF"UUSJCVUF 48
$PEF"UUSJCVUF$MBTT'JMF4USVDUVSF Ͱఆٛ͞Ε͍ͯΔͷϝιουͷσʔλߏͷ Ұ෦Ͱ͢ɻ ϝιουʹଐੑͱͯ͠ϓϩάϥϜͷใ͕ ਵ͍ͯ͠·͢ɻ $MBTT'JMF4USVDUVSFࣗମͷ"UUSJCVUFͱ ͯ͠ɼίʔυͷߦΛ֨ೲ͍ͯ͠Δଐੑͷ
ใͳͲ͕͋Γ·͢ɻ 49 $PEF"UUSJCVUF
Φϖίʔυͷ࣮ߦ 50
Φϖίʔυʢ0Q$PEF0QFSBUJPO$PEFʣɼ໋ྩΛ͘ϚγϯϦʔμϒϧʹදݱ͠ ͍ͯΔͷͰ͢ɻ·ͨҾͷ͜ͱΛΦϖϥϯυͱ͍͍·͢ɻ $PEF"UUSJCVUFΛಡΈࠐΉ͜ͱͰɼ͜ͷ໋ྩΛऔಘͰ͖·͢ɻ 51 Φϖίʔυͷ࣮ߦ B2 00 02
12 03 B6 00 04 B1 getstatic ͷΦϖίʔυ getstatic ͷΦϖϥϯυ (Constant Pool ͷ2 ൪)
ώϡʔϚϯϦʔμϒϧͰͳ͍ͷͰɼཧղ ͕͍͠Ͱ͕͢ɼ͜ΕΒΛώϡʔϚϯϦʔ μϒϧʹͨ͠ͷ͕͋ΓɼͦΕΒΛχʔϞ χοΫʢNOFNPOJDʣͱݺΜͩΓ͠· ͢ɻ ΞηϯϒϦݴޠΛॻ͍ͨ͜ͱ͕͋Δਓ ɼͳΜͱͳ͘Πϝʔδ͔ͭ͘ͳͱࢥ͍ ·͢ɻ
+BWBKBWBQDίϚϯυͰɼͲ͏͍͏ ίʔυ͔͚·͢ɻ 52 Φϖίʔυͷ࣮ߦ
͜ͷKBWBQίϚϯυͱ ಉ͡ΦϖίʔυΛ࣮͢ΕΑ͍Ͱ͢ 53
54
KBWB-BOH4ZTUFN1)1ͷ OBNFTQBDFΛ͏·͘׆༻ͯ͠ʜ 55
56
%&.0 57 IUUQTHJTUHJUIVCDPNNNSEEDFBGFDFFBGCFDBBF
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ 58