Facebook neden PHP kodunu C ++ 'a dönüştürüyor? [kapalı]


42

Facebook'un PHP ile başladığını okudum ve daha sonra hız kazanmak için şimdi PHP'yi C ++ kodu olarak derledik. Bu durumda neden olmasın:

  1. Sadece c ++ 'da programla. Elbette, PHP'yi c ++ koduna bağlayan sihirli bir derleyici düğmesine basarken bazı hatalar / hatalar olmalı, değil mi?

  2. Bu etkileyici dönüştürücü çok iyi çalışıyorsa, neden PHP'ye sadık kalmalı? Neden Ruby veya Python gibi bir şey kullanmıyorsunuz? Not - Bu ikisini rastgele seçtim, fakat çoğunlukla herkes bu dillerde kod yazmanın bir "sevinç" olduğunu söylüyor. Öyleyse neden süper bir dilde gelişmiyor ve sonra büyülü c ++ derleme düğmesine basmıyorsunuz?


12
Her iki alternatifiniz de muhtemelen orada olan tüm PHP kodunu, PHP'ye özgü araçları ve uzmanlığı, destek altyapısının yarısını, vb. Atmak ve sıfırdan başlamak anlamına gelir.

Neden? Kodu C ++ 'ya dönüştürebiliyorsanız, elbette herkes en sevdiği dili kullanabilir, convert düğmesine basıp C ++ Codebase'i kabul ettirin. Hayır?
user72245,

7
Hayır. Derleyiciler, genel olarak, çalışan ancak çirkin ve doğal olmayan kodlar üretir ve her türlü soyutlamadan bahsetmek yerine değişken isimleri, yorumlar gibi şeyleri soyarlar. Büyük ölçüde, bu kaçınılmazdır. Başka bir dilde sürdürülebilen bir kod tabanına gerçekten dönüştürmeyi amaçlayan bazı projeler olsa da, sorun özellikle çok farklı dillerde olmaktan çok daha zor. Ayrıca, tamamen idiomatik C ++ çıktığını varsayarsak bile, kod temeli üzerinde çalışan herkes C ++ 'ı öğrenmek ya da kovulmak ve yerine C ++' ı bilen insanlarla değiştirmek zorunda kalacaktı. Ve sonra hala takımları ele almadın.

1
Ayrıca (Bunu kendim daha yeni öğrendim, ancak içgüdüsel hislerime ve diğer dinamik dil uygulamalarıyla olan deneyimim doğrultusunda), PHP-C ++ derleyicisinin aşamalı olduğunu ve HHVM adlı bir bytecode yorumlayıcısı + JIT ile değiştirildiğini unutmayın. daha sonra aynı şemsiye projenin bir parçası olarak geliştirildi). Bakınız github.com/facebook/hiphop-php/wiki

@Delnan: Kötü derleyiciler çirkin ve doğal olmayan kod üretir. Fakat bu kaçınılmazdır. Göz at Smart JavaScript aşağı derler. Elbette şaşırtmayı ve / veya küçültmeyi açmazsanız, çıktı çok okunur. <snark>(JS olarak asla "okunabilir" olarak adlandırılabilir.)</snark>
Mason Wheeler

Yanıtlar:


65

Yapmazlar. En azından artık değil. Bu şekilde yapmanın, dağıtım baş ağrıları ve bir kodlama dilini ilk elden kullanmanın en önemli avantajlarından birini geçersiz kılmak gibi birçok soruna yol açtığı, - yeniden derlemeye gerek kalmadan senaryoları değiştirebilme gibi - böylece HipHop sistemini yenilediler. şeffaf bir JIT aşamasına sahip bir VM mimarisi ve C ++ derleyicisini kullanımdan kaldırdı.

İlginçtir ki, görünüşte bu şekilde yapmak orijinal C ++ trans-derleme yaklaşımının iki katı kadar hızlıdır (performansta olduğu gibi).


4
Bundan anladığım kadarıyla, Facebook işletme gereksinimlerini geliştirici yetenekleriyle dengelemek konusunda zorlanıyor. Yine de ilginç olanı, bir JIT çözümünden yerel bir çözümden daha iyi bir performans elde etmenin, PHP-> C ++ jiggerypokery'in aslında pantolon olduğu anlamına geliyor.
James

7
@James "HipHopc" ın şimdiye kadarki en iyi optimize eden derleyici olduğundan şüpheliyken, bu sonuç derleyicileri yazarken emdiklerini göstermiyor, dinamik dillerin statik derlemesinin dinamik derlemeden çok daha az etkili olduğunu gösteriyor. Bu, defalarca doğru olduğu, kesinlikle nasıl optimize edici derleyiciler yazacağımı bilen insanlar tarafından bulundu. Bir JIT derleyicisi kolayca birçok optimizasyon gerçekleştirebilir. Bir AOT derleyicisi (çok pahalı bir bütün program analizi olmadan), gerçekte dinamikliği kaldırmadan, yorumlamanın ek yükünü kaldırmaktan nadiren daha fazlasını yapabilir.

2
@delnan Pekala, evet, bir AOT derleyicisinin (tüm program analizi) ana faydasını (AOT derleyicisinin tüm noktasını işaret ederek (analiz yapmak için çok zamana sahip) kısaltırsanız, o zaman kesin olarak karşılaştırmaz. JIT’de iyi olanı yapmak için bir JIT’e (hızlı gözetleme optimizasyonları). Ama bu adil değil, şimdi öyle mi?
Alice

2
@delnan Bu doğru değil ya da en azından entelektüel olarak sahtekâr. Bir JIT, optimizasyon yapmak için AOT ile karşılaştırıldığında oldukça sınırlı bir süreye sahip; Java, idealden daha düşük fakat JIT kullanımı için yeterince hızlı olan kayıt tahsisatçılarına yazılar yazdı. SSA'nın kullanılması , çoğu JIT’in yakalayabileceği mücadelenin ücretsiz olarak muazzam miktarda optimizasyon yapmasını sağlar . AOT'ler, karmaşık olmayan kanıtlanmış tip çıkarım algoritmalarını (Hindley-Milner ve algoritma W) kullanabilirken, bir JIT bunu kesinlikle ücretsiz olarak, bellek açısından masraf ödeyememektedir. Bir JIT bazı optimizasyonları daha iyi yapabilir ve bir AOT yapabilir.
Alice

1
@Alice Çok dinamik dillerden bahsediyoruz. Python veya JavaScript gibi diller için basit ve etkili AOT (yani statik) tipi çıkarım algoritmaları yoktur. Etkili karmaşık çevrimiçi / çalışma zamanı algoritmaları (örneğin SpiderMonkey'de kullanıldığı gibi) ve şimdiye kadar kendilerini etkili olamayan karmaşık AOT algoritmaları (örn. Starkiller) vardır. Algoritma W, dinamik dillerin karmaşıklığını ele almaya bile başlamaz.

34

Facebook'un Kıdemli Mühendisi Haiping Zhao muhtemelen sorularınızı en iyi şekilde cevaplıyor .

  1. HipHop programlı olarak PHP kaynak kodunuzu en iyi duruma getirilmiş C ++ 'ya dönüştürür ve sonra onu derlemek için g ++' ı kullanır. HipHop, kaynak kodunu anlamsal olarak eşdeğer bir şekilde yürütür ve gelişmiş performans karşılığında nadiren kullanılan bazı özelliklerden (eval () gibi) fedakarlık eder.

  2. Bu verimsizlikleri ele almanın yaygın bir yolu, PHP uygulamanızın daha karmaşık kısımlarını doğrudan C ++ dilinde PHP Uzantıları olarak yeniden yazmaktır. Bu, büyük ölçüde PHP'yi C + 'daki ön uç HTML'niz ve uygulama mantığınız arasında bir yapıştırıcı dile dönüştürür. Teknik açıdan bakıldığında bu iyi çalışır, ancak uygulamanızın tamamında çalışabilecek mühendis sayısını azaltır.

Blog gönderisinin geri kalanı iyi bir okuma ve ben bunu tavsiye ederim. Facebook'un uğraştığı programlama zorlukları ve bu sorunları nasıl ele almaya çalıştıkları hakkında bazı bilgiler veriyor.


7
Bunun eski olduğunu unutmayın; ilk denemeleriydi, ancak Facebook artık bu şekilde yapmıyor. Cevabımı aşağıya bakın.
Mason Wheeler

@MasonWheeler - harika bağlantı ve güncelleme.

19

Sadece c ++ 'da programla. Elbette, PHP'yi c ++ koduna bağlayan sihirli bir derleyici düğmesine basarken bazı hatalar / hatalar olmalı, değil mi?

Doğru, fakat C ++ 'da programlama, tümüyle kod tabanlarının değiştirilmesini gerektirecek - tamamen aptal ve yıkıcı olduğu için dünyaca tanınan bir fikir.

Bu etkileyici dönüştürücü çok iyi çalışıyorsa, neden PHP'ye sadık kalmalı? Neden Ruby veya Python gibi bir şey kullanmıyorsunuz? Not - Bu ikisini rastgele seçtim, ancak çoğunlukla herkesin bu dillerde kod yazmanın bir "sevinç" olduğunu söylediği için. Öyleyse neden süper bir dilde gelişmiyor ve sonra büyülü c ++ derleme düğmesine basmıyorsunuz?

Çünkü bu, yine de, mevcut PHP kod tabanlarının değiştirilmesini gerektirir.

İdeal bir dünyada, C ++ 'ı sıfırdan kodlarlardı. Ne yazık ki, PHP’de mevcut kod bir sürü olduğundan, bu mümkün değil. Yani bunun yerine, sorunu çözüyorlar. Sadece çok daha ucuz.


2
Bunun için +1: "Yani, bunun yerine, sorunu çözüyorlar. Çok daha ucuz." Doğru - eğer 3500 çalışanı ürün üzerinde çalışıyorsa, 5-50 kişilik küçük bir ekibin elde edilmesinin daha ucuz olması, tüm mühendislik ekibinin 6 yıllık kod yazmasını sağlamaktan daha iyi bir PHP-> C ++ derleyicisi yazmaya odaklandı. .
Suman

Üzgünüm kafam karıştı. Neden yeniden yazmak zorunda kalacaklar ? Sadece kendin söyledin - HipHop tüm kodu C ++ 'a çeviriyor. Öyleyse sadece dönüştür, sonra C ++ 'a yapıştır.
user72245

16
@ user72245 sadece C ++ 'a dönüştürdüğü için okunabilir veya bakım yapılabilir C ++' ya dönüştürüldüğü anlamına gelmez
Mr.Mindor

Bunun sebebi nedir they hack around the problem? C ++ veya montaj bile kullanarak kodu optimize etmek hiç yeni değil, daha önce bir PC olduğundan beri bunu yapmaktaydı.
Steve

Ayrıca Facebook programcılarının PHP programcıları olduğunu unutmayın. Her şeyi C ++ 'a dönüştürebildiğinizden ve C ++' da programlamaya başladığınızdan emin olun, ancak mevcut programcılarınızın bu dilde hiçbir tecrübesi yok. Gelişime devam etmek için onları yeniden eğitmeniz veya yeni programcılar kiralamanız gerekir.
Gavin Coates,

8

“Aslında, neden doğrudan montajda çalışmıyor, çünkü C ++ kodu nihayetinde makine kodu talimatlarına çevrilmiş?”

- Özünde, bu argümanın indirgendiği şey. Ve umarım bu neden yapılmadığını açıkça ortaya koyar:

  • Montajda (C ++) C ++ (PHP) programında programlamak için (büyük ölçüde!) Farklı bir beceri seti gerekir.
  • Potansiyel olarak çeşitli nedenlerden dolayı programlanması çok daha zordur
  • Bir montajcı / derleyici tarafından üretilen kod , sıfırdan montajda (C ++) okunabilir programlar yazabilseniz bile insan tarafından okunamayabilir (konuşabilir: bakım yapılabilir ).

2
Bir zamanlar 1970'lerde tasarlanan mecliste yazılmış bir sigorta uygulamasını sürdürdüm. Ekim ayında, "Mutlu Tatiller" in eşdeğerini söylemek için bir "mektup" üzerindeki selamlamaları değiştirmekle görevlendirildim. Karmaşıklık nedeniyle sadece gelecek yıl Şubat ayında tamamlandı. Birkaç bin satırdan fazla olmamak kaydıyla montaj konusunda çok uzmanlaştım ve en uygun kodu yazabildim. Ancak, COBOL ve C derleyicileri kıçımı tekmeledi ve üzerinde çalıştığımız platform için, özellikle 1m montaj hattını aşan sistemler için daha uygun bir kod üretti. Hiçbir anlamı yoktur.
bloudraak

5

Facebook'ta değilim, ancak nedenlerle ilgili en iyi tahminim "önemli risklerden kaçınmak" olur. Bu noktada, farklı bir dile geçmek artık bir teknoloji kararı değil: her şeyden önce bir iş kararı.

Organik olarak FB büyüklüğüne büyüyen büyük bir şirket olduğunuzda, programlama platformunuzda uzmanlık kazanmış insanları yavaşça çekersiniz (FB'nin durumunda, bu PHP). Tek tek, PHP'de büyük bir uzmanlığa sahip birkaç bin çalışanı olsun. Bu noktada, başka bir dile geçmek çok tehlikeli bir hal alıyor: mühendisleriniz yeni ekosisteme hız vermeyecek ve yeteneklerini geliştirmek için tek başına mevcut işlerinin talep ettiği uzmanlık seviyesine ulaşmak için önemli bir zamana ihtiyaç duyabilir.

PHP'nin ve alternatif dillerin göreceli değerlerini bir kenara bırakmak, FB'nin PHP teknolojisine yaptığı yatırım miktarıyla, bir anahtarın ağrısız olacağını düşünmek için çok kibirli ve denemek için çok aptalca olurdu. İş dünyasında teknoloji sona ermek anlamına geliyor, bu nedenle programlamanın "sevinci" tartışmalara bile girmiyor.


4

C ++ 'da uygulanmış tek bir web sitesini düşünebilirim. h2g2

O zaman bile, mevcut uygulama iyonu aslında çok sayıda metin ve veritabanı manipülasyon işlevinin yerleşik olduğu bir tercümandır (kulağa biraz benzemeyen ve PHP :-) gibi gelmez).

Facebook, web sitelerinin işlevselliğinden oldukça memnun. Vanilya PHP'nin işledikleri hacimleri destekleyemediği bir noktaya gelmeye başladılar. Bu yüzden orada PHP C ++ thent makine koduna derlenmesi. PHP için tam bir derleyici yazmış olabilirdi, ancak gcc derleyici yığına giren 20 yıllık ince optimizasyonu kaçırmış olacaklardı. Mesele şu ki, "C ++" kodu, insan tarafından okunabilir veya bakım yapılabilir olması anlamına gelmez, sadece makine koduna giderken ara bir adımdır.

Bu sitedeki pek çok programcı gibi, hte iş mantığına ve mevcut uygulamalara gömülü işlevselliğe yatırılan iş miktarını ve kendi yararına değer kodunu küçümsemediğinizi düşünüyorum.


WT'nin başarılı olduğunu onlarca düşünebilirim.
Alice

@Alice - ilginç! Ancak bunu yüksek hacimli bir site için kullanan kimseyi bulamıyorum. Artı merhaba dünya 30 bir şey kod satırı PHP kod 5 satır yapmak.
James Anderson

"Merhaba dünya" örneğini karşılaştırmak çok saçma. 100'den daha az satırda, etkin, uzun anket geri dönüşü, optimum SEO özellikli aşamalı olarak geliştirilmiş bir widget, AJAX kullanarak tam sayfa yüklemesi olmadan otomatik temiz URL'ler ve küçük bir CPU / RAM ayak izi ayarlayabilirim. PHP, en azından tipik yapılandırmalarda web bağlantılarını, uzun anketleri, yardımsız URL'leri temizleyemez, URL'leri AJAX ile temizleyemez ve kesinlikle muazzam (nispeten) RAM / CPU kullanacaktır. Webapps ve basit olmayan örnekler için, WT ve C ++ oldukça üstün ve karşılaştırılabilir uzunluktaki C ++ 11 ile.
Alice
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.