Czy PHP jest kompilowane czy interpretowane?

142

Czy PHP jest kompilowane czy interpretowane?

Nicky
źródło

Odpowiedzi:

127

PHP jest językiem interpretowanym. Plik binarny, który umożliwia interpretację PHP, jest kompilowany, ale to, co piszesz, jest interpretowane.

Więcej informacji można znaleźć na stronie Wikipedii dotyczącej języków interpretowanych

Thibault Martin-Lagardette
źródło
26
Oznacza to, że narzędzie o nazwie php (lub w systemie Windows php.exe) zostało skompilowane.
wrzesień
7
@nicky Oznacza to, że program służący do interpretacji PHP jest kompilowany, ale samo PHP jest interpretowane.
Andrew Song
5
Ale dlaczego jest to wspomniane w Wikipedii? goo.gl/YOwZ Począwszy od PHP 4, parser PHP kompiluje dane wejściowe w celu utworzenia kodu bajtowego do przetwarzania przez silnik Zend, zapewniając lepszą wydajność w porównaniu z poprzednikiem interpretera.
kiranvj
5
@kiranvj Rzeczywiście jest kompilowany w celu poprawy wydajności, ale w czasie wykonywania. Wyobraź sobie „języki kompilowane” jako „wstępnie skompilowane”, a języki zinterpretowane jako „kompilowane po uruchomieniu”. Jest to różnica między tymi dwoma: - JIT ("Just in time"), gdzie tylko kod, który jest potrzebny, jest kompilowany, gdy jest potrzebny (pamiętaj jednak, że po zamknięciu interpretera skompilowany kod jest dużo) - AOT (" Z wyprzedzeniem ”), gdzie cały kod jest kompilowany przed uruchomieniem.
Thibault Martin-Lagardette,
4
@kiranvj: Myślę, że OP chciał wiedzieć, czy PHP zostanie skompilowane do kodu natywnego. Kompilowanie go do kodu bajtowego, który jest następnie ponownie interpretowany przez Zend, jest gdzieś pośrodku pod względem kosztów kompilacji i wydajności działania. Lol, to dość stary wątek, właśnie to sobie uświadomiłem.
Groo
66

Obie. PHP jest kompilowane do pośredniego kodu bajtowego, który jest następnie interpretowany przez silnik wykonawczy.

Zadaniem kompilatora PHP jest przeanalizowanie kodu PHP i przekonwertowanie go do postaci odpowiedniej dla silnika wykonawczego. Wśród jego zadań:

  • Ignoruj ​​komentarze
  • Rozwiąż zmienne, nazwy funkcji i tak dalej i utwórz tablicę symboli
  • Skonstruuj abstrakcyjne drzewo składniowe swojego programu
  • Napisz kod bajtowy

W zależności od konfiguracji PHP ten krok jest zwykle wykonywany tylko raz, przy pierwszym wywołaniu skryptu. Dane wyjściowe kompilatora są buforowane, aby przyspieszyć dostęp przy kolejnych zastosowaniach. Jeśli jednak skrypt zostanie zmodyfikowany, krok kompilacji jest wykonywany ponownie.

Silnik wykonawczy przechodzi przez AST i kod bajtowy, gdy wywoływany jest skrypt. Tablica symboli służy do przechowywania wartości zmiennych i dostarczania adresów w postaci kodu bajtowego funkcji.

Ten proces kompilacji do kodu bajtowego i interpretacji go w czasie wykonywania jest typowy dla języków, które działają na pewnego rodzaju wirtualnej maszynie wykonawczej, w tym Perl, Java, Ruby, Smalltalk i inne.

Barry Brown
źródło
Wiązanie zmiennych odbywa się w czasie wykonywania, a nie w czasie kompilacji.
jrockway
PHP nie próbuje nawet ustalić, które nazwy są objęte zakresem w czasie kompilacji?
Barry Brown
17

Generalnie jest to interpretowane, ale jakiś czas można go używać po skompilowaniu i naprawdę zwiększa wydajność. Narzędzie open source do wykonania tej operacji: hhvm.com

Maks
źródło
15

PHP jest językiem interpretowanym. Można go jednak skompilować do kodu bajtowego za pomocą narzędzi innych firm.

code_burgar
źródło
2
„kod bajtowy” to termin używany dla pseudoinstrukcji specyficznych dla maszyny wirtualnej, które nie są natywne, dlatego w tym kontekście nie mogą być traktowane jako „kompilacja”.
Sedat Kapanoglu
7
„Kod wynikowy” to po prostu kod bajtowy dekodera instrukcji procesora. (Nie sądzisz, że procesory faktycznie mają natywne instrukcje, takie jak „CMPSB”, prawda?)
jrockway
11

Skompilowany kod może być wykonywany bezpośrednio przez procesor komputera. Oznacza to, że kod wykonywalny jest określony w języku ojczystym procesora

Kod języków interpretowanych musi być tłumaczony w czasie wykonywania z dowolnego formatu na instrukcje maszynowe procesora. To tłumaczenie jest wykonywane przez tłumacza.

Nie byłoby właściwe twierdzenie, że język jest interpretowany lub kompilowany, ponieważ interpretacja i kompilacja są zarówno właściwościami implementacji tego konkretnego języka, a nie właściwościami samego języka . Tak więc każdy język można skompilować lub zinterpretować - zależy to tylko od tego, co robi konkretna implementacja, której używasz.

Najpopularniejsza implementacja PHP jest obsługiwana przez silnik Zend i znana po prostu jako PHP. Silnik Zend kompiluje źródła PHP do formatu, który może wykonać, dlatego silnik Zend działa jako interpreter .

Gaurang Deshpande
źródło
2
Oznacza to, że kod wykonywalny jest określony w języku ojczystym procesora ” .. Kod wykonywalny nie jest określony w języku ojczystym procesora, ale w formacie binarnym, język ojczysty procesora może być wszystkim, a gdy pliki binarne oprogramowania nie są takie, jakie są do tego celu CPU lub
inny
10

To jest bezsensowne pytanie. PHP używa yacc (bison), podobnie jak GCC. yacc to „kompilator kompilatora”. Wyjście yacc to kompilator. Dane wyjściowe kompilatora są „kompilowane”. PHP jest analizowane przez wyjście yacc. Z definicji jest więc skompilowany.

Jeśli to nie satysfakcjonuje, rozważ następujące kwestie. Zarówno php (plik binarny), jak i gcc czytają kod źródłowy i tworzą abstrakcyjne drzewo składni. W wersjach 4 i 5 php przechodzi następnie po drzewie, aby przetłumaczyć program na kod bajtowy (krok kompilacji). Możesz zobaczyć kod bajtowy przetłumaczony na opkody (które są analogiczne do asemblacji) za pomocą Vulcan Logic Dumper . Wreszcie php (w szczególności silnik Zend) interpretuje kod bajtowy. gcc, dla porównania, chodzi po drzewie i tworzy wyjścia; może również uruchamiać asemblery i konsolidatory, aby zakończyć proces. Wywołanie programu obsługiwanego przez jednego „zinterpretowanego”, a innego programu obsługiwanego przez drugiego „skompilowanego” jest bez znaczenia. W końcu oba programy są uruchamiane przez „kompilator” z obydwoma.

Zamiast tego powinieneś zadać pytanie, które chcesz zadać. („Czy płacę karę za wydajność, gdy PHP rekompiluje mój kod źródłowy dla każdego żądania?” Itp.)

jrockway
źródło
5
Tokenizacja kodu źródłowego nie jest kompilacją. Nawet VBScript może być traktowany jako język kompilowany z twoją definicją.
Sedat Kapanoglu
5
Jestem z jrockway w tej sprawie, chociaż tak naprawdę nie odpowiada na pytanie OP. Kuszące jest stworzenie taksonomii języków, w której każdy język jest wyraźnie umieszczony w każdej kategorii. Ale rzeczywistość nie jest taka schludna. Prawie każdy język to mieszanka cech. Ponadto, kiedy już do tego dojdziesz, nawet natywny kod maszynowy jest „interpretowany” przez procesor.
Barry Brown
4
Twoje twierdzenie na wysokim poziomie jest poprawne, to jest bezsensowne pytanie. Twój argument nie jest jednak zbyt pomocny, wszystko, co zrobiłeś, to wzięcie niewyraźnych definicji i doprowadzenie ich do skrajności. Kompilacja to przekształcenie źródła w kod obiektowy. Tak, możesz uznać transformację źródła w konkretne / abstrakcyjne drzewo składni za kompilację, ale większość ludzi nie o tym myśli, prawda? Niezależnie od tego jest to bezsensowne pytanie, ponieważ język nie jest NIERÓWNIE kompilowany ani interpretowany, a implikacje języka są kompilowane lub interpretowane.
Falaina
6
nie nadzorujmy tego, że facet jest początkującym. to sprawia, że ​​interpretuję pytanie jako „czy implementacja Zend tworzy natywny kod ze źródła PHP?”. sprawdź moją odpowiedź. Myślę, że jesteś zbyt surowy, jeśli chodzi o sposób zadawania pytania. Wiesz, staramy się pomóc, a nie walić nowicjuszy.
Sedat Kapanoglu
3
W pełni zgadzam się z Sedatem. Możesz podzielić się swoją wiedzą, nie będąc
kutasem, pytającemu
10

Wiem, że to pytanie jest stare, ale jest połączone w każdym miejscu i myślę, że wszystkie odpowiedzi tutaj są nieprawidłowe (może dlatego, że są stare).

Jest NO czegoś takiego jak interpretowanym języku lub skompilowany języka. Każdy język programowania może być interpretowany i / lub kompilowany.

Przede wszystkim język to tylko zbiór reguł, więc gdy mówimy o kompilacji, odnosimy się do konkretnych implementacji tego języka.

Na przykład HHVM jest implementacją PHP. Używa kompilacji JIT do przekształcenia kodu na pośredni kod bajtowy HipHop, a następnie przetłumaczony na kod maszynowy. Czy wystarczy powiedzieć, że jest skompilowany? Niektóre implementacje języka Java (nie wszystkie) również używają JIT. Google V8 również używa JIT.

Używanie starych definicji kompilacji vs. interpretacji nie ma obecnie sensu.

„Czy PHP jest kompilowane?” jest kwestią pozbawioną sensu, biorąc pod uwagę, że nie ma już jasnych i uzgodnionych separatorów między językiem kompilowanym a językiem interpretowanym.

Jednym z możliwych sposobów ich rozgraniczenia jest (nie znajduję żadnego znaczenia w tej dychotomii):

języki kompilowane używają kompilacji z wyprzedzeniem (C, C ++);

języki interpretowane używają kompilacji Just in Time lub nie używają żadnej kompilacji (Python, Ruby, PHP, Java).

Claudiu Creanga
źródło
Czy jednak w większości przypadków Java nie używa kompilacji z wyprzedzeniem? Jestem całkiem nowym programistą Java i zwykle kompilujemy nasz kod na długo przed uruchomieniem.
aCarella
@aCarella in most cases, tak. we wszystkich przypadkach nie. więc nie możesz narysować linii, która jest semantycznie znacząca i uzgodniona.
Claudiu Creanga
2

Przynajmniej nie kompiluje (a raczej nie optymalizuje) kodu tak często, jak można by tego chcieć.

Ten kod ...

for($i=0;$i<100000000;$i++);
echo $i;

... opóźnia program jednakowo przy każdym uruchomieniu.

Mogło wykryć, że jest to obliczenie, które należy wykonać tylko za pierwszym razem.

Magnus Andersson
źródło
Teraz mamy opcję o nazwie generatory.
Ankit Vishwakarma
1

Przyjęta odpowiedź jest rażąco fałszywa. PHP jest skompilowane. Koniec opowieści. Może nie do instrukcji rodzimych, ale do zinterpretowanego kodu bajtowego.

RichieHH
źródło