인터프리터 (Interpreter)
컴퓨터는 사람이 작성한 고수준의 프로그래밍 코드를 직접 이해할 수 없기 때문에, 이를 기계가 해독할 수 있는 이진 기계어(Binary Code)로 번역하는 과정을 거쳐야 합니다. 이 번역 방식에 따라 프로그래밍 언어는 크게 컴파일러(Compiler) 언어와 인터프리터(Interpreter) 언어로 양분됩니다.
PHP는 대표적인 인터프리터 스크립트 언어입니다.
1. 컴파일러와 인터프리터의 실행 흐름 대조
두 번역 방식이 소스 코드를 읽어 들여 최종 실행 결과를 화면에 출력하기까지 거치는 물리적 단계는 다음과 같은 차이를 지닙니다.
2. 핵심 실행 메커니즘 차이점 대조
| 비교 항목 | 컴파일러 방식 (C, C++, Go 등) | 인터프리터 방식 (PHP, Python, JS 등) |
|---|---|---|
| 번역 시점 | 실행 전 사전 빌드 단계에서 일괄 번역 | 프로그램 실행 요청 시 런타임에 실시간 번역 |
| 산출물 | 기계어가 담긴 독자적 실행 파일 (.exe, .bin 등) |
물리적인 실행 파일 없음 (메모리 상에 임시 로드) |
| 실행 속도 | 사전 기계어 빌드로 인해 실행 시 속도가 매우 빠름 | 매번 구문을 해석하는 오버헤드로 인해 다소 느림 |
| 개발 피드백 | 코드 수정 시 빌드/패키징을 다시 해야 하므로 느림 | 수정 후 저장하고 즉시 실행(새로고침)하여 확인 가능 |
| 배포 방식 | 기계어로 번역된 바이너리 파일만 안전하게 배포 | 소스코드 파일 자체가 고스란히 서버에 배포 |
3. PHP Zend Engine의 내부 실행 4단계 파이프라인
PHP 스크립트(.php)는 엔진에 전달된 뒤 즉시 인터프리팅(해석)되는 것처럼 보이지만, 실제 내부의 핵심 가상 머신인 젠드 엔진(Zend Engine)은 다음과 같이 4단계로 구성된 최적화 파이프라인을 거쳐 코드를 실행합니다.
1) Scanning (어휘 분석 / Lexing)
- 도구:
re2c로 설계된 렉서(Lexer) 사용. - 역할: 소스 코드를 문자열 단위로 한 글자씩 읽어 들여 의미 있는 최소 단위의 단어인 토큰(Tokens) 배열로 분리합니다. 예를 들어,
<?php echo $val;은T_OPEN_TAG,T_ECHO,T_VARIABLE과 같은 토큰 상수로 쪼개집니다.
2) Parsing (구문 분석)
- 도구:
Bison으로 구현된 파서(Parser) 사용. - 역할: 쪼개진 토큰들이 문법 규칙에 부합하는지 검사하면서, 코드의 의미적 연계성을 갖춘 트리 구조인 AST (Abstract Syntax Tree, 추상 구문 트리)를 생성합니다. (PHP 7.0부터 AST가 도입되어 컴파일러 성능과 코드 최적화 가능성이 비약적으로 증가했습니다.)
3) Compilation (바이트코드 컴파일)
- 역할: 가상 머신이 바로 해독할 수 있는 중간 번역 형태인 젠드 오피코드(Zend Opcodes / 바이트코드) 목록으로 AST를 변환합니다. 오피코드(Opcode)는 가상 CPU 명령어 모음집에 해당하며, OS 종류에 종속되지 않는 독립적인 사양을 가집니다.
4) Execution (실행)
- 역할: 젠드 가상머신(Zend VM)이 오피코드를 루프를 돌며 하나씩 CPU 명령어로 즉석 해석하여 실행한 후, 최종 처리 결과를 동적으로 리턴(HTML 렌더링 등)합니다.
4. 현대 PHP의 성능 비약과 튜닝 기술
1) 젠드 오피캐시 (Zend OpCache) 연계
인터프리터 언어 특성상 동일한 스크립트를 요청할 때마다 Scanning -> Parsing -> Compilation을 반복하는 구조는 엄청난 연산 중복과 오버헤드를 야기합니다.
PHP는 이를 방지하고자 OpCache 기술을 활용합니다. 최초 실행 시 컴파일이 완료된 Opcodes(바이트코드)를 가상 메모리 영역에 캐싱해 두어, 이후 요청에는 소스 변환 프로세스를 전부 생략하고 곧바로 Execution(실행) 단계로 직행하도록 만들어 실행 속도를 컴파일러 언어 수준으로 끌어올립니다.
2) JIT (Just-In-Time) 컴파일러의 도입 — [PHP 8.0+]
Zend VM 가상머신은 인터프리터 루프를 돌며 매번 오피코드를 CPU 명령어로 통역해야 합니다. PHP 8.0부터는 이 과정을 완전히 생략하는 JIT 컴파일러가 내장되었습니다. JIT 컴파일러는 실행 빈도가 높은 핫스팟 코드(Hot Opcodes)를 식별하여 가상머신 해석 없이 CPU가 다이렉트로 수행할 수 있는 로컬 기계어(x86, ARM 등)로 실시간 컴파일해 가속합니다. 이를 통해 웹 앱의 비즈니스 로직 연산이나 머신러닝, 수학적 연산 처리 성능이 수배 이상 폭발적으로 증대되었습니다.