Wolałbym nazwę HyperPHP albo cokolwiek

16
lut/10
9

Po buńczucznym i hip hip hurra wpisie o modelu implementacji serwisów internetowych, przyszedł czas na projekt Facebooka związany z PHP, czyli HipHop. Międzynarodowa społeczność żyje podekscytowana tym projektem już od ponad tygodnia, więc nie mogłem go sobie ot tak pominąć. Od nagłówków z nazwą HipHop, nazwą głupią nadmienię, RSS puchnął mi w zastraszającym tempie, a ja z tej listy wybiorę jeden post i szczególnie mu się przyjrzę. Chciałbym zająć się kwestiami poruszonymi w poście Terrego Chaya i rzucić okiem na tematy luźno związane z projektem.

Facebook to witryna, która działa od 2004 roku i aktualnie zajmuje drugie miejsce w rankingu Alexa. Terry Chay pisze o niebagatelnej ilości 350 bilionów miesięcznych wywołań, w faktach znajdziemy informacje o 350 milionach użytkowników, a w innych czeluściach internetu o 15 milionach zdjęć dodawanych dziennie. To sprawia, że Facebook staje się niezwykłym use-casem dla użycia technologii takich jak PHP. Szczególnie, że ostatecznie serwis wyszedł z impasu i rok temu przestał przynosić straty. Tak. Po 5 latach.

„Facebook: More Popular Than Porn”

- Bill Tancer  (TIME, 2007)

Poważne próby zdesperowanego szukania dodatkowych cykli procesora, zgodnie ze słowami Terrego, zaczęły się od pomysłów migracji bazy kodu czy też jego adopcji w przyszłości w innych językach programowania. Ciekawym pomysłem było skorzystanie z języków nisko-poziomowych, jednak te zostały odrzucone ze względu na efektywność pracy programistów, którzy tworzyliby te same rozwiązania kilka razy wolniej niż z wykorzystaniem PHP. Dwa razy próbowano przejść na Pythona, jednak niezależnie od wybranego języka baza istniejącego kodu jak i ilość pracowników do przeszkolenia okazała się zbyt duża. Osobiście nie wiem jakie zasoby programistów należałoby zaprzęgnąć do stworzenia nowej wersji Facebooka by doścignąć istniejącą bazę kodu i to biorąc cały czas pod uwagę stały jej przyrost. 1000 osób jest podobno zaangażowanych w tworzenie tego serwisu społecznościowego. Nie wiem ilu z nich jest programistami, ale nawet jeśli byłoby to 30% wszystkich pracowników, którzy pisali by 500 linijek kodu dziennie, ostatecznie kończylibyśmy ze 150000 nowymi linijkami pod koniec każdego dnia. Wybranie migracji mogło by tylko doprowadzić do powstania „martwego marszu” i utopić ogrom gotówki. Czy pojawiłby się zysk związany na przykład ze zdobytym doświadczeniem, czy stworzonymi na potrzeby przedsięwzięcia technologiami? Wątpię.

Na problemy z wydajnością często podawanym rozwiązaniem miało by być użycie wirtualnej maszyny języków Java czy .NET. Nie mam danych dot. implementacji PHP w Javie, czyli projektu Quercus, ale za przykład może nam posłużyć JRuby. Na tym porównaniu widzimy doskonale, że nawet jeśli weźmiemy algorytm napisany w Ruby i wrzucimy go do maszyny Java wynik może wprowadzić nas w zakłopotanie. Algorytmy uruchomione w ten sposób są oczywiście szybsze i to o 36%, ale kod natywny Javy będzie wciąż o połowę wydajniejszy od tego rezultatu. Trzeba też pamiętać, że zużycie pamięci wirtualnej maszyny Javy jest beznadziejnie wysokie, 8 razy wyższe od zużycia PHP 5.2 i 6 razy wyższe od C# pod Mono. Happy Endu nie będzie: JRuby zjada na śniadanko nawet 27 razy więcej pamięci niż Java podczas wykonywania testów z porównania.

Widać jak na dłoni, że musimy wrócić do tematu języków nisko-poziomowych. Osobiście nie uważam by warto było poświęcać efektywność pracy i angażować te prymitywne i potężne systemy do budowania witryn internetowych. Jednak z drugiej strony może okazać się, że popełniam błąd. Może, gdyby odpowiednio wcześnie powstały odpowiednie narzędzia, web-development wyglądał by zupełnie inaczej. Młode agencje interaktywne wypełnione byłyby starymi wyjadaczami, inżynierami oprogramowania rakiet kosmicznych i odrzutowców. Problemy wydajności serwisów internetowych ograniczałyby się już jedynie do dokupienia kolejnych serwerów, bo na jakie inne rozwiązania można by migrować? Na kod maszynowy?

HipHop poniekąd odpowiada na wszystkie problemy. Niestety nie jest rozwiązaniem idealnym, ale jest. Jest przetestowany i działa. Pozwala na pisanie aplikacji w PHP i uruchamianie ich z prędkością kodu maszynowego.

HipHop jest kompilatorem tłumaczącym kod PHP na zoptymalizowany kod C++. Proces pozwala na przekształcenie dynamicznie typowanych wyrażeń, po dogłębnej analizie, na kod statycznie typowany. To owocuje wzrostem wydajności, zależnym od ilości skomplikowanych struktur w tłumaczonym kodzie. Dodatkowym elementem, który przyrasta w momencie kompilacji, jest niezależny serwer webowy. Ostatecznie rozwiązanie pozwala pominąć tak Zend Engine, jak i serwery HTTP co także ma niemały wpływ na szybkość działania wynikowego programu. Ale jak już wcześniej mówiłem, nie jest tak pięknie. Translacja jest dość prymitywna i nie obejmuje sztuczek kryjących się za meta programowaniem, funkcjami anonimowymi czy eval. Rozwiązanie więc nie jest dla wszystkich.

Na koniec ogromna ciekawostka: większość programistów przychodzących i zatrudnianych w zespole Facebooka nie pracowała w PHP. Nie wiem na ile jest to proces zamierzony, ale musi wpływać pozytywnie na jakość kodu. Na pewno nie przeszkadza pracownikom znajomość kodów niskopoziomowych czy purystycznych struktur klas Javy. Za kolegą Wodzikiem powtórzę mały żarcik: „Największy atut w rozmowie o pracę? Nie znam PHP!”.

Otagowane jako: , , , ,
Komentarze (9) Odniesienia (0)
  1. adam
    00:26 on Luty 17th, 2010

    Swietnie sie czyta ten post, ale prosze daj jakis line-height dla tekstu bo mozna dostac oczoplasu :)

  2. Damian Tylczyński
    00:39 on Luty 17th, 2010

    Dziękuję za radę :)

  3. sf
    09:27 on Luty 17th, 2010

    Z tym eval to trochę przesada, taki argument na siłę bo nikt tak naprawdę tego nie używa. Już częściej są stosowane uruchomienia w stylu :
    $nazwaKlasy::metoda() ( PHP5.3)
    lub
    call_user_method(‚metoda’, $nazwaKlasy); ( PHP5.2)

  4. Damian Tylczyński
    11:28 on Luty 17th, 2010

    Niezbyt przesadzone bo eval jest w pierwszym z brzegu WordPressie. A co do takich wywołań funkcji jak napisałeś, rzeczywiście użycie eval nie ma sensu i nikt tak nie robi :) Najważniejsze jest, że HipHop nie będzie wspierał żadnej metody i funkcji, która generuje dodatkowy kod w trakcie wykonywania programu. Pal sześć biednego evala. Jego używanie i tak bywa wątpliwe pod względem bezpieczeństwa. Co z dynamicznymi include?

  5. sf
    21:39 on Luty 17th, 2010

    Dobre pytanie;) Bo bez dynamicznych include ciężko aktualnie napisać jakikolwiek serwis. Chyba, że ktoś do każdej akcji sobie stworzy osobny plik .php ;)

  6. X
    11:24 on Luty 18th, 2010

    Warto dodać, że 5.3 nie będzie wspierane przez HH :)

  7. Tomasz Kowalczyk
    14:59 on Luty 18th, 2010

    W ostatnim akapicie nie wiem czemu tak naskoczyłeś na PHP, w końcu nie jest aż taki zły. ;] Co do samej idei HipHopu – bardzo ciekawy pomysł, no i może ludzie przypomną sobie w końcu najwspanialszy język na świecie – C++. ;]

  8. Damian Tylczyński
    15:03 on Luty 18th, 2010

    Po prostu przypomniał mi się żart kolegi, któremu opowiedziałem tę ciekawostkę o zatrudnieniu w Facebooku. Jego tekst rozłożył mnie na łopatki :)

  9. Marcin Kłeczek
    22:17 on Marzec 15th, 2010

    Wciąż czekamy na HH – ja jestem już mocno wciągnięty i coraz bardziej zagłębiam się w Facebooka – po długim niebycie programowania na WWW (same projekty intranetowe) czas wrócić do głównego nurtu PHP.

Niestety, skomentowanie tego wpisu jest niemożliwe.

No trackbacks yet.

Optimization WordPress Plugins & Solutions by W3 EDGE