HHVM
1. 개요
HHVM(HipHop Virtual Machine)은 페이스북에서 개발한 PHP 및 Hack 언어용 가상 머신이다. PHP 실행 환경으로 시작했지만, 페이스북은 Hack 언어의 등장과 PHP 7의 성능 개선으로 인해 2018년 9월 PHP 지원을 단계적으로 종료했다. HHVM은 HHBC(HipHop ByteCode)와 JIT 컴파일을 사용하여 네이티브 코드를 생성함으로써 웹 서버의 처리량 증가와 지연 시간 감소를 가능하게 한다.
-
페이스북 소프트웨어 -
페이스북 메신저
페이스북 메신저는 2008년 페이스북 채팅으로 시작하여 2011년 독립적인 모바일 앱으로 출시된 페이스북의 인스턴트 메시징 서비스로, 다양한 기능 추가와 논란 속에서도 꾸준히 성장하여 2020년에는 메신저 룸을 출시하고 COVID-19 팬데믹 기간 동안 메시지 트래픽이 크게 증가했다. -
페이스북 소프트웨어 -
리액트 (자바스크립트 라이브러리)
리액트는 사용자 인터페이스 구축을 위한 자바스크립트 라이브러리이며, 선언적 UI, 컴포넌트 기반 개발, 가상 DOM 등의 특징을 가지고 있으며 JSX 문법을 사용하여 UI를 정의하고, 리액트 네이티브를 통해 네이티브 앱 개발에도 활용된다. -
가상 머신 -
V8 (자바스크립트 엔진)
V8은 구글이 개발한 오픈 소스 자바스크립트 엔진으로, 자바스크립트 코드 실행 속도 향상을 위해 여러 컴파일러를 거쳐 크롬, 노드.js 등에서 활용된다. -
가상 머신 -
X86 가상화
X86 가상화는 x86 아키텍처 기반 시스템에서 가상 머신을 구현하는 기술로, 소프트웨어 기반 가상화와 하드웨어 지원 가상화로 나뉘며, CPU 제조사의 가상화 확장 기술을 활용하여 가상 머신의 성능을 향상시킨다. -
C++ 소프트웨어 -
구글 크롬
구글 크롬은 구글이 개발한 웹 브라우저로, 크로미엄 프로젝트를 기반으로 오픈 소스 코드를 활용하여 개발되었으며, 다양한 기능과 운영체제 지원을 통해 세계 시장 점유율 1위를 기록하지만 개인 정보 보호 정책으로 비판을 받기도 한다. -
C++ 소프트웨어 -
윈도우 폰 8
윈도우 폰 8은 2012년 말에 출시된 마이크로소프트의 모바일 운영 체제로, 윈도우 NT 커널을 기반으로 윈도우 8과 구성 요소를 공유하며, 다양한 기능을 제공하고 2016년 1월 12일까지 소프트웨어 지원이 제공되었다.
2. 역사
HHVM은 페이스북에서 PHP를 C++로 변환하는 트랜스파일러인 HipHop for PHP(HPHPc) PHP 실행 엔진의 후속으로 만들어졌다.
JIT 컴파일 원칙에 따라 HHVM은 먼저 실행되는 코드를 중간 언어인 고급 바이트코드인 HHBC로 변환한다. HHBC는 HHVM을 위해 특별히 만들어진 바이트코드 형식으로, 인터프리터와 JIT 컴파일러 모두에서 사용할 수 있다. 다음으로 HHVM은 HHBC를 x86-64 기계어로 동적으로(실시간으로) 변환하고, 변환된 바이트코드의 동적 분석을 통해 최적화한다. 마지막으로 x86-64 기계어를 실행한다. 결과적으로 HHVM은 공통 언어 런타임(CLR, C# 언어용) 및 자바 가상 머신(JVM, 자바 언어용)을 포함한 다른 프로그래밍 언어에서 사용되는 가상 머신과 특정 유사성을 갖는다.
HHVM은 HPHPc에 비해 많은 이점을 제공하는데, 프로덕션 및 개발 환경 모두에서 동일한 실행 엔진을 사용하며, 두 환경 모두에서 실행 엔진과 HPHPd 디버거 간의 통합을 지원한다. HPHPc에서는 HPHPi(HipHop 인터프리터)를 개발 유틸리티로 별도로 유지 관리해야 했지만, HHVM에서는 그럴 필요가 없어졌다. 또한 4.0 이전 버전의 HHVM은 PHP 5.4의 공식 구현에서 정의된 전체 PHP 언어를 거의 완벽하게 지원하며, HPHPc에서 불가능했던 `create_function()` 및 `eval()` 구문도 지원한다.
2.1. HPHPc의 한계
HipHop for PHP(HPHPc)는 성능 향상의 정체, PHP 언어의 모든 기능을 지원할 수 없는 근본적인 한계, 개발 및 배포 프로세스의 어려움 등 여러 가지 문제점을 안고 있었다. 특히, HPHPc는 `create_function()`이나 `eval()`과 같이 동적으로 코드를 생성하고 실행하는 기능을 지원하지 않아 일부 PHP 응용 프로그램과의 호환성 문제가 발생했다.
2.2. HHVM의 개발 및 도입
HipHop for PHP(HPHPc)를 통해 얻은 경험과 HPHPc가 야기한 문제들을 해결하기 위해 메타(옛 페이스북)는 2010년 초 JIT 기반 PHP 가상 머신 개발을 시작했다. HPHPc와 관련된 문제로는 성능 향상의 정체, PHP 언어의 모든 기능을 지원할 수 없는 근본적인 한계, 개발 및 배포 프로세스에 많은 시간과 자원이 소모된다는 점 등이 있었다. 2013년 1분기에 facebook.com 웹사이트의 프로덕션 버전은 HPHPc 사용을 중단하고 HHVM으로 전환했다.
HHVM은 HPHPc에 비해 많은 이점을 제공한다. HHVM은 프로덕션 환경과 개발 환경 모두에서 동일한 실행 엔진을 사용하며, 두 환경 모두에서 실행 엔진과 HPHPd 디버거 간의 통합을 지원한다. 따라서 HPHPc에서처럼 HPHPi(HipHop 인터프리터)를 개발 유틸리티로 별도로 유지 관리할 필요가 없어졌다. 또한 HHVM은 HPHPc에서 필요했던 긴 빌드 과정을 제거하여 HPHPc보다 훨씬 간단한 개발 및 배포 프로세스를 제공한다.
2.3. Hack 언어의 등장
2014년, HHVM 3.0과 함께 메타는 PHP의 파생 언어인 Hack을 출시했다. Hack은 동적 타이핑과 정적 타이핑(점진적 타이핑)을 모두 사용할 수 있게 해주며, 함수 인수, 함수 반환값 및 클래스 속성에 대한 타입을 지정할 수 있다. 그러나 Hack은 `goto` 문과 동적 변수 이름과 같은 몇 가지 PHP 기능을 제거하여 PHP와의 완전한 하위 호환성을 제공하지 않는다.
2.4. PHP 지원 중단
2017년 9월, HHVM은 버전 3.30을 마지막으로 PHP를 공식적으로 지원을 중단하고, 앞으로 Hack만 지원할 것이라고 발표했다. 이는 PHP 7과의 차이점과 비호환성 때문이었다. 사용자에게는 Hack 또는 PHP 7이나 다른 PHP 실행 환경으로 이전할 것을 권장했다. 2019년 2월 12일, 예정대로 PHP 지원을 종료한 HHVM 4.0이 출시되었다.
3. 작동 원리
HHVM은 JIT (Just-In-Time) 컴파일 원칙에 따라 PHP 또는 Hack 코드를 중간 언어인 HHBC로 변환한다. 그 후 HHBC는 x86-64 기계어로 동적으로(실시간으로) 변환되며, 이 과정에서 최적화가 이루어진다. 최종적으로 x86-64 기계어가 실행된다. 이러한 작동 방식은 공통 언어 런타임(CLR, C# 언어용) 및 자바 가상 머신(JVM, 자바 언어용)과 같은 다른 프로그래밍 언어에서 사용되는 가상 머신과 유사한 점이 있다.
3.1. HHBC (HipHop ByteCode)
JIT 컴파일 원칙에 따라 HHVM은 실행되는 코드를 중간 언어인 고급 바이트코드 HHBC로 변환한다. HHBC는 HHVM을 위해 특별히 만들어진 바이트코드 형식으로, 인터프리터와 JIT 컴파일러 모두에서 사용될 수 있다. HHVM은 HHBC를 x86-64 기계어로 동적으로(실시간으로) 변환하고, 변환된 바이트코드의 동적 분석을 통해 최적화한다. 마지막으로 x86-64 기계어를 실행한다. 결과적으로 HHVM은 공통 언어 런타임(CLR, C# 언어용) 및 자바 가상 머신(JVM, 자바 언어용)을 포함한 다른 프로그래밍 언어에서 사용되는 가상 머신과 특정 유사성을 갖는다.
3.2. JIT 컴파일
JIT 컴파일 원칙에 따라 HHVM은 먼저 실행되는 코드를 중간 언어인 고급 바이트코드인 HHBC로 변환한다. HHBC는 HHVM을 위해 특별히 만들어진 바이트코드 형식으로, 인터프리터와 JIT 컴파일러 모두에서 사용할 수 있다. 다음으로 HHVM은 HHBC를 x86-64 기계어로 동적으로(실시간으로) 변환하고, 변환된 바이트코드의 동적 분석을 통해 최적화한다. 마지막으로 x86-64 기계어를 실행한다. 결과적으로 HHVM은 공통 언어 런타임(CLR, C# 언어용) 및 자바 가상 머신(JVM, 자바 언어용)을 포함한 다른 프로그래밍 언어에서 사용되는 가상 머신과 특정 유사성을 갖는다.
JIT 컴파일 과정에서 HHVM은 PHP 또는 Hack 코드를 HHBC라는 바이트코드 형태의 중간 언어로 변환한다. HHBC는 HHVM을 위해 설계된 바이트코드이며, JIT 컴파일러와 인터프리터에서 모두 사용할 수 있다. 그리고 HHBC는 바이트코드 수준에서 최적화가 이루어지고, x64 기계어로 즉시(JIT) 컴파일되어 CPU가 직접 실행한다. 이러한 실행 과정은 .NET Framework의 공통 언어 런타임이나 Java의 자바 가상 머신과 같은 다른 언어의 가상 머신과 공통점이 있다.
3.3. 다른 가상 머신과의 유사성
HHVM의 실행 과정은 .NET Framework의 공용 언어 런타임(CLR, C# 언어용)이나 자바 가상 머신(JVM, 자바 언어용)과 같은 다른 프로그래밍 언어에서 사용되는 가상 머신과 유사하다. JIT 컴파일 과정에서 HHVM은 PHP 또는 Hack 코드를 HHBC라는 바이트코드 형태의 중간 언어로 변환한다. HHBC는 HHVM을 위해 설계된 바이트코드이며, JIT 컴파일러와 인터프리터 모두에서 사용할 수 있다. 그리고 HHBC는 바이트코드 수준에서 최적화가 이루어지고, x64 기계어로 즉시(JIT) 컴파일되어 CPU가 직접 실행한다.
4. 성능
HHVM은 실행 환경을 제공하는 프로세스 가상 머신으로, 실시간 형식 정보를 사용하여 더 효율적인 네이티브 코드를 생성할 수 있다. 이는 웹 서버의 처리량을 높이고 지연 시간을 낮춘다. 2012년 4분기에 facebook.com의 소스 코드를 HHVM에서 실행한 결과 HPHPc와 성능이 동등해졌으며, 2013년 12월에는 HPHPc보다 약 15% 더 빨라졌다.
웹사이트에서 사용자는 페이지 표시 속도에 민감하며, 웹 서버의 지연 시간이 0.5초 미만이라도 사용자 경험에 심각한 악영향을 미쳐 사이트 효과를 크게 저하시키는 것으로 알려져 있다.
5. 한국 웹 개발 환경에의 시사점
HHVM은 페이스북과 같이 대규모 사용자 기반을 가진 서비스나 온라인 게임 등 트래픽 처리가 중요한 한국 웹 서비스 환경에서 성능 향상을 위한 기술적 대안이 될 수 있었다. 그러나 2018년 9월, 페이스북은 자체 개발 프로그래밍 언어인 Hack의 등장과 PHP 7의 개선된 성능을 이유로 HHVM의 PHP 지원을 단계적으로 종료한다고 발표했다. PHP 지원은 HHVM 3.30 버전까지였으며, 2019년 2월 12일 출시된 HHVM 4.0 버전에서는 PHP 지원이 완전히 중단되었다. 이에 따라 기존 PHP 기반 시스템을 운영하는 기업들은 Hack 언어로 전환하거나 PHP 7 등 다른 PHP 실행 환경으로 이전해야 하는 상황에 놓였다.