PHP는 컴파일되거나 해석됩니까?


142

PHP는 컴파일되거나 해석됩니까?

답변:


127

PHP는 해석 언어입니다. PHP를 해석 할 수있는 바이너리는 컴파일되지만 작성한 내용은 해석됩니다.

통역 언어에 대한 Wikipedia 페이지에서 더 많은 내용 볼 수 있습니다


26
그는 php (또는 Windows php.exe)라는 유틸리티가 컴파일되었음을 의미합니다.
sepp2k

7
@nicky PHP를 해석하는 데 사용되는 프로그램은 컴파일되었지만 PHP 자체는 해석됩니다.
Andrew Song

5
그러나 왜 위키 백과에서 이와 같이 언급 되었습니까? goo.gl/YOwZ PHP 4부터 PHP 파서는 입력을 컴파일하여 젠드 엔진이 처리 할 바이트 코드를 생성하여 인터프리터 이전 버전보다 향상된 성능을 제공합니다.
kiranvj

5
@kiranvj 실제로 성능 향상을 위해 컴파일되었지만 런타임에 컴파일되었습니다. "컴파일 된 언어"를 "사전 컴파일 된"로, 해석 된 언어를 "실행시 컴파일 된"으로 생각하십시오. 이 두 가지의 차이점은 다음과 같습니다.-필요할 때 필요한 코드 만 컴파일되는 JIT ( "Just in time") (그러나 인터프리터가 종료 된 후 컴파일 된 코드가 많음)-AOT ( " Ahead of time "), 모든 코드가 실행되기 전에 컴파일됩니다.
Thibault Martin-Lagardette

4
@ kiranvj : OP가 PHP가 원시 코드로 컴파일되는지 알고 싶어했습니다. 바이트 코드로 컴파일 한 다음 Zend에서 다시 해석하면 컴파일 비용 및 런타임 성능 측면에서 중간에 있습니다. 롤, 이것은 다소 오래된 실입니다.
Groo

66

양자 모두. PHP는 중간 바이트 코드로 컴파일 된 후 런타임 엔진에 의해 해석됩니다.

PHP 컴파일러의 일은 PHP 코드를 파싱하여 런타임 엔진에 적합한 형태로 변환하는 것입니다. 작업 중 :

  • 댓글 무시
  • 변수, 함수 이름 등을 해결하고 심볼 테이블을 만듭니다.
  • 프로그램의 추상 구문 트리를 구성하십시오
  • 바이트 코드 작성

PHP 설정에 따라이 단계는 일반적으로 스크립트가 처음 호출 될 때 한 번만 수행됩니다. 컴파일러 출력은 이후 사용시 액세스 속도를 높이기 위해 캐시됩니다. 그러나 스크립트가 수정되면 컴파일 단계가 다시 수행됩니다.

런타임 엔진은 스크립트가 호출 될 때 AST 및 바이트 코드를 걷습니다. 기호 테이블은 변수 값을 저장하고 함수의 바이트 코드 주소를 제공하는 데 사용됩니다.

바이트 코드로 컴파일하고 런타임에 해석하는이 프로세스는 Perl, Java, Ruby, Smalltalk 등을 포함하여 일종의 가상 런타임 시스템에서 실행되는 언어에 일반적입니다.


변수 바인딩은 컴파일 타임이 아닌 런타임에 발생합니다.
jrockway

PHP는 컴파일 타임에 어떤 이름이 범위 내에 있는지 확인조차하지 않습니까?
베리 브라운

17

일반적으로 해석되지만 시간이 지나면 컴파일 된 상태로 사용할 수 있으며 실제로 성능이 향상됩니다. 이 작업을 수행하기위한 오픈 소스 도구 : hhvm.com


15

PHP는 해석 언어입니다. 그래도 타사 도구를 사용하여 바이트 코드로 컴파일 할 수 있습니다.


2
"바이트 코드"는 VM 특정 의사 명령어에 사용되는 용어로, 기본 컨텍스트가 아니므로이 컨텍스트에서 "컴파일"로 간주 할 수 없습니다.
Sedat Kapanoglu

7
"객체 코드"는 CPU의 명령어 디코더에 대한 바이트 코드 일뿐입니다. (CPU에 실제로 "CMPSB"와 같은 기본 명령어가 있다고 생각하지 않습니까?)
jrockway

11

컴파일 된 코드는 컴퓨터의 CPU가 직접 실행할 수 있습니다. 즉, 실행 코드는 CPU의 모국어 로 지정 됩니다

해석 언어 코드는 런타임에 모든 형식에서 CPU 머신 명령어로 변환되어야합니다. 이 번역은 통역사가 수행합니다.

해석과 컴파일은 언어 자체 의 속성이 아니라 특정 언어 구현속성 이기 때문에 언어가 해석되거나 컴파일되었다고 말하는 것은 적절 하지 않습니다 . 따라서 모든 언어를 컴파일하거나 해석 할 수 있습니다. 사용중인 특정 구현에 따라 다릅니다.

가장 널리 사용되는 PHP 구현은 Zend 엔진에 의해 구동되며 간단히 PHP라고합니다. Zend 엔진은 PHP 소스를 실행할 수있는 형식으로 컴파일하므로 Zend 엔진인터프리터 로 작동합니다 .


2
" 즉, 실행 가능한 코드는 CPU의 모국어로 지정됩니다. ".. 실행 가능한 코드는 CPU의 모국어로 지정되지 않지만 이진 형식으로, CPU의 모국어는 무엇이든 될 수 있으며 소프트웨어 바이너리가 이와 같이되지 않을 때 CPU 또는 해당 CPU .. 완전히 컴파일되고 실행 가능한 코드는 이진 형식입니다.
hagrawal

10

이것은 의미없는 질문입니다. PHP는 GCC와 마찬가지로 yacc (바이슨)를 사용합니다. yacc는 "컴파일러 컴파일러"입니다. yacc의 출력은 컴파일러입니다. 컴파일러의 출력은 "컴파일"됩니다. yacc의 출력에 의해 PHP가 파싱됩니다. 따라서 정의에 따라 컴파일됩니다.

이것이 만족스럽지 않으면 다음을 고려하십시오. php (바이너리)와 gcc는 모두 소스 코드를 읽고 추상 구문 트리를 생성합니다. 버전 4와 5에서, php는 프로그램을 바이트 코드 (컴파일 단계)로 변환하기 위해 트리를 걷는다. Vulcan Logic Dumper를 사용하여 바이트 코드가 opcode로 변환 된 것을 볼 수 있습니다 (어셈블리와 유사 함) . 마지막으로 php (특히 Zend 엔진)는 바이트 코드를 해석합니다. gcc는 비교하여 트리를 걷고 어셈블리를 출력합니다. 또한 프로세스를 완료하기 위해 어셈블러 및 링커를 실행할 수 있습니다. 하나의 "해석 된"으로 처리 된 프로그램과 다른 "컴파일 된"에 의해 처리 된 다른 프로그램을 호출하는 것은 의미가 없습니다. 결국, 프로그램은 둘 다 "컴파일러"를 통해 실행됩니다.

실제로 질문하고 싶은 질문을 대신해야합니다. ( "PHP가 모든 요청에 ​​대해 소스 코드를 다시 컴파일 할 때 성능 저하가 있습니까?"등)


5
소스 코드 토큰 화는 컴파일되지 않습니다. VBScript조차도 사용자 정의와 함께 컴파일 된 언어로 간주 될 수 있습니다.
Sedat Kapanoglu

5
나는 OP의 질문에 실제로 대답하지는 않지만 jrockway와 함께 있습니다. 모든 언어가 각 범주에 깔끔하게 배치되는 언어 분류법을 만들고 싶어합니다. 그러나 현실은 그렇게 깔끔하지 않습니다. 거의 모든 언어는 특성이 혼합되어 있습니다. 또한 바로 아래로 내려 가면 기본 기계 코드조차도 프로세서에 의해 "해석"됩니다.
Barry Brown

4
귀하의 높은 수준의 주장이 맞다 입니다 의미없는 질문입니다. 그러나 당신의 주장은 그다지 도움이되지 않습니다. 당신이 한 모든 것은 퍼지 정의를 취하고 극단으로 가져갑니다. 컴파일은 소스를 객체 코드로 변환하는 것입니다. 예. 소스를 구체적 / 추상적 구문 트리로 변환하는 것을 컴파일이라고 생각할 수 있지만 대부분의 사람들이 의미하는 것은 아닙니다. 어쨌든 이것은 언어가 본질적으로 컴파일되거나 해석 되지 않고 언어의 함침이 컴파일되거나 해석 되기 때문에 의미가없는 질문 입니다.
Falaina

6
그 사람이 초보자임을 감독하지 마십시오. 이것은 질문을 "Zend 구현이 PHP 소스에서 네이티브 코드를 생성합니까?" 내 대답을 확인하십시오. 질문을받는 방식이 너무 엄격하다고 생각합니다. 우리는 일부 초보자를 강타하지 말고 도와 주려고 노력하고 있습니다.
Sedat Kapanoglu

3
Sedat에 전적으로 동의합니다. 당신은 아스 커에 물건을하지 않고 자신의 지식을 공유 할 수 있습니다
알렉상드르 Bourlier

10

나는이 질문이 오래되었다는 것을 알고 있지만 모든 곳에서 연결되어 있으며 여기의 모든 답변이 잘못되었다고 생각합니다 (아마 오래 되었기 때문에).

없다 NO 해석 된 언어 또는 컴파일 된 언어와 같은 일이. 모든 프로그래밍 언어는 해석 및 / 또는 컴파일 될 수 있습니다.

우선 언어는 일련의 규칙 일 뿐이므로 컴파일에 대해 이야기 할 때 해당 언어의 특정 구현 을 참조합니다 .

예를 들어, HHVM 은 PHP의 구현입니다. JIT 컴파일을 사용하여 코드를 중간 HipHop 바이트 코드로 변환 한 다음 기계 코드로 변환합니다. 컴파일되었다고 말하는 것으로 충분합니까? 일부 Java 구현 (모두는 아님)도 JIT를 사용합니다. Google V8도 JIT를 사용합니다.

컴파일 된 대 해석 된의 이전 정의를 사용하는 것은 현재 의미가 없습니다.

"PHP는 컴파일 되었습니까?" 컴파일 된 언어와 해석 된 언어 사이에 명확하고 합의 된 구분자가 더 이상 없다는 점을 감안할 때 비 의미적인 질문입니다.

그들을 구분하는 한 가지 방법은 다음과 같습니다 (이 이분법에서 의미가 없습니다).

컴파일 된 언어 는 Ahead of Time 컴파일 (C, C ++)을 사용합니다.

해석 된 언어 는 Just in Time 컴파일을 사용하거나 전혀 컴파일하지 않습니다 (Python, Ruby, PHP, Java).


그래도 Java는 대부분의 경우 사전 컴파일을 사용하지 않습니까? 저는 상당히 새로운 Java 개발자이며 일반적으로 런타임 전에 코드 방식을 컴파일합니다.
aCarella

@aCarella in most cases입니다. 모든 경우에 아닙니다. 의미 적으로 유의하고 동의 된 선을 그릴 수 없습니다.
Claudiu Creanga

2

적어도 코드를 원하는만큼 컴파일하지 않거나 최적화해야합니다.

이 코드는 ...

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

... 프로그램이 실행될 때마다 똑같이 프로그램을 지연시킵니다.

처음에만 수행해야하는 계산임을 감지 할 수있었습니다.


이제 제너레이터라는 옵션이 있습니다.
Ankit Vishwakarma

1

받아 들여진 대답은 명백히 거짓입니다. PHP는 컴파일되었습니다. 이야기의 끝. 기본 명령어가 아니라 해석 된 바이트 코드 일 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.