Mengapa Facebook mengonversi kode PHP ke C ++? [Tutup]


42

Saya membaca bahwa Facebook dimulai dalam PHP, dan kemudian untuk mendapatkan kecepatan, mereka sekarang mengkompilasi PHP sebagai kode C ++. Jika itu masalahnya mengapa mereka tidak:

  1. Hanya memprogram di c ++? Tentunya harus ada BEBERAPA kesalahan / bug ketika menekan tombol kompiler ajaib yang port PHP ke kode c ++, kan?

  2. Jika konverter yang mengesankan ini bekerja dengan sangat baik, mengapa tetap menggunakan PHP? Mengapa tidak menggunakan sesuatu seperti Ruby atau Python? Catatan - Saya memilih keduanya secara acak, tetapi kebanyakan karena hampir semua orang mengatakan pengkodean dalam bahasa-bahasa itu adalah "sukacita". Jadi mengapa tidak mengembangkan bahasa super hebat lalu menekan tombol kompilasi c ++ magic?


12
Kedua alternatif Anda kemungkinan besar berarti membuang semua kode PHP, alat dan keahlian khusus PHP, setengah dari infrastruktur pendukung, dll. Yang sudah ada di sana dan mulai dari awal.

Mengapa? Jika Anda dapat mengonversi kode ke C ++, pasti siapa pun dapat menggunakan bahasa favorit mereka, tekan tombol convert, dan minta kode tersebut dikomit ke C ++ Codebase. Tidak?
user72245

7
Kompiler, pada umumnya, menghasilkan kode yang berfungsi tetapi jelek dan tidak alami, dan menghapus hal-hal seperti nama variabel, komentar, belum lagi semua jenis abstraksi. Untuk sebagian besar, ini tidak bisa dihindari. Meskipun ada beberapa proyek yang bertujuan untuk benar-benar menerjemahkan ke dalam basis kode yang dapat dipelihara dalam bahasa lain, masalahnya jauh lebih sulit, terutama dengan bahasa yang sangat berbeda. Juga, bahkan dengan asumsi C ++ sempurna keluar, semua orang yang bekerja pada basis kode harus belajar C ++ atau dipecat dan diganti dengan orang-orang yang tahu C ++. Dan kemudian Anda masih belum membahas tooling.

1
Juga (saya baru saja menemukan ini sendiri, tetapi ini sejalan dengan firasat saya dan pengalaman saya dengan implementasi bahasa dinamis lainnya), perhatikan bahwa kompiler PHP-ke-C ++ sedang dihapus dan diganti dengan penerjemah bytecode + JIT yang disebut HHVM ( dikembangkan kemudian sebagai bagian dari proyek payung yang sama) yang secara masif mengungguli dan memiliki batasan yang lebih sedikit. Lihat github.com/facebook/hiphop-php/wiki

@Delnan: Bad compiler menghasilkan kode jelek dan tidak wajar. Tapi itu hampir tidak bisa dihindari. Lihat Smart , yang mengkompilasi turun ke JavaScript. Outputnya sangat mudah dibaca, kecuali jika Anda mengaktifkan kebingungan dan / atau minifikasi tentu saja. <snark>(Sejauh JS dapat disebut "dapat dibaca", yaitu.)</snark>
Mason Wheeler

Jawaban:


65

Mereka tidak melakukannya. Setidaknya tidak lagi. Ternyata melakukannya dengan cara itu menyebabkan terlalu banyak masalah, termasuk penyebaran sakit kepala dan meniadakan salah satu keunggulan utama menggunakan bahasa scripting di tempat pertama - mampu mengubah skrip tanpa perlu mengkompilasi ulang - sehingga mereka mengubah sistem HipHop menjadi arsitektur VM dengan fase JIT transparan, dan menghentikan kompiler C ++.

Cukup menarik, ternyata melakukannya dengan cara ini juga sekitar dua kali lebih cepat (seperti pada performan) seperti pendekatan trans-kompilasi C ++ asli.


4
Yang saya dapatkan dari ini adalah bahwa Facebook mengalami kesulitan menyeimbangkan kebutuhan bisnis dengan kemampuan pengembang. Menarik semua sama, meskipun saya akan menambahkan bahwa mendapatkan kinerja yang lebih baik dari solusi JIT daripada yang asli hanya berarti PHP-> C ++ jiggerypokery mereka sebenarnya celana.
James

7
@James Walaupun saya ragu "HipHopc" adalah kompilator pengoptimal terbesar yang pernah ada, hasil tertentu tidak menunjukkan bahwa mereka payah dalam menulis kompiler, itu hanya menunjukkan bahwa kompilasi statis bahasa dinamis jauh lebih efektif daripada kompilasi dinamis. Yang ternyata benar berulang kali, oleh orang-orang yang pasti tahu cara menulis kompiler yang mengoptimalkan. Kompiler JIT dapat melakukan banyak optimasi dengan mudah. Kompiler AOT (tanpa analisis seluruh program yang sangat mahal) jarang dapat melakukan lebih dari sekadar menghilangkan overhead interpretasi itu sendiri, tanpa benar-benar menghilangkan dinamika.

2
@delnan Yah, ya, jika Anda melumpuhkan manfaat utama dari kompiler AOT (analisis seluruh program) dengan menunjukkan seluruh titik kompiler AOT (memiliki banyak waktu untuk melakukan analisis), maka tentu saja, itu tidak akan membandingkan untuk JIT melakukan apa yang JIT baik (optimasi lubang intip cepat). Tapi itu tidak adil, kan?
Alice

2
@delnan Ini tidak benar, atau setidaknya tidak jujur ​​secara intelektual. JIT memiliki waktu yang sangat terbatas dibandingkan dengan AOT untuk melakukan optimasi; Java menulis makalah tentang daftar alokasi yang kurang dari ideal, tetapi cukup cepat untuk penggunaan JIT. Menggunakan SSA memungkinkan untuk sejumlah besar optimasi secara gratis yang sebagian besar perjuangan JIT untuk mengikutinya. AOT dapat menggunakan algoritma inferensi tipe terbukti (Hindley-Milner dan algoritma W) yang tidak rumit, sementara JIT sama sekali tidak mendapatkan itu secara gratis, membayar biaya dalam hal memori. JIT dapat melakukan beberapa optimasi dengan lebih baik, demikian juga AOT.
Alice

1
@ Alice Kita berbicara tentang bahasa yang sangat dinamis. Tidak ada algoritma inferensi tipe AOT (yaitu statis) yang sederhana dan efektif untuk bahasa seperti Python atau JavaScript. Ada algoritma on-line / run-time yang rumit (seperti yang digunakan dalam SpiderMonkey misalnya) yang efektif, dan ada algoritma AOT yang rumit (misalnya Starkiller) yang sejauh ini gagal membuktikan diri mereka efektif. Algoritma W bahkan tidak mulai membahas kompleksitas bahasa dinamis.

34

Insinyur Senior Facebook Haiping Zhao mungkin menjawab pertanyaan Anda dengan sangat baik.

  1. HipHop secara program mengubah kode sumber PHP Anda menjadi C ++ yang sangat optimal dan kemudian menggunakan g ++ untuk mengompilasinya. HipHop mengeksekusi kode sumber dengan cara yang setara secara semantik dan mengorbankan beberapa fitur yang jarang digunakan - seperti eval () - sebagai imbalan untuk peningkatan kinerja.

  2. Salah satu cara umum untuk mengatasi inefisiensi ini adalah dengan menulis ulang bagian yang lebih kompleks dari aplikasi PHP Anda secara langsung dalam C ++ sebagai Ekstensi PHP. Ini sebagian besar mengubah PHP menjadi bahasa lem antara HTML ujung depan Anda dan logika aplikasi dalam C ++. Dari perspektif teknis, ini bekerja dengan baik, tetapi secara drastis mengurangi jumlah insinyur yang dapat bekerja pada seluruh aplikasi Anda.

Sisa posting blog adalah bacaan yang baik, dan saya merekomendasikannya. Ini memberi beberapa wawasan tentang tantangan pemrograman yang dihadapi Facebook, dan bagaimana mereka berusaha mengatasi masalah itu.


7
Perhatikan bahwa ini sudah usang; itu adalah percobaan pertama mereka, tetapi Facebook tidak lagi melakukannya dengan cara ini. Lihat jawaban saya, di bawah ini.
Mason Wheeler

@MasonWheeler - tautan dan pembaruan yang bagus.

19

Hanya memprogram di c ++? Tentunya harus ada BEBERAPA kesalahan / bug ketika menekan tombol kompiler ajaib yang port PHP ke kode c ++, kan?

Benar, tetapi pemrograman dalam C ++ akan memerlukan penggantian seluruh basis kode yang ada - sebuah ide terkenal di dunia karena benar-benar bodoh dan menghancurkan.

Jika konverter yang mengesankan ini bekerja dengan sangat baik, mengapa tetap menggunakan PHP? Mengapa tidak menggunakan sesuatu seperti Ruby atau Python? Catatan - Saya memilih keduanya secara acak, tetapi kebanyakan karena hampir semua orang mengatakan pengkodean dalam bahasa-bahasa itu adalah "sukacita". Jadi mengapa tidak mengembangkan bahasa super hebat lalu menekan tombol kompilasi c ++ magic?

Karena itu, sekali lagi, memerlukan penggantian basis kode PHP yang ada.

Di dunia yang ideal, mereka hanya kode dalam C ++ dari awal. Sayangnya, karena mereka memiliki kode shitload yang ada di PHP, itu tidak mungkin. Jadi sebagai gantinya, mereka meretas masalah. Jauh lebih murah.


2
+1 untuk ini: "Jadi, mereka meretas masalah. Jauh lebih murah." Memang benar - jika mereka memiliki 3500 insinyur yang mengerjakan produk mereka, itu cara yang lebih murah untuk mendapatkan tim kecil yang terdiri dari 5-50 orang yang berfokus pada penulisan kompiler PHP-> C ++ yang bagus, daripada meminta seluruh tim teknik menulis ulang kode senilai 6 tahun. .
Suman

Maaf saya bingung. Mengapa mereka harus menulis ulang . Anda baru saja mengatakannya sendiri - HipHop mengubah semua kode menjadi C ++. Jadi cukup konversikan, lalu tempelkan di C ++.
user72245

16
@ user72245 hanya karena mengubahnya menjadi C ++ tidak berarti itu mengubahnya menjadi C ++ yang dapat dibaca atau dikelola
Mr.Mindor

Kenapa ini they hack around the problem? Mengoptimalkan kode menggunakan C ++ atau bahkan perakitan bukanlah hal yang baru, sudah melakukannya sejak sebelum ada PC.
Steve

juga ingat bahwa pemrogram Facebook adalah pemrogram PHP. Tentu Anda bisa mengonversikannya ke C ++ dan mulai pemrograman dalam C ++, tetapi programmer Anda yang ada tidak memiliki pengalaman dalam bahasa ini. Anda perlu melatih ulang mereka, atau merekrut programmer baru untuk melanjutkan pengembangan.
Gavin Coates

8

"Memang, mengapa tidak bekerja secara langsung, karena kode C ++ akhirnya diterjemahkan ke dalam instruksi kode mesin?"

- Bahwa, pada intinya, adalah apa yang mengurangi argumen. Dan mudah-mudahan ini menjelaskan mengapa itu tidak dilakukan:

  • Seperangkat keterampilan (yang sangat berbeda) diperlukan untuk memprogram dalam perakitan (C ++) daripada dalam C ++ (PHP).
  • Ini berpotensi jauh lebih sulit untuk diprogram, karena berbagai alasan
  • Kode yang dihasilkan oleh assembler / compiler mungkin tidak dapat dibaca manusia (berbicara: dapat dipelihara), meskipun Anda dapat , dari awal, menulis program yang dapat dibaca dalam perakitan (C ++).

2
Saya pernah memelihara aplikasi asuransi yang ditulis dalam pertemuan yang disusun pada tahun 1970-an. Pada bulan Oktober, saya ditugaskan untuk mengubah salam pada "surat" untuk mengatakan setara dengan "Selamat Liburan". Itu hanya selesai pada bulan Februari tahun berikutnya karena kompleksitas. Saya menjadi sangat mahir dalam perakitan dan dapat menulis kode optimal, asalkan tidak lebih dari beberapa ribu baris. Namun, kompiler COBOL dan C menendang pantat saya dan menghasilkan kode yang jauh lebih optimal untuk platform yang kami jalankan, terutama untuk sistem yang melebihi 1m jalur perakitan. Itu tidak masuk akal bisnis.
bloudraak

5

Saya tidak di Facebook, tetapi tebakan terbaik saya pada motifnya adalah "untuk menghindari risiko yang signifikan". Pada titik ini, beralih ke bahasa lain bukan lagi keputusan teknologi: di atas segalanya, itu adalah keputusan bisnis.

Ketika Anda adalah perusahaan besar yang tumbuh secara organik dengan ukuran FB, Anda perlahan-lahan menarik orang yang kemudian mendapatkan keahlian dalam platform pemrograman Anda (dalam kasus FB, itu PHP). Satu per satu, Anda mendapatkan beberapa ribu karyawan dengan keahlian hebat di PHP. Pada titik ini, beralih ke bahasa lain menjadi sangat berbahaya: teknisi Anda tidak akan mampu mempercepat ekosistem baru, dan mungkin memerlukan waktu yang signifikan untuk mencapai tingkat keahlian yang diminta oleh pekerjaan mereka saat ini, apalagi meningkatkan keterampilan mereka.

Mengesampingkan manfaat relatif PHP dan bahasa alternatif, dengan jumlah investasi yang dilakukan FB ke dalam teknologi PHP, akan terlalu sombong untuk berpikir bahwa peralihan akan tidak menyakitkan, dan terlalu bodoh untuk mencobanya. Dalam bisnis, teknologi adalah alat untuk mencapai tujuan, sehingga "kegembiraan" pemrograman bahkan tidak memasuki diskusi.


4

Saya hanya bisa memikirkan satu situs web utama yang diimplementasikan dalam C ++. H2G2

Bahkan kemudian ion implementasi saat ini sebenarnya adalah juru bahasa dengan sejumlah besar fungsi manipulasi teks dan basis data (apakah itu tidak terdengar seperti dan PHP awal :-)).

Facebook cukup senang dengan fungsionalitas situs web mereka. Mereka baru saja tumbuh ke titik di mana vanilla PHP tidak dapat mendukung volume yang mereka proses. Oleh karena itu kompilasi ada PHP ke dalam kode mesin C ++ dari sana. Bisa saja menulis kompiler penuh untuk PHP, tetapi mereka akan melewatkan 20 tahun optimasi halus yang telah masuk ke tumpukan kompiler gcc. Intinya adalah kode "C ++" tidak dimaksudkan untuk dapat dibaca atau dipelihara manusia, hanya langkah menengah dalam perjalanan ke kode mesin.

Seperti banyak programmer di situs ini saya merasa Anda meremehkan jumlah pekerjaan yang diinvestasikan dalam logika bisnis hte dan fungsionalitas yang tertanam dalam aplikasi yang ada, dan, kode nilai untuk kepentingannya sendiri.


Saya bisa memikirkan lusinan, sekarang WT berhasil.
Alice

@ Alice - menarik! Tetapi saya tidak dapat menemukan orang yang menggunakan ini untuk situs volume tinggi. Plus hello world, 30 baris kode sesuatu untuk dilakukan 5 baris kode PHP.
James Anderson

Membandingkan contoh "hello world" agak konyol. Dalam kurang dari 100 baris, saya dapat mengatur soket web diaktifkan, jajak pendapat lama mundur, widget semakin ditingkatkan dengan SEO optimal, URL bersih otomatis tanpa memuat halaman penuh menggunakan AJAX, dan jejak CPU / RAM kecil. PHP, setidaknya dalam konfigurasi tipikal, tidak dapat melakukan soket web, polling panjang, URL bersih tanpa bantuan, membersihkan URL dengan AJAX sama sekali, dan pasti akan menggunakan jumlah RAM / CPU yang sangat besar (relatif). Untuk webapps dan bukan contoh sederhana, WT dan C ++ secara drastis unggul, dan dengan C ++ 11, panjangnya sebanding.
Alice
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.