PHP가 해석되거나 컴파일되는지 이해하는 데 1분 정도 소요됩니다.

慕斯
풀어 주다: 2023-04-10 08:44:02
앞으로
3135명이 탐색했습니다.

이 글에서는 PHP가 인터프리트인지 컴파일인지 1분간 설명하겠습니다. 도움이 필요한 친구들이 모두 참고할 수 있기를 바랍니다.

PHP가 해석되거나 컴파일되는지 이해하는 데 1분 정도 소요됩니다.

컴파일된 언어

  • 특정 플랫폼(운영 체제)을 대상으로 하는 특수 컴파일러(Windows의 Visual Studio와 유사)를 사용하여 특정 고급 언어 소스 코드를 다음에서 변환합니다. 플랫폼의 하드웨어에 의해 실행되는 기계어 코드(기계 명령어 및 피연산자 포함)로 "변환"되고 플랫폼에서 인식되는 실행 프로그램(.exe) 형식으로 패키지됩니다. 이 변환 프로세스를 컴파일이라고 합니다. 컴파일된 실행 프로그램은 개발 환경에서 분리되어 특정 플랫폼에서 독립적으로 실행될 수 있습니다. 일부 프로그램은 컴파일된 후 다른 컴파일된 개체 코드를 연결해야 할 수도 있습니다. 즉, 두 개 이상의 개체 코드 모듈을 조합하여 최종 실행 프로그램을 생성해야 하는 경우 저수준 코드 재사용이 달성됩니다.
  • 컴파일된 언어 코드는 한 번 컴파일되어 반복적으로 사용됩니다. 즉, 선인은 나무를 심었고 후손은 그늘을 누렸다는 것이다.
  • C, C++, Objective-C 등은 모두 컴파일된 언어입니다 ​​

해석언어 ​​

  • 소스 프로그램은 프로그램이 실행되기 전에 중간언어로 미리 컴파일된 후, 중간 언어는 인터프리터에 의해 실행됩니다.
  • 매번 인터프리터 언어로 된 프로그램은 실행될 때마다 한 번씩 컴파일되어야 합니다. 따라서 인터프리터 언어 프로그램의 실행 효율성은 일반적으로 낮으며 인터프리터와 독립적으로 실행될 수 없습니다. .
  • C#, PHP, Python, Java 등은 모두 해석된 언어입니다.

OK, 위의 개념에 대한 간단한 이해를 통해 해석 및 컴파일 언어에 대한 전반적인 이해를 가질 수 있습니다. 두 사람이 세상을 동등하게 공유하고 있으므로, 각각의 장점을 살펴보겠습니다.

컴파일된 언어

장점

  • 컴파일된 언어의 가장 큰 장점 중 하나는 실행 속도입니다. C/C++로 작성된 프로그램은 Java로 작성된 동일한 프로그램보다 30%-70% 더 빠르게 실행됩니다.
  • 컴파일된 프로그램은 해석된 프로그램보다 메모리를 덜 소비합니다.

단점

  • 다운사이드 - 컴파일러는 인터프리터보다 작성하기가 훨씬 어렵습니다.
  • 컴파일러는 프로그램을 디버깅할 때 많은 도움을 제공하지 않습니다. C 코드에서 몇 번이나 "NullPointerException"이 발생하면, 코드에서 오류가 있는 위치를 파악하는 데 몇 시간이 걸릴 수 있습니다.
  • 실행 가능한 컴파일된 코드는 동일한 해석된 코드보다 훨씬 큽니다. 예를 들어, C/C++ .exe 파일은 동일한 기능을 가진 Java .class 파일보다 훨씬 큽니다.
  • 컴파일된 프로그램은 플랫폼별로 다르므로 플랫폼에 따라 다릅니다.
  • 컴파일된 프로그램은 코드에 보안을 구현하는 것을 허용하지 않습니다. 예를 들어 컴파일된 프로그램은 메모리의 모든 영역에 액세스하여 PC에서 원하는 모든 작업을 수행할 수 있습니다(대부분의 바이러스는 컴파일된 언어를 사용하여 컴파일됩니다)
  • 느슨한 보안과 플랫폼 종속성으로 인해 컴파일된 언어는 인터넷이나 웹 기반 애플리케이션을 개발하는 데 적합하지 않습니다.

통역된 언어

장점

  • 뛰어난 디버깅 지원. PHP 실행 환경은 예외의 성격을 나타낼 뿐만 아니라 예외가 발생한 특정 줄 번호와 함수 호출 순서도 제공하기 때문에 PHP 프로그래머가 "널 포인터 예외"를 찾아서 수정하는 데는 몇 분 밖에 걸리지 않습니다( 유명한 스택 추적 정보). 이러한 편리함은 컴파일된 언어에서는 제공되지 않습니다.
  • 인터프리터는 컴파일러보다 구현하기 쉽습니다
  • 뛰어난 플랫폼 독립성
  • 높은 보안 - 인터넷 응용 프로그램에 긴급히 필요합니다.
  • 중간 언어 코드가 컴파일된 코드보다 작습니다. 실행 가능한 코드가 훨씬 작습니다.

단점

  • 더 많은 메모리와 CPU 리소스를 차지합니다. 인터프리터 언어로 작성된 프로그램을 실행하기 위해서는 먼저 해당 인터프리터를 실행해야 하기 때문이다. 통역사는 복잡하고 지능적이며 리소스 집약적인 프로그램이며 많은 CPU 주기와 메모리를 차지합니다.
  • 실행 효율성은 컴파일된 프로그램보다 훨씬 느립니다. 인터프리터는 많은 코드 최적화 및 런타임 보안 검사를 수행합니다. 이러한 추가 단계는 더 많은 리소스를 사용하고 애플리케이션 속도를 더욱 저하시킵니다.

OK, 위의 연구를 통해 모든 사람이 해석 언어와 컴파일 언어에 대한 일반적인 이해를 갖고 있다고 믿습니다. PHP 언어는 해석 언어이고, PHP 언어를 해석하는 해석기는 Zend 엔진입니다.

게다가, 둘의 장단점을 비교해보면, 컴파일된 언어가 낮은 수준의 작업에 더 적합한 반면, 해석된 언어는 웹 개발에 주로 사용된다는 것을 알 수 있습니다.

PHP의 실행 과정을 심도 깊게 살펴보겠습니다.

PHP의 컴파일과 실행은 분리되어 있습니다. 즉, 컴파일이 먼저 완료된 다음 실행됩니다. 많은 사람들이 이렇게 말할 것입니다. 실제로 C++에서도 마찬가지입니다. 그러나 이러한 PHP 분리는 우리에게 많은 편리함을 제공할 수 있지만 물론 많은 단점도 있습니다.

먼저 전체 프로세스에 대해 이야기해 보겠습니다.

①php는 컴파일 함수 zend_compile_file()을 호출하여 컴파일합니다. 이 기능의 구체적인 구현에는 실제로 어휘 분석(Lex 구현)과 구문 분석(Yacc 구현)이라는 두 가지 주요 프로세스가 포함됩니다. 이 함수를 실행하면 PHP 스크립트 컴파일이 완료됩니다. 이 함수의 입력은 php 스크립트 파일이고 출력은 op_array입니다. 간단히 말하면: 컴파일 프로세스는 스크립트를 PHP 가상 머신이 처리할 수 있는 명령어로 구문 분석하는 것이며, op_array는 이러한 명령어로 구성된 배열입니다. (이것은 하나씩 명령이기도 한 일부 컴파일된 언어를 컴파일하여 생성된 어셈블리 코드와 매우 유사합니다.)

②: 그런 다음 PHP 가상 머신은 zend_execute() 함수를 호출하여 실행합니다. 이 함수의 입력은 위의 컴파일 단계에서 생성된 op_array이며, 여기서 각 명령을 구문 분석하고 처리합니다. 총 약 150개의 op 명령이 있으므로 이 150개의 명령을 처리해야 합니다. 여기서 매우 흥미로운 질문이 제기됩니다. 이 150개의 명령을 어떻게 처리합니까? 우선, 각 명령에는 처리를 위한 해당 프로세서가 있습니다. 따라서 가상 머신은 op_array의 각 명령 유형에 따라 처리를 위해 해당 프로세서에 배포됩니다.

여기에는 두 가지 작은 질문이 있습니다. 1: 여기서 프로세서는 무엇입니까? 2: 어떻게 배포되나요?

이 두 가지 질문에 대답하려면 배포 메커니즘에서 설명해야 합니다. PHP 가상 머신에서 명령을 배포하는 세 가지 메커니즘이 있습니다: CALL, SWITCH 및 GOTO PHP는 기본적으로 모두 opcode 프로세서인 CALL 메서드를 사용합니다. 함수로 정의되어 가상 머신에 의해 호출됩니다. 이 방법은 전통적인 방법이며 일반적으로 가장 안정적인 방법으로 간주됩니다. SWITCH 방법과 GOTO 방법은 해당 프로세스에 opcode를 배포합니다.

이제 위의 두 가지 질문에 답해 보겠습니다.

1: 프로세서는 실제로 op 명령의 논리를 처리합니다. 명령이 어떻게 배포되는지에 따라 함수 또는 논리 세그먼트의 형태로 존재할 수 있습니다.

2: 배포 방법에는 호출, 전환, 이동의 세 가지가 있습니다. 어느 것이 더 효율적인가요? 사실 위의 설명을 통해 이미 대략적인 이해가 가능합니다. switch와 goto 모두 zend_execute() 함수에 직접 실행될 수 있는 해당 논리 세그먼트를 가지고 있습니다. 호출은 zend_execute() 함수에서 함수 호출을 실행하는 것입니다. 당연한 사실입니다: 함수 호출 효율성이 가장 낮고, 한 번 호출한 후 스택에 푸시해야 합니다! 따라서 효율성 측면에서 콜이 가장 낮습니다. switch 및 goto의 경우: 예를 들어 세 번째 명령의 처리를 실행하려는 경우 switch는 먼저 그것이 처음 두 개인지 판단해야 하지만 goto는 전혀 판단할 필요가 없으며 논리 코드 세그먼트로 직접 점프합니다. 세 번째 실행 명령은 Switch보다 낫습니다. 위에서 아래로 순차적 판단의 손실을 줄이므로 goto 효율성이 switch보다 높습니다. 따라서 전체적인 세 가지 배포 방법은 다음과 같습니다: goto > 컴파일과 실행은 엄격하게 분리되어 있지만 사용자에게는 분리되지 않은 것처럼 보입니다. 왜냐하면 PHP 스크립트 요청을 실행할 때마다 컴파일->실행이라는 두 단계를 실행해야 하기 때문입니다. 빠진 무대가 없습니다. 따라서 이를 C++와 같은 컴파일된 언어와 비교할 수 있습니다. 동일한 요청을 100번 실행합니다.

① C++의 경우 초기 단계에서 한 번만 컴파일하면 되므로 컴파일 후에는 다시 컴파일되지 않고 다음만 수행하면 됩니다. 실행해도 괜찮으므로 손실은 1컴파일 + 100실행

② php의 경우 매번 컴파일 + 실행해야 하므로 손실은 100컴파일 + 100실행

 분명히: 정량적인 관점에서 보면 해석된 언어는 컴파일된 언어보다 훨씬 더 많은 것을 소비합니다. 직설적으로 말하면, PHP 컴파일과 실행의 분리는 실제 분리가 아닙니다. C++ 종류는 실제 분리입니다.

php는 오랫동안 이 문제를 알고 있었기 때문에 이 문제를 해결할 수 있는 방법을 생각해냈습니다. 바로 eAccelerator입니다. 주요 아이디어는 다음과 같습니다.

스크립트가 처음 실행된 후 컴파일된 스크립트는 특정 방식으로 저장됩니다(op_array가 여기에 저장됨). 우리가 지정한 캐시 유효 시간 내에 실행되지 않습니다. 스크립트를 두 번째 실행하면 반복적인 컴파일 작업 대신 이전에 저장한 컴파일된 파일을 직접 호출하여 실행하므로 프로그램 성능이 크게 향상됩니다.

마지막으로 PHP 컴파일과 실행을 분리할 때의 장점에 대해 이야기하겠습니다.

이 장점은 실제로 사용자를 위한 것이 아니라 프로그래머를 위한 것입니다. 이 두 단계가 분리되어 있기 때문에 여기서 하고 싶은 몇 가지 작업을 수행할 수 있습니다.

예를 들어 파일 암호화 및 복호화를 수행하려는 경우 사용자가 소스 코드를 볼 수 없도록 일부 PHP 스크립트 소스 코드 파일을 암호화하려고 합니다. 동시에, 이 암호화된 소스 코드 파일은 PHP 가상 머신에 의해 구문 분석되고 처리될 수 있습니다. 물론, 이를 달성하려면 먼저 암호화 및 암호 해독 알고리즘에 대해 생각하고 이것이 가역적인 프로세스인지 확인해야 합니다.

이제 PHP 소스 코드 파일을 암호화했으므로 이 암호화된 파일의 접미사를 *.buaa로 가정하여 정의해야 합니다. 문제는 PHP 가상 머신이 이 접미사가 붙은 파일을 처리하도록 어떻게 활성화할 수 있는가입니다. 이를 위해서는 위에서 언급한 컴파일과 실행의 분리가 필요합니다.

기억하세요: 컴파일 단계의 입력은 PHP 소스 파일이고 출력은 op_array입니다. 좋아, 이 단계에서는 소란을 피우자. 주요 아이디어는 다음과 같습니다. 먼저 컴파일 함수 zend_compile_file()에서 입력 파일의 접미사를 확인합니다. 일반 .php이면 일반 논리를 따르고, *.buaa이면 먼저 암호를 해독한 다음 따릅니다. 정상적인 논리. . .

결론:

  • PHP는 해석된 언어입니다. PHP 코드는 opcode로 해석된 다음 실행을 위해 Zend 엔진으로 전달됩니다.

  • APC를 사용하여 opcode를 캐시하면 PHP가 이를 opcode로 해석하는 시간이 줄어듭니다.

추천 학습: php 비디오 튜토리얼

위 내용은 PHP가 해석되거나 컴파일되는지 이해하는 데 1분 정도 소요됩니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
php
원천:csdn.net
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿