>백엔드 개발 >PHP 문제 >PHP는 해석된 언어인가요, 아니면 컴파일된 언어인가요?

PHP는 해석된 언어인가요, 아니면 컴파일된 언어인가요?

醉折花枝作酒筹
醉折花枝作酒筹앞으로
2021-05-26 17:12:233543검색

이 글에서는 PHP의 언어 유형을 소개합니다. 도움이 필요한 친구들이 모두 참고할 수 있기를 바랍니다.

PHP는 해석된 언어인가요, 아니면 컴파일된 언어인가요?

컴파일된 언어

  • 특수 컴파일러(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 > switch > call

여담: php는 기본적으로 호출을 사용하므로 php의 성능을 더욱 짜내려면 명령 배포 방법을 goto로 변경할 수 있습니다. 그러나 goto 메소드를 사용하면 실행 속도가 향상되지만 실제로 컴파일 속도는 가장 느립니다.

-------------------------------------- ------------------------------------- ----------------------------------------

PHP 분리의 약점에 대해 이야기해 보겠습니다. 컴파일 및 실행:

사실 이는 약점이라고 볼 수 없습니다. zend 엔진(php의 가상 머신)은 컴파일과 실행을 엄격하게 분리하지만 사용자 입장에서는 분리가 없는 것처럼 보입니다. PHP 스크립트 요청이 실행되면 컴파일->실행의 두 단계가 있습니다. 빠진 무대가 없습니다. 따라서 이를 C++와 같은 컴파일된 언어와 비교할 수 있습니다. 동일한 요청을 100번 실행합니다.

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

1 컴파일 + 100 실행

②php의 경우 매번 컴파일 + 실행해야 하므로 손실은 다음과 같습니다.

100 컴파일 + 100 실행

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

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

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

이 방법은 PHP의 효율성을 어느 정도 향상시키지만 궁극적인 방법은 아닙니다. 궁극적인 방법은 컴파일된 언어로 변경하는 것입니다. ㅎㅎ~~~

--------- --- --------------------- --- --------------------- --- -------------------------------------

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

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

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

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

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

하~ 참 간단해요. 물론 이 프로세스는 말한 것처럼 간단하지 않으며 zend_compile_file() 함수를 직접 수정할 수 없습니다. 결국 이 프로세스를 처리하려면 모듈을 직접 확장하고 구현해야 합니다.

결론:

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

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

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

위 내용은 PHP는 해석된 언어인가요, 아니면 컴파일된 언어인가요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 csdn.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제