Wird PHP kompiliert oder interpretiert?

142

Wird PHP kompiliert oder interpretiert?

Nicky
quelle

Antworten:

127

PHP ist eine interpretierte Sprache. Die Binärdatei, mit der Sie PHP interpretieren können, wird kompiliert, aber was Sie schreiben, wird interpretiert.

Weitere Informationen finden Sie auf der Wikipedia-Seite für interpretierte Sprachen

Thibault Martin-Lagardette
quelle
26
Er bedeutet, dass das Dienstprogramm namens php (oder unter Windows php.exe) kompiliert wird.
sepp2k
7
@nicky Dies bedeutet, dass das Programm, das zur Interpretation von PHP verwendet wird, kompiliert wird, aber das PHP selbst interpretiert wird.
Andrew Song
5
Aber warum wird es so in Wikipedia erwähnt? goo.gl/YOwZ Seit PHP 4 kompiliert der PHP-Parser Eingaben, um Bytecode für die Verarbeitung durch die Zend Engine zu erzeugen, wodurch die Leistung gegenüber dem Interpreter-Vorgänger verbessert wird.
Kiranvj
5
@kiranvj Es ist zwar für verbesserte Leistungen kompiliert, aber zur Laufzeit. Stellen Sie sich "kompilierte Sprachen" als "vorkompiliert" vor und interpretieren Sie Sprachen als "Kompiliert beim Ausführen". Es ist der Unterschied zwischen diesen beiden: - JIT ("Just in Time"), bei dem nur der benötigte Code kompiliert wird, wenn er benötigt wird (beachten Sie jedoch, dass der kompilierte Code nach dem Beenden des Interpreters viel ist) - AOT (" Ahead of time "), wo der gesamte Code kompiliert wird, bevor er ausgeführt wird.
Thibault Martin-Lagardette
4
@ kiranvj: Ich glaube, OP wollte wissen, ob PHP mit dem nativen Code kompiliert wird. Das Kompilieren zu Bytecode, der dann wieder von Zend interpretiert wird, liegt in Bezug auf Kompilierungskosten und Laufzeitleistung irgendwo in der Mitte. Lol, das ist ein ziemlich alter Thread, habe es gerade erkannt.
Groo
66

Beide. PHP wird zu einem Zwischenbytecode kompiliert, der dann von der Laufzeit-Engine interpretiert wird.

Der PHP-Compiler hat die Aufgabe, Ihren PHP-Code zu analysieren und in eine für die Runtime-Engine geeignete Form zu konvertieren. Zu seinen Aufgaben gehören:

  • Kommentare ignorieren
  • Lösen Sie Variablen, Funktionsnamen usw. auf und erstellen Sie die Symboltabelle
  • Erstellen Sie den abstrakten Syntaxbaum Ihres Programms
  • Schreiben Sie den Bytecode

Abhängig von Ihrem PHP-Setup wird dieser Schritt normalerweise nur einmal ausgeführt, wenn das Skript zum ersten Mal aufgerufen wird. Die Compilerausgabe wird zwischengespeichert, um den Zugriff bei späteren Verwendungen zu beschleunigen. Wenn das Skript jedoch geändert wird, wird der Kompilierungsschritt erneut ausgeführt.

Die Laufzeit-Engine überprüft den AST und den Bytecode, wenn das Skript aufgerufen wird. In der Symboltabelle werden die Werte von Variablen gespeichert und die Bytecode-Adressen für Funktionen bereitgestellt.

Dieser Prozess des Kompilierens zu Bytecode und des Interpretierens zur Laufzeit ist typisch für Sprachen, die auf einer Art virtueller Laufzeitmaschine ausgeführt werden, einschließlich Perl, Java, Ruby, Smalltalk und anderen.

Barry Brown
quelle
Die variable Bindung erfolgt zur Laufzeit, nicht zur Kompilierungszeit.
Jrockway
PHP versucht nicht einmal zu klären, welche Namen zur Kompilierungszeit im Gültigkeitsbereich sind?
Barry Brown
17

Im Allgemeinen wird es interpretiert, aber einige Zeit kann es als kompiliert verwenden und es erhöht wirklich die Leistung. Open Source-Tool zum Ausführen dieses Vorgangs: hhvm.com

Max
quelle
15

PHP ist eine interpretierte Sprache. Es kann jedoch von Tools von Drittanbietern zu Bytecode kompiliert werden.

code_burgar
quelle
2
"Bytecode" ist ein Begriff, der für VM-spezifische Pseudobefehle verwendet wird, die nicht nativ sind und daher in diesem Zusammenhang nicht als "Kompilierung" angesehen werden können.
Sedat Kapanoglu
7
"Objektcode" ist nur ein Bytecode für den Befehlsdecoder der CPU. (Sie glauben nicht, dass CPUs tatsächlich native Anweisungen wie "CMPSB" haben, oder?)
Jrockway
11

Ein kompilierter Code kann direkt von der CPU des Computers ausgeführt werden. Das heißt, der ausführbare Code wird in der Muttersprache der CPU angegeben

Der Code der interpretierten Sprachen muss zur Laufzeit von einem beliebigen Format in Anweisungen der CPU-Maschine übersetzt werden. Diese Übersetzung wird von einem Dolmetscher durchgeführt.

Es wäre nicht richtig zu sagen, dass eine Sprache interpretiert oder kompiliert wird, da Interpretation und Kompilierung beide Eigenschaften der Implementierung dieser bestimmten Sprache sind und keine Eigenschaft der Sprache selbst. So kann jede Sprache kompiliert oder interpretiert werden - es hängt nur davon ab, was die von Ihnen verwendete Implementierung bewirkt.

Die am weitesten verbreitete PHP-Implementierung wird von der Zend Engine unterstützt und ist einfach als PHP bekannt. Die Zend Engine kompiliert die PHP-Quelle in ein Format, das sie ausführen kann, sodass die Zend Engine als Interpreter fungiert .

Gaurang Deshpande
quelle
2
Das heißt, der ausführbare Code in der Muttersprache des CPU angegeben “ .. Executable - Code wird in nicht angegeben CPU Muttersprache , aber im Binärformat, CPU Muttersprache könnte alles sein , und wenn Software - Binärdateien kommen nicht , wie es hierfür ist , CPU oder diese CPU .. Ein vollständig kompilierter und ausführbarer Code wird im Binärformat sein ..
Hagrawal
10

Dies ist eine bedeutungslose Frage. PHP verwendet Yacc (Bison), genau wie GCC. yacc ist ein "Compiler-Compiler". Die Ausgabe von yacc ist ein Compiler. Die Ausgabe eines Compilers wird "kompiliert". PHP wird durch die Ausgabe von yacc analysiert. Es ist also per Definition kompiliert.

Wenn dies nicht zufriedenstellend ist, beachten Sie Folgendes. Sowohl php (die Binärdatei) als auch gcc lesen Ihren Quellcode und erstellen einen abstrakten Syntaxbaum. In den Versionen 4 und 5 geht PHP dann durch den Baum, um das Programm in Bytecode zu übersetzen (der Kompilierungsschritt). Sie können den Bytecode sehen, der mit dem Vulcan Logic Dumper in Opcodes (analog zur Assembly) übersetzt wurde . Schließlich interpretiert PHP (insbesondere die Zend-Engine) den Bytecode. Im Vergleich dazu geht gcc über den Baum und gibt die Assembly aus. Es können auch Assembler und Linker ausgeführt werden, um den Vorgang abzuschließen. Es ist bedeutungslos, ein Programm aufzurufen, das von einem "interpretierten" und ein anderes Programm von dem anderen "kompilierten" behandelt wird. Schließlich werden beide Programme mit beiden über einen "Compiler" ausgeführt.

Sie sollten tatsächlich die Frage stellen, die Sie stattdessen stellen möchten. ("Zahle ich eine Leistungsstrafe, wenn PHP meinen Quellcode für jede Anfrage neu kompiliert?" Usw.)

Jrockway
quelle
5
Das Tokenisieren eines Quellcodes wird nicht kompiliert. Sogar VBScript kann mit Ihrer Definition als kompilierte Sprache angesehen werden.
Sedat Kapanoglu
5
Ich bin mit jrockway dabei, obwohl es die Frage des OP nicht wirklich beantwortet. Es ist verlockend, eine Taxonomie von Sprachen zu erstellen, in der jede Sprache sauber in jede Kategorie eingeordnet wird. Aber die Realität ist nicht so ordentlich. Fast jede Sprache ist eine Mischung aus Merkmalen. Wenn Sie es genau wissen, wird sogar nativer Maschinencode vom Prozessor "interpretiert".
Barry Brown
4
Ihre Behauptung auf hoher Ebene ist richtig, dies ist eine bedeutungslose Frage. Ihr Argument ist jedoch nicht sehr hilfreich. Alles, was Sie getan haben, sind unscharfe Definitionen und sie auf die Spitze getrieben. Kompilierung ist die Umwandlung von Quelle in Objektcode. Ja, Sie können die Umwandlung der Quelle in einen konkreten / abstrakten Syntaxbaum als Zusammenstellung betrachten, aber das meinen die meisten Leute nicht, oder? Unabhängig davon ist dies eine bedeutungslose Frage, da eine Sprache nicht von Natur aus kompiliert oder interpretiert wird, sondern Implementierungen einer Sprache kompiliert oder interpretiert werden.
Falaina
6
Lassen Sie uns nicht übersehen, dass der Typ ein Anfänger ist. Daher interpretiere ich die Frage als "Produziert die Zend-Implementierung nativen Code aus einer PHP-Quelle?". Schau dir meine Antwort an. Ich denke, Sie sind zu streng in Bezug auf die Art und Weise, wie die Frage gestellt wird. Weißt du, wir versuchen zu helfen, nicht einige Neulinge zu verprügeln.
Sedat Kapanoglu
3
Ich stimme Sedat voll und ganz zu. Sie können Ihr Wissen teilen, ohne dem Fragesteller ein Arschloch zu sein
Alexandre Bourlier
10

Ich weiß, dass diese Frage alt ist, aber sie ist überall verlinkt und ich denke, alle Antworten hier sind falsch (vielleicht weil sie alt sind).

Es gibt KEINE interpretierte oder kompilierte Sprache. Jede Programmiersprache kann interpretiert und / oder kompiliert werden.

Zunächst einmal ist eine Sprache nur ein Regelwerk. Wenn wir also über Kompilierung sprechen, beziehen wir uns auf bestimmte Implementierungen dieser Sprache.

HHVM ist beispielsweise eine Implementierung von PHP. Es verwendet die JIT-Kompilierung, um den Code in einen Zwischen-HipHop-Bytecode umzuwandeln und dann in Maschinencode zu übersetzen. Ist es genug zu sagen, dass es kompiliert ist? Einige Java-Implementierungen (nicht alle) verwenden auch JIT. Googles V8 verwendet auch JIT.

Die Verwendung der alten Definitionen von kompiliert und interpretiert macht heutzutage keinen Sinn mehr.

"Ist PHP kompiliert?" ist eine unsinnige Frage, da es keine klaren und vereinbarten Trennzeichen mehr zwischen einer kompilierten und einer interpretierten Sprache gibt.

Eine Möglichkeit, sie abzugrenzen, ist (ich finde in dieser Dichotomie keine Bedeutung):

kompilierte Sprachen verwenden die Ahead of Time-Kompilierung (C, C ++);

interpretierte Sprachen verwenden die Just-in-Time-Kompilierung oder gar keine Kompilierung (Python, Ruby, PHP, Java).

Claudiu Creanga
quelle
Verwendet Java in den meisten Fällen jedoch keine Kompilierung im Voraus? Ich bin ein ziemlich neuer Java-Entwickler und wir kompilieren unseren Code normalerweise lange vor der Laufzeit.
aCarella
@aCarella in most cases, ja. in allen Fällen nein. Sie können also keine Linie zeichnen, die semantisch bedeutsam und vereinbart ist.
Claudiu Creanga
2

Zumindest wird der Code nicht so kompiliert (oder sollte ich sagen, optimieren), wie man es möchte.

Dieser Code ...

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

... verzögert das Programm bei jeder Ausführung gleich stark.

Es könnte festgestellt worden sein, dass es sich um eine Berechnung handelt, die nur beim ersten Mal durchgeführt werden muss.

Magnus Andersson
quelle
Jetzt haben wir eine Option namens Generatoren.
Ankit Vishwakarma
1

Die akzeptierte Antwort ist offensichtlich falsch. PHP wird kompiliert. Ende der Geschichte. Vielleicht nicht zu nativen Anweisungen, sondern zu einem interpretierten Bytecode.

RichieHH
quelle