HipHop Virtual Machine เวอร์ชันสองของ HipHop for PHP

by mk
11 December 2011 - 02:59

ข่าวนี้เหมาะมากสำหรับคนที่สนใจเรื่องการออกแบบคอมไพเลอร์นะครับ (มีหรือเปล่าหว่า?)

ย้อนความกันหน่อยว่า เว็บไซต์ขนาดมหึมาอย่าง Facebook ถูกเขียนขึ้นมาด้วย PHP แต่จำนวนผู้ใช้ระดับนี้ ต้องการประสิทธิภาพที่สูงกว่า PHP ทั่วไป และแนวทางมาตรฐานของวงการคือแปลงฟังก์ชันบางส่วนเป็น C++ เพื่อรีดประสิทธิภาพให้ดียิ่งขึ้น

อย่างไรก็ตาม การแปลบางส่วนของโค้ด PHP เป็น C++ จะมีปัญหาเรื่องการดูแลรักษาโค้ดในระยะยาว (โดยเฉพาะโค้ดที่ซับซ้อนระดับของ Facebook) ซึ่งทางแก้ของบริษัทก็คือพัฒนา HipHop for PHP เป็นตัวช่วยแปล PHP เป็น C++ โดยอัตโนมัติ นั่นคือตอนโปรแกรมเมอร์เขียนก็เป็นเป็น PHP แต่ตอนใช้งานจริงก็ใช้ HipHop ช่วยแปลเป็น C++ ให้ แล้วนำไปคอมไพล์ตามปกติอีกครั้ง (รายละเอียดอ่านในข่าวเก่า)

อธิบายอีกครั้งคือ กระบวนการแปลโค้ดของ Facebook จะเป็น 2 ขั้นดังนี้

  1. PHP→AST→C++ ด้วย HipHop (หมายเหตุ: AST = abstract syntax tree)
  2. C++→x64 ด้วย g++

แต่ในการใช้งานจริง Facebook แบ่ง HipHop for PHP ออกเป็น 2 โหมดสำหรับ 2 งาน

  • HipHop interpreter (hphpi) ตัวแปลภาษาแบบ interpreter สำหรับโปรแกรมเมอร์ภายในบริษัททดสอบโค้ดใหม่ๆ จะได้ไม่เสียเวลาคอมไพล์
  • HipHop compiler (hphpc) ตัวแปลภาษาแบบ compiler สำหรับงานที่ใช้จริง ให้บริการผู้ใช้จริงๆ เพื่อประสิทธิภาพที่ดีกว่า

ปัญหาที่ Facebook พบกับ HipHop มีสองประการ

  • ทั้ง hphpi/hphpc ใช้การแปลงโค้ด PHP→C++ แบบ static ซึ่งมีอุปสรรคในการปรับแต่งโค้ดให้มีประสิทธิภาพที่ดีขึ้น (อ่านเรื่อง binary translation ประกอบ)
  • ฐานโค้ดของ hphpi/hphpc เป็นคนละชุดกัน มีกระบวนการแปลโค้ด (ส่วนของ AST) คนละชุดกัน ทำให้ดูแลโค้ดของ hphpi/hphpc ลำบากเพราะต้องทำสองชุดขนานกันไป

ทางออกของ Facebook ในการแก้ปัญหาทั้งสองอย่างคือเปลี่ยนมาใช้การแปลโค้ดแบบ dynamic translation ที่มีประสิทธิภาพมากขึ้น และสร้าง "ไบต์โค้ด" กลางที่ใช้ร่วมกันระหว่างโหมด interpreter/compiler จะได้ดูแลง่ายขึ้น

ชื่อของมันคือ HipHop Virtual Machine (hhvm) ส่วนภาษาไบต์โค้ดใหม่เรียกว่า HipHop bytecode (HHBC)

hhvm/hhbc ใช้เทคนิคการแปลโค้ดที่ต่างไปจาก virtual machine อื่นๆ ในท้องตลาด (Java และ C# ใช้ JIT ส่วนเอนจินจาวาสคริปต์อย่าง TraceMonkey ใช้วิธี trace) เทคนิคของ hhvm จะเรียบง่ายกว่า โดยเรียกว่า "tracelet" (รายละเอียดผมคงไม่ลงลึก ใครอยากรู้ก็ตามไปอ่านกันต่อเองครับ)

ตอนนี้ Facebook พัฒนา hhvm ให้มีประสิทธิภาพดีกว่า hphpi ได้แล้ว (เร็วกว่า 1.6 เท่า) แต่ยังไม่เร็วเท่ากับ hphpc (ทำงานได้ 0.6 เท่าของ hphpc) อย่างไรก็ตาม Facebook คาดว่าจะพัฒนา hhvm ให้แซง hphpc ได้ในท้ายที่สุด

นักพัฒนาของ Facebook เปลี่ยนจาก hphpi มาเป็น hhvm สำหรับงานพัฒนาภายในองค์กรกันแล้ว ซึ่ง Facebook ให้เหตุผลว่ากระบวนการแปลโค้ดที่เร็วขึ้นจากเดิม 3 วินาทีก็มีความหมายกับโปรแกรมเมอร์ของบริษัทเป็นอย่างมาก

โค้ดของ hhvm ถูกปล่อยออกมาแล้วใน GitHub ของ HipHop ใครสนใจก็ตามไปดูกันเองนะครับ

ที่มา - Facebook Engineering's Notes

Blognone Jobs Premium