เหตุใด Facebook จึงแปลงรหัส PHP เป็น C ++ [ปิด]


42

ฉันอ่านว่า Facebook เริ่มต้นใน PHP และจากนั้นเพื่อเพิ่มความเร็วพวกเขาก็รวบรวม PHP เป็นรหัส C ++ หากเป็นกรณีนี้ทำไมพวกเขาไม่ทำ:

  1. เพียงแค่เขียนโปรแกรมใน c ++? แน่นอนว่าจะต้องมีข้อผิดพลาด / ข้อบกพร่องบางอย่างเมื่อกดปุ่มวิเศษแปลภาษาที่พอร์ต PHP ไปยังรหัส c ++ ใช่ไหม?

  2. ถ้าตัวแปลงที่น่าประทับใจนี้ใช้งานได้ดีทำไมถึงติดกับ PHP เลย? ทำไมไม่ใช้อะไรอย่าง Ruby หรือ Python ล่ะ? หมายเหตุ - ฉันเลือกทั้งสองอย่างนี้แบบสุ่ม แต่ส่วนใหญ่เป็นเพราะเกือบทุกคนบอกว่าการเข้ารหัสในภาษาเหล่านั้นเป็น "ความสุข" ดังนั้นทำไมไม่พัฒนาเป็นภาษาที่ยอดเยี่ยมแล้วกดปุ่มวิเศษ c ++ รวบรวม?


12
ทั้งทางเลือกของคุณอาจหมายถึงการทิ้งรหัส PHP, เครื่องมือและความเชี่ยวชาญเฉพาะของ PHP, ครึ่งหนึ่งของโครงสร้างพื้นฐานที่สนับสนุน ฯลฯ ที่มีอยู่แล้วและเริ่มจากศูนย์

ทำไม? หากคุณสามารถแปลงรหัสเป็น C ++ ได้แน่นอนทุกคนสามารถใช้ภาษาที่พวกเขาชื่นชอบกดปุ่มแปลงและให้มันมุ่งมั่นกับ C ++ Codebase ไม่มี?
user72245

7
ไม่คอมไพเลอร์โดยมากสร้างรหัสที่ทำงาน แต่น่าเกลียดและผิดธรรมชาติและตัดสิ่งต่าง ๆ เช่นชื่อตัวแปรความคิดเห็นไม่ต้องพูดถึง abstractions ทุกชนิด ในระดับมากสิ่งนี้หลีกเลี่ยงไม่ได้ ในขณะที่มีบางโครงการที่มีเป้าหมายที่จะแปลเป็นจริง codebase ที่สามารถบำรุงรักษาได้ในภาษาอื่นปัญหาก็ยากขึ้นโดยเฉพาะอย่างยิ่งกับภาษาที่แตกต่างกันอย่างกว้างขวาง นอกจากนี้แม้สมมติว่าสำนวน C ++ สมบูรณ์แบบออกมาทุกคนที่ทำงานใน codebase จะต้องเรียนรู้ C ++ หรือถูกไล่ออกและถูกแทนที่ด้วยผู้ที่รู้จัก C ++ และจากนั้นคุณยังไม่ได้ระบุถึงการใช้เครื่องมือ

1
นอกจากนี้ (ฉันเพิ่งค้นพบสิ่งนี้ด้วยตัวเอง แต่มันสอดคล้องกับความรู้สึกของฉันและประสบการณ์ของฉันกับการใช้ภาษาแบบไดนามิกอื่น ๆ ) โปรดทราบว่าคอมไพเลอร์ PHP-to-C ++ จะถูกเลิกใช้และแทนที่ด้วยล่าม bytecode + JIT เรียก HHVM ( พัฒนาในภายหลังโดยเป็นส่วนหนึ่งของโครงการร่มเดียวกัน) ซึ่งมีประสิทธิภาพเหนือกว่าและมีข้อ จำกัด น้อยกว่า ดูgithub.com/facebook/hiphop-php/wiki

@Delnan: คอมไพเลอร์ที่ไม่ดีสร้างโค้ดที่น่าเกลียดและผิดธรรมชาติ แต่มันก็หลีกเลี่ยงไม่ได้ ดูสมาร์ทที่คอมไพล์ลงใน JavaScript เอาท์พุทสามารถอ่านได้มากเว้นแต่คุณจะเปิด obfuscation และ / หรือการลดขนาดของหลักสูตร <snark>(Insofar เป็น JS สามารถเรียกได้ว่า "readable" นั่นคือ)</snark>
Mason Wheeler

คำตอบ:


65

พวกเขาทำไม่ได้ ไม่อย่างน้อยอีกต่อไป กลายเป็นว่าวิธีการดังกล่าวก่อให้เกิดปัญหามากเกินไปรวมถึงการปวดหัวในการปรับใช้และทำให้ข้อได้เปรียบที่สำคัญข้อหนึ่งของการใช้ภาษาสคริปต์ในตอนแรกคือสามารถเปลี่ยนสคริปต์ได้โดยไม่จำเป็นต้องคอมไพล์ใหม่ สถาปัตยกรรม VM ที่มีเฟส JIT แบบโปร่งใสและเลิกคอมไพเลอร์ C ++

น่าสนใจพอเห็นได้ชัดว่าทำแบบนี้ก็เร็วประมาณสองเท่า (เหมือนในนักแสดง) เช่นเดียวกับวิธีการรวบรวมทรานแซกชัน C ++


4
ทั้งหมดที่ฉันได้รับคือ Facebook มีช่วงเวลาที่ยากลำบากในการปรับสมดุลความต้องการทางธุรกิจกับความสามารถของนักพัฒนาซอฟต์แวร์ สิ่งที่น่าสนใจเหมือนกันถึงแม้ว่าฉันจะเพิ่มว่าการได้รับประสิทธิภาพที่ดีขึ้นจากโซลูชัน JIT กับโซลูชันดั้งเดิมนั้นหมายถึง PHP-> C ++ jiggerypokery ของพวกเขาในความเป็นจริง
James

7
@ James ในขณะที่ฉันสงสัยว่า "HipHopc" เป็นตัวเพิ่มประสิทธิภาพสูงสุดที่เคยมีมา, ผลลัพธ์เฉพาะนั้นไม่ได้แสดงว่าพวกเขาดูดการเขียนคอมไพเลอร์, มันแสดงให้เห็นว่าการรวบรวมภาษาไดนามิกมีประสิทธิภาพน้อยกว่าการรวบรวมแบบไดนามิก ซึ่งพบว่าเป็นจริงซ้ำแล้วซ้ำอีกโดยคนที่รู้วิธีการเขียนเพิ่มประสิทธิภาพการรวบรวม คอมไพเลอร์ JIT สามารถดำเนินการเพิ่มประสิทธิภาพได้อย่างง่ายดาย คอมไพเลอร์ AOT (ไม่มีการวิเคราะห์ทั้งโปรแกรมที่มีราคาแพงมาก) แทบจะไม่สามารถทำอะไรได้มากไปกว่าลบค่าใช้จ่ายในการตีความเอง

2
@delnan ดีใช่ถ้าคุณทำลายประโยชน์ที่สำคัญของคอมไพเลอร์ AOT (การวิเคราะห์โปรแกรมทั้งหมด) โดยชี้ให้เห็นจุดทั้งหมดของคอมไพเลอร์ AOT (มีเวลามากในการทำการวิเคราะห์) แน่นอนว่ามันจะไม่เปรียบเทียบ ถึง JIT ที่ทำในสิ่งที่ JIT ทำได้ดี (การปรับปรุง peekhole อย่างรวดเร็ว) แต่มันไม่ค่อยยุติธรรมตอนนี้ใช่ไหม
อลิซ

2
@delnan สิ่งนี้ไม่จริงหรืออย่างน้อยก็ไม่สุจริตทางสติปัญญา JIT มีเวลา จำกัด อย่างมากเมื่อเทียบกับ AOT เพื่อทำการปรับให้เหมาะสม Java เขียนบทความลงในตัวจัดสรรการลงทะเบียนที่น้อยกว่าอุดมคติ แต่เร็วพอสำหรับการใช้ JIT การใช้ SSA ช่วยให้สามารถเพิ่มประสิทธิภาพได้อย่างมหาศาลโดยไม่เสียค่าใช้จ่ายซึ่ง JIT ส่วนใหญ่ต้องดิ้นรนเพื่อให้ทัน AOT สามารถใช้อัลกอริธึมอนุมานประเภทที่พิสูจน์แล้ว (Hindley – Milner และอัลกอริธึม W) ซึ่งไม่ซับซ้อนในขณะที่ JIT ไม่ได้รับสิ่งนั้นฟรีโดยจ่ายค่าใช้จ่ายในแง่ของหน่วยความจำ JIT สามารถเพิ่มประสิทธิภาพได้ดีขึ้นและ AOT ก็สามารถทำได้เช่นกัน
อลิซ

1
@Alice เรากำลังพูดถึงภาษาที่มีพลวัตสูง ไม่มีอัลกอริทึมการอนุมานชนิด AOT (เช่นแบบคงที่) ที่ง่ายและมีประสิทธิภาพสำหรับภาษาเช่น Python หรือ JavaScript มีอัลกอริทึมแบบออนไลน์ / รันไทม์ที่ซับซ้อน (ตามที่ใช้ใน SpiderMonkey เป็นต้น) ที่มีประสิทธิภาพและมีอัลกอริทึม AOT ที่ซับซ้อน (เช่น Starkiller) ซึ่งล้มเหลวในการพิสูจน์ตนเองว่ามีประสิทธิภาพ อัลกอริทึม W ไม่ได้เริ่มต้นที่จะจัดการกับความซับซ้อนของภาษาแบบไดนามิก

34

Haiping Zhao วิศวกรอาวุโสของ Facebook อาจตอบคำถามของคุณได้ดีที่สุด

  1. HipHop โปรแกรมแปลงซอร์สโค้ด PHP ของคุณเป็น C ++ ที่ได้รับการปรับแต่งแล้วใช้ g ++ เพื่อคอมไพล์มัน HipHop เรียกใช้งานซอร์สโค้ดในลักษณะที่มีความหมายเท่าเทียมกันและเสียสละคุณลักษณะบางอย่างที่ไม่ค่อยได้ใช้เช่น eval () เพื่อแลกกับประสิทธิภาพที่เพิ่มขึ้น

  2. วิธีหนึ่งที่ใช้กันทั่วไปในการจัดการกับความไร้ประสิทธิภาพเหล่านี้คือการเขียนส่วนที่ซับซ้อนมากขึ้นของแอปพลิเคชั่น PHP ของคุณโดยตรงใน C ++ เป็น PHP Extensions ส่วนใหญ่จะแปลง PHP เป็นภาษากาวระหว่าง HTML ส่วนหน้าและตรรกะของแอปพลิเคชันใน C ++ จากมุมมองทางเทคนิคสิ่งนี้ใช้ได้ดี แต่ลดจำนวนวิศวกรที่สามารถทำงานกับแอปพลิเคชันทั้งหมดของคุณได้อย่างมาก

ส่วนที่เหลือของการโพสต์บล็อกคือการอ่านที่ดีและฉันขอแนะนำ มันให้ข้อมูลเชิงลึกเกี่ยวกับความท้าทายในการเขียนโปรแกรมเกี่ยวกับ Facebook และวิธีที่พวกเขาพยายามแก้ไขปัญหาเหล่านั้น


7
โปรดทราบว่านี่เป็นสิ่งล้าสมัย นั่นเป็นครั้งแรกที่พวกเขาลอง แต่ Facebook ไม่ได้ทำเช่นนี้อีกต่อไป ดูคำตอบของฉันด้านล่าง
Mason Wheeler

@MasonWheeler - ลิงก์ที่ยอดเยี่ยมและอัปเดต

19

เพียงแค่เขียนโปรแกรมใน c ++? แน่นอนว่าจะต้องมีข้อผิดพลาด / ข้อบกพร่องบางอย่างเมื่อกดปุ่มวิเศษแปลภาษาที่พอร์ต PHP ไปยังรหัส c ++ ใช่ไหม?

ถูกต้อง แต่การเขียนโปรแกรมใน C ++ จะนำมาซึ่งการแทนที่ codebase ที่มีอยู่ทั้งหมดซึ่งเป็นแนวคิดที่มีชื่อเสียงระดับโลกสำหรับการโง่และทำลายล้างอย่างสิ้นเชิง

ถ้าตัวแปลงที่น่าประทับใจนี้ใช้งานได้ดีทำไมถึงติดกับ PHP เลย? ทำไมไม่ใช้อะไรอย่าง Ruby หรือ Python ล่ะ? หมายเหตุ - ฉันเลือกทั้งสองอย่างนี้แบบสุ่ม แต่ส่วนใหญ่เป็นเพราะเกือบทุกคนบอกว่าการเข้ารหัสในภาษาเหล่านั้นเป็น "ความสุข" ดังนั้นทำไมไม่พัฒนาเป็นภาษาที่ยอดเยี่ยมแล้วกดปุ่มวิเศษ c ++ รวบรวม?

เพราะนั่นจะทำให้ตกอยู่ในการแทนที่ codebase PHP ที่มีอยู่เดิม

ในโลกอุดมคติพวกเขาเพียงแค่เขียนโค้ดใน C ++ ตั้งแต่เริ่มต้น น่าเสียดายเนื่องจากมีโค้ดที่มีอยู่ใน PHP จึงไม่สามารถทำได้ ดังนั้นพวกเขาแฮ็คปัญหา มันถูกกว่ามาก


2
+1 สำหรับสิ่งนี้: "แทนที่จะเป็นเช่นนั้นพวกเขาแฮ็คปัญหาแล้วมันก็ถูกกว่ามาก" จริง - ถ้าพวกเขามีวิศวกร 3,500 คนทำงานเกี่ยวกับผลิตภัณฑ์ของพวกเขาวิธีที่ถูกกว่าเพื่อให้ทีมเล็ก ๆ จำนวน 5-50 คนเน้นการเขียนคอมไพเลอร์ PHP-> C ++ ที่ดีกว่าให้ทีมวิศวกรรมทั้งหมดเขียนรหัสใหม่อีก 6 ปี .
Suman

ขอโทษฉันสับสน ทำไมพวกเขาจะต้องเขียนมัน คุณเพิ่งบอกว่าตัวคุณเอง - HipHop แปลงรหัสทั้งหมดเป็น C ++ ดังนั้นเพียงแปลงแล้วติดใน C ++
user72245

16
@ user72245 เพียงเพราะมันแปลงเป็น C ++ ไม่ได้หมายความว่ามันจะแปลงเป็น C ++ ที่สามารถอ่านหรือบำรุงรักษาได้
Mr.Mindor

นี่คือเหตุผลที่they hack around the problem? การปรับโค้ดให้เหมาะสมโดยใช้ C ++ หรือแม้แต่การประกอบไม่ใช่เรื่องใหม่เลยทำตั้งแต่ก่อนที่จะมีพีซี
Steve

โปรดจำไว้ว่าโปรแกรมเมอร์ Facebook คือโปรแกรมเมอร์ PHP แน่นอนว่าคุณสามารถแปลงเป็น C ++ และเริ่มเขียนโปรแกรมใน C ++ แต่โปรแกรมเมอร์ปัจจุบันของคุณไม่มีประสบการณ์ในภาษานี้ คุณจะต้องฝึกใหม่หรือจ้างโปรแกรมเมอร์ใหม่เพื่อพัฒนาต่อไป
Gavin Coates

8

“ แน่นอนทำไมไม่ทำงานในแอสเซมบลีโดยตรงเนื่องจากรหัส C ++ ถูกแปลเป็นคำแนะนำของรหัสเครื่องในที่สุด?”

- ในสาระสำคัญของมันคือสิ่งที่อาร์กิวเมนต์ลดลง และหวังว่านี่จะทำให้เห็นได้ชัดว่าทำไมมันไม่ทำ:

  • จำเป็นต้องใช้ชุดทักษะที่แตกต่าง (มากมาย!) เพื่อโปรแกรมในแอสเซมบลี (C ++) กว่าใน C ++ (PHP)
  • อาจเป็นเรื่องยากที่จะเขียนโปรแกรมด้วยเหตุผลหลายประการ
  • รหัสที่ผลิตโดยแอสเซมเบลอร์ / คอมไพเลอร์อาจไม่สามารถอ่านได้โดยมนุษย์ (พูด: บำรุงรักษาได้) แม้ว่าคุณจะสามารถเขียนโปรแกรมที่อ่านได้ในแอสเซมบลี (C ++) ตั้งแต่เริ่มต้น

2
ฉันเคยดูแลใบสมัครประกันที่เขียนไว้ในชุดประกอบในปี 1970 ในเดือนตุลาคมฉันได้รับมอบหมายให้เปลี่ยนคำทักทายใน "จดหมาย" เป็นคำพูดที่เทียบเท่ากับ "สุขสันต์วันหยุด" จะแล้วเสร็จในเดือนกุมภาพันธ์ปีหน้าเนื่องจากความซับซ้อน ฉันมีความเชี่ยวชาญในการชุมนุมและสามารถเขียนรหัสที่ดีที่สุดได้หากไม่เกินสองสามพันบรรทัด อย่างไรก็ตามคอมไพเลอร์ COBOL และ C เตะตูดของฉันและสร้างรหัสที่เหมาะสมที่สุดสำหรับแพลตฟอร์มที่เราใช้งานโดยเฉพาะอย่างยิ่งสำหรับระบบที่มีความยาวเกิน 1 ม. มันไม่สมเหตุสมผลเลย
bloudraak

5

ฉันไม่ได้อยู่ที่ Facebook แต่การคาดเดาที่ดีที่สุดของฉันเกี่ยวกับแรงจูงใจคือ "เพื่อหลีกเลี่ยงความเสี่ยงที่สำคัญ" ณ จุดนี้การเปลี่ยนไปใช้ภาษาอื่นไม่ใช่การตัดสินใจทางเทคโนโลยีอีกต่อไปสิ่งสำคัญที่สุดคือการตัดสินใจทางธุรกิจ

เมื่อคุณเป็น บริษัท ขนาดใหญ่ที่เติบโตตามขนาดของ FB คุณค่อยๆดึงดูดผู้คนที่ได้รับความเชี่ยวชาญในแพลตฟอร์มการเขียนโปรแกรมของคุณ (ในกรณีของ FB นั่นคือ PHP) ทีละคนคุณจะได้พนักงานสองสามพันคนที่มีความเชี่ยวชาญที่ยอดเยี่ยมใน PHP เมื่อมาถึงจุดนี้การเปลี่ยนไปใช้ภาษาอื่นเป็นสิ่งที่อันตรายมาก: วิศวกรของคุณจะไม่สามารถเร่งความเร็วในระบบนิเวศใหม่และอาจต้องใช้เวลาอย่างมีนัยสำคัญในการบรรลุระดับความเชี่ยวชาญที่ต้องการโดยงานปัจจุบันของพวกเขา

การละทิ้งข้อดีของ PHP และภาษาทางเลือกด้วยจำนวนเงินที่ FB ทำกับเทคโนโลยี PHP มันจะหยิ่งเกินไปที่จะคิดว่าสวิตช์จะไม่เจ็บปวดและโง่เกินกว่าที่จะลองทำ ในทางธุรกิจเทคโนโลยีหมายถึงจุดจบดังนั้น "ความสุข" ของการเขียนโปรแกรมไม่แม้แต่จะเข้าสู่การสนทนา


4

ฉันสามารถนึกถึงเว็บไซต์หลักเพียงเว็บไซต์เดียวที่มีการใช้งานใน C ++ H2G2

ถึงแม้ว่าในปัจจุบันอิออนอิเล็คทรอนิคส์จะเป็นล่ามที่มีฟังก์ชั่นการจัดการข้อความและฐานข้อมูลจำนวนมากที่มีอยู่ในตัว

Facebook มีความสุขมากกับการทำงานของเว็บไซต์ พวกมันเติบโตจนถึงจุดที่วานิลลา PHP ไม่สามารถรองรับปริมาณที่พวกเขาดำเนินการ ดังนั้นการรวบรวมมี PHP เป็นรหัสเครื่อง C ++ จากนั้น อาจมีการเขียนคอมไพเลอร์เต็มรูปแบบสำหรับ PHP แต่พวกเขาจะพลาดในการเพิ่มประสิทธิภาพที่ลึกซึ้ง 20 ปีซึ่งได้เข้าไปใน gcc compiler stack จุดคือรหัส "C ++" ไม่ได้หมายถึงมนุษย์สามารถอ่านได้หรือบำรุงรักษาได้เพียงแค่ขั้นตอนกลางระหว่างทางไปยังรหัสเครื่อง

เช่นเดียวกับโปรแกรมเมอร์จำนวนมากในเว็บไซต์นี้ฉันรู้สึกว่าคุณประเมินมูลค่าของงานที่ลงทุนในตรรกะทางธุรกิจและฟังก์ชั่นการทำงานที่ฝังอยู่ในแอปพลิเคชันที่มีอยู่และรหัสราคาเพื่อประโยชน์ของตัวเอง


ฉันสามารถคิดหลายสิบตอนนี้ WT ประสบความสำเร็จ
อลิซ

@Alice - น่าสนใจ! แต่ฉันไม่พบใครใช้สิ่งนี้สำหรับไซต์ที่มีปริมาณมาก นอกจากนี้สวัสดีโลก 30 บรรทัดของโค้ดที่ต้องทำโค้ด PHP 5 บรรทัด
James Anderson

การเปรียบเทียบตัวอย่าง "สวัสดีโลก" นั้นไร้สาระ ในน้อยกว่า 100 บรรทัดฉันสามารถตั้งค่าการเปิดใช้งาน websockets โพลแบบย้อนกลับยาววิดเจ็ตที่ได้รับการปรับปรุงอย่างต่อเนื่องพร้อม SEO ที่ดีที่สุด URL ที่สะอาดอัตโนมัติโดยไม่โหลดหน้าเต็มโดยใช้ AJAX และ CPU / RAM ขนาดเล็ก PHP อย่างน้อยในการกำหนดค่าทั่วไปไม่สามารถทำเว็บซ็อกเก็ตโพลแบบยาวทำความสะอาด URL โดยไม่ต้องใช้ความช่วยเหลือล้าง URL ด้วย AJAX เลยและจะใช้ RAM / CPU จำนวนมหาศาล (อย่างแน่นอน) สำหรับ webapps ไม่ใช่ตัวอย่างง่ายๆ WT และ C ++ นั้นเหนือกว่าอย่างมากและด้วย C ++ 11 เทียบเคียงได้
อลิซ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.