1 / 42

Building a JIT compiler for PHP in 2 days

Building a JIT compiler for PHP in 2 days. Nuno Lopes nuno.lopes@ist.utl.pt Instituto Superior Técnico Technical University of Lisbon. Outline. Overview of the Zend VM Design Rationale Implementation Results Future Work. Overview of the Zend VM. Overview of the Zend VM.

marilu
Download Presentation

Building a JIT compiler for PHP in 2 days

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Building a JIT compiler for PHP in 2 days Nuno Lopes nuno.lopes@ist.utl.pt Instituto Superior Técnico Technical University of Lisbon

  2. Outline • Overview of the Zend VM • Design Rationale • Implementation • Results • Future Work

  3. Overview of the Zend VM

  4. Overview of the Zend VM • Syntax-directed translation

  5. Overview of the Zend VM • Syntax-directed translation • Interprets bytecode

  6. Overview of the Zend VM • Syntax-directed translation • Interprets bytecode • No code optimizations

  7. PHP bytecode

  8. PHP bytecode • Memory based (vs register or stack based)

  9. PHP bytecode • Memory based (vs register or stack based) • No standard representation

  10. PHP bytecode • Memory based (vs register or stack based) • No standard representation • Designed to be executed and discarded

  11. PHP bytecode • Memory based (vs register or stack based) • No standard representation • Designed to be executed and discarded • Some information is not stored in bytecode (e.g. class definitions)

  12. <?phpif (1 > 2)         $a = 2 * 3; else         $a = 2 * 4;echo $a;?>

  13. Design Rationale

  14. Design Rationale • Do not rewrite the whole VM from scratch

  15. Design Rationale • Do not rewrite the whole VM from scratch • Have a proof-of-concept working ASAP

  16. Design Rationale • Do not rewrite the whole VM from scratch • Have a proof-of-concept working ASAP • Leave room for future optimizations

  17. Implementation

  18. Implementation • Works as a Zend VM extension("a speedup plugin") 

  19. Implementation • Works as a Zend VM extension("a speedup plugin") • Hooks as the bytecode executor

  20. Implementation • Works as a Zend VM extension("a speedup plugin") • Hooks as the bytecode executor • Updates the state of the VM

  21. Implementation • Works as a Zend VM extension("a speedup plugin") • Hooks as the bytecode executor • Updates the state of the VM • Can be used along with the old interpreter

  22. Implementation #2

  23. Implementation #2 • Offline compilation of Zend VM bytecode handlers to LLVM

  24. Implementation #2 • Offline compilation of Zend VM bytecode handlers to LLVM • Translation of bytecodes to handler calls

  25. Implementation #2 • Offline compilation of Zend VM bytecode handlers to LLVM • Translation of bytecodes to handler calls • JIT compilation of one function at a time

  26. Implementation #2 • Offline compilation of Zend VM bytecode handlers to LLVM • Translation of bytecodes to handler calls • JIT compilation of one function at a time • Performs simple optimizations (including inlining)

  27. Implementation #2 • Offline compilation of Zend VM bytecode handlers to LLVM • Translation of bytecodes to handler calls • JIT compilation of one function at a time • Performs simple optimizations (including inlining) • Uses a small runtime "library" 

  28. zend_execute() while (1) {    int ret;    if ((ret = EX(opline)->handler(data)) > 0) {        switch (ret) {            ...        }    }}

  29. <?phpif (1 > 2)         $a = 2 * 3; else         $a = 2 * 4;echo $a;?>

  30. LLVM bitcode op_block: %execute_data = call @phpllvm_get_execute_data(%1) %execute_result = call @ZEND_IS_SMALLER_HANDLER(%execute_data) switch i32 %execute_result, label %op_block1 [     i32 1, label %pre_vm_return     i32 2, label %pre_vm_enter     i32 3, label %pre_vm_leave]

  31. LLVM bitcode op_block1: %execute_data = call @phpllvm_get_execute_data(%1) %execute_result = call  @ZEND_JMPZ_HANDLER(%execute_data) %current = call i32 @phpllvm_get_opline_number(%1) switch i32 %current, label %ret [     i32 5, label %op_block5     i32 2, label %op_block2]

  32. Results of "Hello World" • Vanilla: 0.03s • JIT Debug: 2.5s • JIT Release: 0.68s • JIT Release+no asserts: 0.64s Slowdown: 21x 

  33. Results

  34. Future Work

  35. Future Work • Compiled code caching and sharing

  36. Future Work • Compiled code caching and sharing • Self-executable apps ("normal", GTK, etc..)

  37. Future Work • Compiled code caching and sharing • Self-executable apps ("normal", GTK, etc..) • Self-contained webapps (with e.g. Apache)

  38. Future Work • Compiled code caching and sharing • Self-executable apps ("normal", GTK, etc..) • Self-contained webapps (with e.g. Apache) • Optimizations (lots of them :)

  39. Questions?

More Related