$30 off During Our Annual Pro Sale. View Details »

PHP で JVM を実装して、 HelloWorld を出力してみる

memory
PRO
February 09, 2020

PHP で JVM を実装して、 HelloWorld を出力してみる

- PHPerKaigi 2020

- English Title:
Implement JVM with PHP and try to output Hello World

memory
PRO

February 09, 2020
Tweet

More Decks by memory

Other Decks in Programming

Transcript

  1. / / PHPerKaigi
    PHP JVM HelloWorld
    © - BASE, Inc.

    View Slide

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

    View Slide

  3. © - BASE, Inc.
    Who am I?

    View Slide

  4. View Slide

  5. © - BASE, Inc.
    PHPerKaigi Builderscon

    View Slide

  6. © - BASE, Inc.
    php-java/php-java

    View Slide

  7. OSS

    View Slide

  8. View Slide

  9. © - BASE, Inc.
    JVM
    PHP

    View Slide

  10. © - BASE, Inc.
    Hello World

    View Slide

  11. JVM

    View Slide

  12. JVM

    View Slide

  13. © - BASE, Inc.
    JVM
    JVM Java Virtual Machine
    Java
    JVM
    JRE JDK

    View Slide

  14. JVM

    View Slide

  15. exec('java HelloWorld')

    View Slide

  16. exec('java HelloWorld')

    View Slide

  17. © - BASE, Inc.
    JVM
    Java
    class
    class
    JVM

    View Slide

  18. © - BASE, Inc.
    JVM
    JVM Java Virtual Machine
    Specification Oracle

    View Slide

  19. © - BASE, Inc.
    JVM

    View Slide

  20. © - BASE, Inc.
    JVM
    Java class

    View Slide

  21. © - BASE, Inc.
    JVM

    View Slide

  22. © - BASE, Inc.
    JVM
    class

    View Slide

  23. JVM

    View Slide

  24. © - BASE, Inc.
    Perl
    PHP
    JavaScript
    /
    Builderscon
    YAPC::Kyoto
    PHPerKaigi
    Qiita
    JVM

    View Slide

  25. JVM

    View Slide

  26. © - BASE, Inc.
    Rust
    Emacs
    Go
    Ruby
    rchaser
    gongoZ
    DQNEO
    Daiki Miura
    JVM

    View Slide

  27. JVM

    View Slide

  28. JVM,

    View Slide

  29. PHP

    View Slide

  30. View Slide

  31. © - BASE, Inc.
    fopen /
    fread OK

    View Slide

  32. View Slide

  33. © - BASE, Inc.
    16
    short, unsigned short, integer,
    unsigned integer
    pack / unpack
    JVM

    View Slide

  34. View Slide

  35. PHP

    View Slide

  36. © - BASE, Inc.
    PHP
    int (- ^ ^ - )
    bool
    string
    float, double
    array
    null
    etc...

    View Slide

  37. Java

    View Slide

  38. © - BASE, Inc.
    Java
    byte
    char
    short (- ^ ^ - )
    int (- ^ ^ - )
    long (- ^ ^ - )
    boolean
    float
    double

    View Slide

  39. View Slide

  40. PHP Java

    View Slide

  41. View Slide

  42. View Slide

  43. © - BASE, Inc.
    ( )
    JVM invokevirtual iload / istore

    View Slide

  44. Hello World

    View Slide

  45. Java Virtual Machine Specification

    View Slide

  46. © - BASE, Inc.
    JVM Spec
    Java Virtual Machine Specification
    JVM Spec
    JVM Spec Oracle JVM
    https://docs.oracle.com/javase/specs/
    index.html

    View Slide

  47. ClassFile Structure

    View Slide

  48. © - BASE, Inc.
    ClassFile Structure

    View Slide

  49. © - BASE, Inc.
    ClassFile Structure

    View Slide

  50. © - BASE, Inc.
    JVM Spec
    u unsigned int
    u unsigned short

    View Slide

  51. Hello World

    View Slide

  52. © - BASE, Inc.
    Constant Pool Method
    Info Code Attribute
    Hello World

    View Slide

  53. Method Info

    View Slide

  54. © - BASE, Inc.
    Method Info

    View Slide

  55. © - BASE, Inc.
    Method Info

    View Slide

  56. Code Attribute

    View Slide

  57. View Slide

  58. © - BASE, Inc.
    Code Attribute

    View Slide

  59. © - BASE, Inc.
    Code Attribute

    View Slide

  60. © - BASE, Inc.
    Code Attribute

    View Slide

  61. © - BASE, Inc.
    Code Attribute

    View Slide

  62. © - BASE, Inc.
    Code Attribute

    View Slide

  63. © - BASE, Inc.
    Code Attribute

    View Slide

  64. © - BASE, Inc.
    Code Attribute

    View Slide

  65. View Slide

  66. © - BASE, Inc.
    JVM Spec
    code[code_length]
    JVM Spec

    View Slide

  67. View Slide

  68. View Slide

  69. View Slide

  70. © - BASE, Inc.
    java.lang.System.out
    getstatic
    println
    invokevirtual

    View Slide

  71. © - BASE, Inc.
    Constant Pool
    ldc
    return

    View Slide

  72. 4

    View Slide

  73. View Slide

  74. getstatic

    View Slide

  75. © - BASE, Inc.
    getstatic
    getstatic
    getstatic Constant Pool
    unsigned short

    View Slide

  76. © - BASE, Inc.
    getstatic
    getstatic <0xB >
    putstatic

    View Slide

  77. © - BASE, Inc.
    getstatic

    View Slide

  78. © - BASE, Inc.
    getstatic

    View Slide

  79. © - BASE, Inc.
    getstatic

    View Slide

  80. © - BASE, Inc.
    getstatic

    View Slide

  81. © - BASE, Inc.
    getstatic

    View Slide

  82. © - BASE, Inc.
    getstatic

    View Slide

  83. © - BASE, Inc.
    getstatic

    View Slide

  84. invokevirtual

    View Slide

  85. © - BASE, Inc.
    invokevirtual
    invokevirtual
    Constant Pool

    View Slide

  86. © - BASE, Inc.
    invokevirtual
    invokevirtual <0xB >
    invoke dynamic, special, interface,
    static

    View Slide

  87. © - BASE, Inc.
    invokevirtual
    invoke JVM
    invoke
    invokedynamic
    invokeinterface

    View Slide

  88. © - BASE, Inc.
    invokevirtual

    View Slide

  89. © - BASE, Inc.
    invokevirtual

    View Slide

  90. © - BASE, Inc.
    invokevirtual

    View Slide

  91. © - BASE, Inc.
    invokevirtual

    View Slide

  92. © - BASE, Inc.
    invokevirtual

    View Slide

  93. © - BASE, Inc.
    invokevirtual

    View Slide

  94. © - BASE, Inc.
    invokevirtual
    void

    View Slide

  95. ldc

    View Slide

  96. © - BASE, Inc.
    ldc
    ldc Constant Pool UTF
    Integer, short, byte
    Constant
    Pool unsigned byte

    View Slide

  97. © - BASE, Inc.
    ldc
    ldc
    Long Double

    View Slide

  98. © - BASE, Inc.
    ldc

    View Slide

  99. © - BASE, Inc.
    ldc
    Constant Pool

    View Slide

  100. © - BASE, Inc.
    ldc
    Constant Pool

    View Slide

  101. © - BASE, Inc.
    ldc

    View Slide

  102. return

    View Slide

  103. © - BASE, Inc.
    return
    return
    void
    moniterenter
    return areturn, ireturn,
    freturn, dreturn

    View Slide

  104. Hello World

    View Slide

  105. © - BASE, Inc.
    Hello World
    B NN MM NN B NN MM B

    View Slide

  106. © - BASE, Inc.
    Hello World
    B NN MM NN B NN MM B
    getstatic

    View Slide

  107. © - BASE, Inc.
    Hello World
    B NN MM NN B NN MM B
    unsigned short

    View Slide

  108. © - BASE, Inc.
    Hello World
    B NN MM NN B NN MM B
    ldc

    View Slide

  109. © - BASE, Inc.
    Hello World
    B NN MM NN B NN MM B
    unsigned byte
    Hello World
    Constant Pool

    View Slide

  110. © - BASE, Inc.
    Hello World
    B NN MM NN B NN MM B
    invokevirtual

    View Slide

  111. © - BASE, Inc.
    Hello World
    B NN MM NN B NN MM B
    unsigned short
    Constant Pool

    View Slide

  112. © - BASE, Inc.
    Hello World
    B NN MM NN B NN MM B
    return

    View Slide

  113. View Slide

  114. "java.lang.System"

    View Slide

  115. © - BASE, Inc.
    "java.lang.System"
    Java java.lang.System
    PHP
    "java\lang\System"
    System
    "out"

    View Slide

  116. © - BASE, Inc.
    "java.lang.System"
    ;

    View Slide

  117. "out"

    View Slide

  118. © - BASE, Inc.
    "out"
    PHP JVM static

    View Slide

  119. © - BASE, Inc.
    "out"

    View Slide

  120. © - BASE, Inc.
    "out"

    View Slide

  121. "println"
    "java.io.PrintStream"

    View Slide

  122. © - BASE, Inc.
    "java.io.PrintStream"

    View Slide

  123. Hello World

    View Slide

  124. DEMO

    View Slide

  125. THANK YOU FOR YOUR LISTENING

    View Slide