답변:
PHP는 해석 언어입니다. PHP를 해석 할 수있는 바이너리는 컴파일되지만 작성한 내용은 해석됩니다.
통역 언어에 대한 Wikipedia 페이지에서 더 많은 내용 을 볼 수 있습니다
양자 모두. PHP는 중간 바이트 코드로 컴파일 된 후 런타임 엔진에 의해 해석됩니다.
PHP 컴파일러의 일은 PHP 코드를 파싱하여 런타임 엔진에 적합한 형태로 변환하는 것입니다. 작업 중 :
PHP 설정에 따라이 단계는 일반적으로 스크립트가 처음 호출 될 때 한 번만 수행됩니다. 컴파일러 출력은 이후 사용시 액세스 속도를 높이기 위해 캐시됩니다. 그러나 스크립트가 수정되면 컴파일 단계가 다시 수행됩니다.
런타임 엔진은 스크립트가 호출 될 때 AST 및 바이트 코드를 걷습니다. 기호 테이블은 변수 값을 저장하고 함수의 바이트 코드 주소를 제공하는 데 사용됩니다.
바이트 코드로 컴파일하고 런타임에 해석하는이 프로세스는 Perl, Java, Ruby, Smalltalk 등을 포함하여 일종의 가상 런타임 시스템에서 실행되는 언어에 일반적입니다.
PHP는 해석 언어입니다. 그래도 타사 도구를 사용하여 바이트 코드로 컴파일 할 수 있습니다.
컴파일 된 코드는 컴퓨터의 CPU가 직접 실행할 수 있습니다. 즉, 실행 코드는 CPU의 모국어 로 지정 됩니다
해석 언어 코드는 런타임에 모든 형식에서 CPU 머신 명령어로 변환되어야합니다. 이 번역은 통역사가 수행합니다.
해석과 컴파일은 언어 자체 의 속성이 아니라 특정 언어 구현 의 속성 이기 때문에 언어가 해석되거나 컴파일되었다고 말하는 것은 적절 하지 않습니다 . 따라서 모든 언어를 컴파일하거나 해석 할 수 있습니다. 사용중인 특정 구현에 따라 다릅니다.
가장 널리 사용되는 PHP 구현은 Zend 엔진에 의해 구동되며 간단히 PHP라고합니다. Zend 엔진은 PHP 소스를 실행할 수있는 형식으로 컴파일하므로 Zend 엔진 은 인터프리터 로 작동합니다 .
이것은 의미없는 질문입니다. PHP는 GCC와 마찬가지로 yacc (바이슨)를 사용합니다. yacc는 "컴파일러 컴파일러"입니다. yacc의 출력은 컴파일러입니다. 컴파일러의 출력은 "컴파일"됩니다. yacc의 출력에 의해 PHP가 파싱됩니다. 따라서 정의에 따라 컴파일됩니다.
이것이 만족스럽지 않으면 다음을 고려하십시오. php (바이너리)와 gcc는 모두 소스 코드를 읽고 추상 구문 트리를 생성합니다. 버전 4와 5에서, php는 프로그램을 바이트 코드 (컴파일 단계)로 변환하기 위해 트리를 걷는다. Vulcan Logic Dumper를 사용하여 바이트 코드가 opcode로 변환 된 것을 볼 수 있습니다 (어셈블리와 유사 함) . 마지막으로 php (특히 Zend 엔진)는 바이트 코드를 해석합니다. gcc는 비교하여 트리를 걷고 어셈블리를 출력합니다. 또한 프로세스를 완료하기 위해 어셈블러 및 링커를 실행할 수 있습니다. 하나의 "해석 된"으로 처리 된 프로그램과 다른 "컴파일 된"에 의해 처리 된 다른 프로그램을 호출하는 것은 의미가 없습니다. 결국, 프로그램은 둘 다 "컴파일러"를 통해 실행됩니다.
실제로 질문하고 싶은 질문을 대신해야합니다. ( "PHP가 모든 요청에 대해 소스 코드를 다시 컴파일 할 때 성능 저하가 있습니까?"등)
나는이 질문이 오래되었다는 것을 알고 있지만 모든 곳에서 연결되어 있으며 여기의 모든 답변이 잘못되었다고 생각합니다 (아마 오래 되었기 때문에).
없다 NO 해석 된 언어 또는 컴파일 된 언어와 같은 일이. 모든 프로그래밍 언어는 해석 및 / 또는 컴파일 될 수 있습니다.
우선 언어는 일련의 규칙 일 뿐이므로 컴파일에 대해 이야기 할 때 해당 언어의 특정 구현 을 참조합니다 .
예를 들어, HHVM 은 PHP의 구현입니다. JIT 컴파일을 사용하여 코드를 중간 HipHop 바이트 코드로 변환 한 다음 기계 코드로 변환합니다. 컴파일되었다고 말하는 것으로 충분합니까? 일부 Java 구현 (모두는 아님)도 JIT를 사용합니다. Google V8도 JIT를 사용합니다.
컴파일 된 대 해석 된의 이전 정의를 사용하는 것은 현재 의미가 없습니다.
"PHP는 컴파일 되었습니까?" 컴파일 된 언어와 해석 된 언어 사이에 명확하고 합의 된 구분자가 더 이상 없다는 점을 감안할 때 비 의미적인 질문입니다.
그들을 구분하는 한 가지 방법은 다음과 같습니다 (이 이분법에서 의미가 없습니다).
컴파일 된 언어 는 Ahead of Time 컴파일 (C, C ++)을 사용합니다.
해석 된 언어 는 Just in Time 컴파일을 사용하거나 전혀 컴파일하지 않습니다 (Python, Ruby, PHP, Java).
in most cases
입니다. 모든 경우에 아닙니다. 의미 적으로 유의하고 동의 된 선을 그릴 수 없습니다.
적어도 코드를 원하는만큼 컴파일하지 않거나 최적화해야합니다.
이 코드는 ...
for($i=0;$i<100000000;$i++);
echo $i;
... 프로그램이 실행될 때마다 똑같이 프로그램을 지연시킵니다.
처음에만 수행해야하는 계산임을 감지 할 수있었습니다.