Upgrade to Pro — share decks privately, control downloads, hide ads and more …

PHP で JVM を実装して Hello World を出力するまで

PHP で JVM を実装して Hello World を出力するまで

at builderscon tokyo 2019

English Title:
How to implement JVM by the PHP, and until output HelloWorld.

memory
PRO

August 31, 2019
Tweet

More Decks by memory

Other Decks in Programming

Transcript

  1. / / builderscon Tokyo
    PHP JVM Hello World
    © - BASE, Inc.

    View Slide

  2. © - BASE, Inc.
    Who am I?
    (@m m r )
    BASE
    PHP, React

    View Slide

  3. View Slide

  4. © - BASE, Inc.
    PHP
    JVM

    View Slide

  5. © - BASE, Inc.
    Hello World
    JVM
    PHP JVM

    View Slide

  6. View Slide

  7. © - BASE, Inc.
    PHP
    JVM Specification
    Java

    View Slide

  8. View Slide

  9. © - BASE, Inc.
    PHP JVM
    PHPerKaigi
    https://speakerdeck.com/memory /phperkaigi-

    View Slide

  10. © - BASE, Inc.
    PHP JVM OSS ( )
    https://github.com/php-java/php-java

    View Slide

  11. View Slide

  12. 1. JDK
    JDK

    View Slide

  13. 2. 


    View Slide

  14. JVM PHP

    View Slide

  15. © - BASE, Inc.
    PHP
    JVM

    View Slide

  16. View Slide

  17. © - BASE, Inc.
    PHP

    View Slide

  18. © - BASE, Inc.

    View Slide

  19. © - BASE, Inc.
    2014
    2015 1 30
    nbproject Netbeans C:\\ 

    Windows
    1 

    (Hello World )

    ( )

    View Slide

  20. © - BASE, Inc.

    View Slide

  21. © - BASE, Inc.

    View Slide

  22. © - BASE, Inc.

    View Slide

  23. © - BASE, Inc.

    View Slide

  24. © - BASE, Inc.

    View Slide

  25. © - BASE, Inc.

    View Slide

  26. © - BASE, Inc.

    View Slide

  27. © - BASE, Inc.
    Wikipedia JVM 

    PHP
    ( ) https://en.wikipedia.org/wiki/List_of_Java_virtual_machines
    JPHP Java PHP
    ( ) https://github.com/jphp-group/jphp

    View Slide

  28. © - BASE, Inc.
    PHP

    View Slide

  29. © - BASE, Inc.
    PHP
    PHP
    PHP
    Laravel 

    PHP 

    JVM

    View Slide

  30. © - BASE, Inc.
    PHP
    JVM

    View Slide

  31. JVM

    View Slide

  32. © - BASE, Inc.
    JVM
    JVM class 

    (= )

    View Slide

  33. © - BASE, Inc.
    JVM
    class
    javac java
    JAR (Java ARchive) class
    kotlinc -include-runtime class 

    JAR
    Scala sbt-assembly JAR

    View Slide

  34. © - BASE, Inc.
    JVM
    JVM
    C CPU
    Oracle 

    PHP
    Rust ( )
    invoke_*

    View Slide

  35. © - BASE, Inc.
    JVM
    3
    PHP
    PHP class

    View Slide

  36. © - BASE, Inc.
    JVM
    PHP
    PHP class

    View Slide

  37. © - BASE, Inc.
    JVM
    PHP class
    PHPerKaigi 

    https://speakerdeck.com/memory /phperkaigi-

    View Slide

  38. © - BASE, Inc.
    PHP
    JVM

    View Slide

  39. PHP

    View Slide

  40. PHP

    View Slide

  41. © - BASE, Inc.
    PHP
    PHP Object
    java.lang.Object?
    String Void
    Integer, Long OK

    View Slide

  42. © - BASE, Inc.
    PHP
    Swoole parallel


    View Slide

  43. © - BASE, Inc.
    PHP
    PHP Exception
    Java java.lang.Object

    View Slide

  44. View Slide

  45. View Slide

  46. © - BASE, Inc.
    Hello World
    JVM
    PHP JVM

    View Slide

  47. JVM

    View Slide

  48. OpCode

    View Slide

  49. OpCode

    View Slide

  50. View Slide

  51. © - BASE, Inc.
    1
    JVM 算

    View Slide

  52. © - BASE, Inc.
    CPU
    mov rax, rbx
    ( 0x )
    1, 2

    View Slide

  53. © - BASE, Inc.
    JVM
    ldc #
    ( 0x )
    #3 Constant Pool 3

    View Slide

  54. Constant Pool

    View Slide

  55. © - BASE, Inc.
    Constant Pool
    Constant Pool 

    The Java Virtual Machine maintains a per-type constant pool, a run-
    time data structure that serves many of the purposes of the symbol
    table of a conventional programming language implementation.
    Java Virtual Machine Specification :
    : https://docs.oracle.com/javase/specs/jvms/se /html/jvms- .html#jvms- .
    Constant Pool Hello World 

    JVM Constant Pool

    View Slide

  56. © - BASE, Inc.
    Constant Pool
    Constant Pool 

    Java Virtual Machine Constant Pool ( )
    Java Virtual Machine Specification :
    : https://docs.oracle.com/javase/specs/jvms/se /html/jvms- .html#jvms- .
    Constant Pool Hello World 

    JVM Constant Pool

    View Slide

  57. © - BASE, Inc.
    Constant Pool
    Constant Pool

    View Slide

  58. © - BASE, Inc.
    Constant Pool
    Constant Pool
    Constant Pool

    View Slide

  59. © - BASE, Inc.
    Hello World
    JVM
    PHP JVM

    View Slide

  60. Hello World

    View Slide

  61. View Slide

  62. © - BASE, Inc.
    PHP
    JDK

    View Slide

  63. View Slide

  64. © - BASE, Inc.
    java
    javap
    Constant Pool 

    javac
    Java
    php

    View Slide

  65. Java

    View Slide

  66. View Slide

  67. © - BASE, Inc.
    Java

    View Slide

  68. Hello World

    View Slide

  69. © - BASE, Inc.
    Hello World
    Hello World ClassFile Structure 

    Constant Pool
    Methodref

    Constant Pool
    Code Attribute
    Code Attribute Constant Pool
    : https://docs.oracle.com/javase/specs/jvms/se /html/jvms- .html#jvms- .

    View Slide

  70. View Slide

  71. © - BASE, Inc.
    ClassFile Structure
    Code Attribute
    1
    Constant Pool

    View Slide

  72. © - BASE, Inc.
    ClassFile Structure
    Code Attribute
    1
    Constant Pool

    View Slide

  73. ClassFile Structure

    View Slide

  74. © - BASE, Inc.
    ClassFile Structure
    ClassFile Structure 

    Java
    Constant Pool
    etc
    : https://docs.oracle.com/javase/specs/jvms/se /html/jvms- .html#jvms- .

    View Slide

  75. © - BASE, Inc.
    ClassFile Structure
    : https://docs.oracle.com/javase/specs/jvms/se /html/jvms- .html#jvms- .
    JVM Specification

    View Slide

  76. © - BASE, Inc.
    ClassFile Structure
    : https://docs.oracle.com/javase/specs/jvms/se /html/jvms- .html#jvms- .
    JVM Specification

    View Slide

  77. © - BASE, Inc.
    ClassFile Structure
    javac 

    : https://docs.oracle.com/javase/specs/jvms/se /html/jvms- .html#jvms- .
    javac -encoding UTF- HelloWorld.java

    View Slide

  78. © - BASE, Inc.
    ClassFile Structure
    PHP 

    unpack
    fopen
    fread
    unpack
    https://gist.github.com/memory-agape/
    d dce af ece e afb e caa e

    View Slide

  79. ClassFile Structure
    Constant Pool

    View Slide

  80. © - BASE, Inc.
    ClassFile Structure
    Code Attribute
    1
    Constant Pool

    View Slide

  81. © - BASE, Inc.
    Constant Pool
    : https://docs.oracle.com/javase/specs/jvms/se /html/jvms- .html#jvms- .
    Constant Pool
    u unsigned short

    View Slide

  82. © - BASE, Inc.
    Constant Pool
    Constant Pool

    View Slide

  83. © - BASE, Inc.
    Constant Pool
    : https://docs.oracle.com/javase/specs/jvms/se /html/jvms- .html#jvms- .
    Constant Pool 16bit 

    Constant Pool 

    JVM Specification

    View Slide

  84. © - BASE, Inc.
    Constant Pool
    : https://docs.oracle.com/javase/specs/jvms/se /html/jvms- .html#jvms- .
    tag Constant Pool
    tag
    prefix CONSTANT_
    छྨ ஋ छྨ ஋
    Class 0x07 Fieldref 0x09
    Methodref 0x0A InterfaceMethodref 0x0B
    String 0x08 Integer 0x03
    Float 0x04 Long 0x05
    Double 0x06 NameAndType 0x0C
    Utf8 0x01 MethodHandle 0x0F
    MethodType 0x10 InvokeDynamic 0x12

    View Slide

  85. © - BASE, Inc.
    Constant Pool
    : https://docs.oracle.com/javase/specs/jvms/se /html/jvms- .html#jvms- .
    Hello World Class, Methodref, 

    String, Utf , NameAndType 5
    छྨ ஋ छྨ ஋
    Class 0x07 Fieldref 0x09
    Methodref 0x0A InterfaceMethodref 0x0B
    String 0x08 Integer 0x03
    Float 0x04 Long 0x05
    Double 0x06 NameAndType 0x0C
    Utf8 0x01 MethodHandle 0x0F
    MethodType 0x10 InvokeDynamic 0x12

    View Slide

  86. © - BASE, Inc.
    Constant Pool
    : https://docs.oracle.com/javase/specs/jvms/se /html/jvms- .html#jvms- .

    View Slide

  87. ClassFile Structure

    View Slide

  88. © - BASE, Inc.
    ClassFile Structure
    Code Attribute
    1
    Constant Pool

    View Slide

  89. © - BASE, Inc.
    : https://docs.oracle.com/javase/specs/jvms/se /html/jvms- .html#jvms- .
    ClassFile Structure

    View Slide

  90. © - BASE, Inc.

    CodeAttribute

    View Slide

  91. © - BASE, Inc.

    CodeAttribute

    View Slide

  92. © - BASE, Inc.
    : https://docs.oracle.com/javase/specs/jvms/se /html/jvms- .html#jvms- .

    View Slide

  93. © - BASE, Inc.
    : https://docs.oracle.com/javase/specs/jvms/se /html/jvms- .html#jvms- .
    CodeAttribute
    Constant Pool 

    ( CONSTANT_Utf )

    View Slide

  94. © - BASE, Inc.
    ClassFile Structure
    Code Attribute
    1
    Constant Pool

    View Slide

  95. Code Attribute

    View Slide

  96. © - BASE, Inc.
    Code Attribute
    Code Attribute 


    View Slide

  97. © - BASE, Inc.
    Code Attribute
    Code Attribute 


    View Slide

  98. © - BASE, Inc.
    Code Attribute

    View Slide

  99. © - BASE, Inc.
    Code Attribute

    View Slide

  100. View Slide

  101. View Slide

  102. © - BASE, Inc.
    ClassFile Structure
    Code Attribute
    1
    Constant Pool

    View Slide

  103. 1

    View Slide

  104. javap

    View Slide

  105. © - BASE, Inc.
    javap

    View Slide

  106. © - BASE, Inc.
    javap

    main
    main
    #

    View Slide

  107. View Slide

  108. © - BASE, Inc.
    (java.lang.Object)
    main
    System.out.println Hello World!

    View Slide

  109. View Slide

  110. © - BASE, Inc.
    : https://docs.oracle.com/javase/specs/jvms/se /html/jvms- .html#jvms- .
    χʔϞχοΫ Φϖίʔυ ໾ׂ
    getstatic 0xB2 Get static field from class
    ldc 0x12 Push item from run-time constant pool
    invokevirtual 0xB6 Invoke instance method; dispatch based on class
    return 0xB1 Return void from method

    View Slide

  111. © - BASE, Inc.
    : https://docs.oracle.com/javase/specs/jvms/se /html/jvms- .html#jvms- .

    χʔϞχοΫ Φϖίʔυ ໾ׂ
    getstatic 0xB2 ੩తϑΟʔϧυΛऔಘͯ͠ɺΦϖϥϯυελοΫʹੵΈ·͢ɻ
    ldc 0x12 Constant Pool ͔Β஋Λऔಘͯ͠ɺΦϖϥϯυελοΫʹੵΈ·͢ɻ
    invokevirtual 0xB6 ΦϖϥϯυελοΫͷ஋ΑΓɺΫϥε্ʹ͓͚ΔϝιουΛ࣮ߦ͠·͢
    return 0xB1 void Λฦ͠·͢ɻPHP ͸੍໿͕͋Γɺ return; ͱͯ͠΋ null Λฦ͢࢓༷Ͱ͢

    View Slide

  112. © - BASE, Inc.
    (Operand Stack)
    JVM
    JVM
    PHPer array_push 

    array_pop

    View Slide

  113. View Slide

  114. © - BASE, Inc.
    public static main (String[])
    main 

    ( )
    ldc
    invokevirtual
    return
    getstatic

    View Slide

  115. © - BASE, Inc.
    public static main (String[])
    main 

    ( )
    getstatic
    ldc
    invokevirtual
    return
    System.out 


    View Slide

  116. © - BASE, Inc.
    public static main (String[])
    main 

    ( )
    ldc
    invokevirtual
    return
    getstatic
    java.lang.String (Hello World)

    View Slide

  117. © - BASE, Inc.
    public static main (String[])
    main 

    ( )
    getstatic
    ldc
    invokevirtual
    return
    System.out 

    Hello World

    View Slide

  118. © - BASE, Inc.
    public static main (String[])
    main 

    ( )
    getstatic
    ldc
    invokevirtual
    return
    void 

    PHP void

    View Slide

  119. Code Attribute

    View Slide

  120. © - BASE, Inc.
    Code Attribute
    main 16
    B B B

    View Slide

  121. © - BASE, Inc.
    Code Attribute
    main 16
    B B B
    getstatic
    getstatic (Constant Pool 2 )

    View Slide

  122. © - BASE, Inc.
    Code Attribute
    main 16
    B B B
    ldc
    ldc (Constant Pool 3 )

    View Slide

  123. © - BASE, Inc.
    Code Attribute
    main 16
    B B B
    invokevirtual
    invokevirtual (Constant Pool 4 )

    View Slide

  124. © - BASE, Inc.
    Code Attribute
    main 16
    B B B
    return

    View Slide

  125. PHP

    View Slide

  126. View Slide

  127. © - BASE, Inc.
    PHP

    View Slide

  128. getstatic

    View Slide

  129. © - BASE, Inc.
    getstatic
    getstatic
    2 (operand[ ] << ) | operand[ ]
    unsigned short
    Constant Pool
    Constant Pool Operand Stack 

    PHP unsigned short unpack 

    PHP 

    PHP unsigned short v n 

    n
    : https://docs.oracle.com/javase/specs/jvms/se /html/jvms- .html#jvms- . .getstatic

    View Slide

  130. © - BASE, Inc.
    getstatic
    : https://docs.oracle.com/javase/specs/jvms/se /html/jvms- .html#jvms- . .getstatic

    View Slide

  131. © - BASE, Inc.
    getstatic
    : https://docs.oracle.com/javase/specs/jvms/se /html/jvms- .html#jvms- . .getstatic
    2 unsigned short

    View Slide

  132. © - BASE, Inc.
    getstatic
    : https://docs.oracle.com/javase/specs/jvms/se /html/jvms- .html#jvms- . .getstatic
    java.lang.System Constant Pool

    View Slide

  133. © - BASE, Inc.
    getstatic
    : https://docs.oracle.com/javase/specs/jvms/se /html/jvms- .html#jvms- . .getstatic
    out Constant Pool

    View Slide

  134. © - BASE, Inc.
    getstatic
    : https://docs.oracle.com/javase/specs/jvms/se /html/jvms- .html#jvms- . .getstatic
    out Constant Pool
    PrintStream out

    View Slide

  135. © - BASE, Inc.
    getstatic
    : https://docs.oracle.com/javase/specs/jvms/se /html/jvms- .html#jvms- . .getstatic
    java/lang/System PHP 

    java\lang\System

    View Slide

  136. © - BASE, Inc.
    getstatic
    : https://docs.oracle.com/javase/specs/jvms/se /html/jvms- .html#jvms- . .getstatic

    View Slide

  137. ldc

    View Slide

  138. © - BASE, Inc.
    ldc
    ldc
    1
    Constant Pool
    int, float, ,
    ldc ldc_w ldc _w
    : https://docs.oracle.com/javase/specs/jvms/se /html/jvms- .html#jvms- . .getstatic

    View Slide

  139. © - BASE, Inc.
    ldc
    : https://docs.oracle.com/javase/specs/jvms/se /html/jvms- .html#jvms- . .getstatic

    View Slide

  140. © - BASE, Inc.
    ldc
    : https://docs.oracle.com/javase/specs/jvms/se /html/jvms- .html#jvms- . .getstatic
    1 

    Constant Pool

    View Slide

  141. © - BASE, Inc.
    ldc
    : https://docs.oracle.com/javase/specs/jvms/se /html/jvms- .html#jvms- . .getstatic
    Constant Pool 

    Constant Pool 

    Constant Pool Hello World

    View Slide

  142. © - BASE, Inc.
    ldc
    : https://docs.oracle.com/javase/specs/jvms/se /html/jvms- .html#jvms- . .getstatic
    Hello World

    View Slide

  143. invokevirtual

    View Slide

  144. © - BASE, Inc.
    invokevirtual
    invokevirtual invokevirtual 

    invoke php-java 

    invokevirtual
    2 Constant Pool
    descriptor_index 範 

    : https://docs.oracle.com/javase/specs/jvms/se /html/jvms- .html#jvms- . .invokevirtual

    View Slide

  145. © - BASE, Inc.
    invokevirtual
    invokevirtual Hello World 


    View Slide

  146. © - BASE, Inc.
    invokevirtual
    invokevirtual Hello World 

    2

    View Slide

  147. © - BASE, Inc.
    invokevirtual
    : https://docs.oracle.com/javase/specs/jvms/se /html/jvms- .html#jvms- . .getstatic
    invokevirtual Hello World 


    NameAndType Structure

    View Slide

  148. © - BASE, Inc.
    invokevirtual
    invokevirtual Hello World 


    ;

    View Slide

  149. © - BASE, Inc.
    invokevirtual
    invokevirtual Hello World 


    1 範

    View Slide

  150. © - BASE, Inc.
    invokevirtual
    invokevirtual Hello World 


    View Slide

  151. © - BASE, Inc.
    invokevirtual
    invokevirtual Hello World 

    java/lang/System.out.println

    View Slide

  152. java/lang/System.out.println

    View Slide

  153. View Slide

  154. java\lang\System.out

    View Slide

  155. © - BASE, Inc.
    java\lang\System.out
    : https://docs.oracle.com/javase/specs/jvms/se /html/jvms- .html#jvms- . .getstatic
    $out PrintStream 

    PHP 


    View Slide

  156. java\io\PrintStream.println

    View Slide

  157. © - BASE, Inc.
    java\io\PrintStream.println
    : https://docs.oracle.com/javase/specs/jvms/se /html/jvms- .html#jvms- . .getstatic
    java\lang\System.out PrintStream 

    PrintStream

    View Slide

  158. php

    View Slide

  159. © - BASE, Inc.
    php
    DEMONSTRATION

    View Slide

  160. Hello World

    View Slide

  161. return

    View Slide

  162. © - BASE, Inc.
    return
    return void PHP void
    return ireturn, freturn, areturn dreturn
    monitorexit 

    : https://docs.oracle.com/javase/specs/jvms/se /html/jvms- .html#jvms- . .return

    View Slide

  163. © - BASE, Inc.
    return
    : https://docs.oracle.com/javase/specs/jvms/se /html/jvms- .html#jvms- . .getstatic
    return

    View Slide

  164. © - BASE, Inc.
    return
    : https://docs.oracle.com/javase/specs/jvms/se /html/jvms- .html#jvms- . .getstatic
    return
    while break 

    PHP break continue 


    View Slide

  165. Hello World

    View Slide

  166. THANK YOU FOR YOUR LISTENING

    View Slide