Odpowiedzi:
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
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ń:
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.
PHP jest językiem interpretowanym. Można go jednak skompilować do kodu bajtowego za pomocą narzędzi innych firm.
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 .
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.)
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).
in most cases
, tak. we wszystkich przypadkach nie. więc nie możesz narysować linii, która jest semantycznie znacząca i uzgodniona.
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.