HHVM(hiphop virtual machine) for PHP

현재 서버사이드 언어들 중 가장 인기있는 언어는 단연 php로, w3techs의 조사에 의하면 무려 80%가 넘는 점유율을 가지고 있다. 그 인기에 걸맞게 php의 성능을 향상시키려는 노력도 꾸준히 있어왔는데, 오늘은 그중에서 facebook 이 만든 php 컴파일러이자 가상머신인 HHVM (HipHop Virtual Machine)에 대해 알아보고자 한다

HHVM이 어떻게 동작하는지를 알기 위해 먼저 컴파일드 언어와 인터프리티드 언어에 대해서 알아보자.

컴파일드 언어 vs 인터프리티드 언어

컴파일드 언어 (compiled language)

컴파일드 언어는 기계어로 컴파일 되는 언어이다. 프로그래머가 작성한 코드는 "컴파일러" 라는 프로그램에 의해 "컴파일" 이라는 과정을 거치게 된다. 이렇게 컴파일된 언어는 컴퓨터가 알아볼기 쉽게 기계어로 변환이 되서 실행이 된다.

인터프리티드 언어 (interpreted language)

인터프리티드 언어는 위에 언급한 "컴파일" 과정이 필요없는 언어이다. 대신 인터프리터(interpreter)라는 프로그램이 프로그래머가 작성한 코드 한줄한줄이 실행 될때마다 그에 대응되는 native 코드로 변환을 한후 실행을 시킨다.

장점, 단점

컴파일드 언어는 컴파일 중에 최적화 과정을 거치기 때문에 실행되는 속도가 매우 빠르다는 장점이 있지만 반드시 컴파일 과정을 거쳐야 하므로 프로그래머 입장에서 번거로울수도 있다. (프로그램 규모에 따라서 컴파일 시간이 매우 길어지기도 한다) 인터프리티드 언어는 컴파일 과정이 필요 없지만 실행 속도가 상대적으로 느리다는 단점이 있다.

컴파일드 언어에는 C, Pascal, GO 등이 있고 인터프리티드 언어는 PHP, Javascript, Python, Ruby등이 있다.

Java 와 같이 두가지 특징을 모두 가지고 있는 언어도 있는데, java코드는 컴파일 과정에서 JVM(Java Virtual Machine) 에 최적화 되어있는 bytecode 로 변환되고 실행되는 시점에 JVM에 의해 native 코드로 다시 변환되서 실행된다.

PHP 구동 환경

앞서 말했다시피 php 언어는 인터프리티드 언어이기 때문에 실행이 되기 위해서는 Zend Engine 이라는 php interpreter가 반드시 설치되어 있어야 한다. 이 Zend Engine은 cgi인터페이스를 통해 웹서버와 통신하는데, 요청이 들어오면 php코드를 opcode로 변환(interpreting)한후 실행 결과를 반환한다.

php 구동 환경

HipHop for PHP

한편 php를 주력 언어로 사용하고 있는 facebook은 facebook.com 웹사이트의 실행속도를 빠르게 하기 위해 php를 c++로 변환하는 번역기인 hiphop for php를 개발하고 2010년 발표와 함께 오픈소스로 공개했다. php인터프리터인 Zend를 사용하지 않고 hiphop 을 이용해 c++코드로 변환한후 이것을 컴파일 해서 성능을 개선시키기 위함이었다. 발표에 따르면 이 hiphop을 도입함으로서 페이스북 사이트가 기존 Zend Engine을 사용했을 때보다 최대6배 빨라졌다고 한다.

하지만 이 hiphop은 일반 사이트에서 사용하기에는 어려움이 많았는데, 그 예로 eval() 함수 같은 dynamic feature들은 사용하지 못했고, 웹서버가 내장되어 있어서 다양한 기능을 제공하는 apache 에 익숙해져 있는 시스템 관리자에게 그다지 친숙하지 않았다.

HHVM (HipHop Virtual Machine)

그러던중 페이스북에서는 hiphop의 업그레이드 버전이라고 할수 있는 HHVM을 2011년 12월에 발표한다. 기존의 hiphop이 php를 c++로 변환해주는 번역기 였다면 이 HHVM은 JIT(Just-In-Time) 컴파일러라고 할수 있겠다. 여기서 just-in-time 컴파일러라는 것은 실행시간에 컴파일이 필요해지면 컴파일을 실행을 한다는 의미다. (실행전에 미리 컴파일을 하는 것이 아니다)

즉 HHVM은 해당 php코드를 실행해야되는 시점에 hhbc(hiphop bytecode)로 컴파일 하고, hhbc는 HHVM위에서 native code로 실시간 변환된다(눈치챈 사람도 있겠지만 Java/JVM 모델과 유사하다). 이때 생성된 hhbc는 HHVM에 내장된 sqlite를 통해 캐싱된다. 이 HHVM은 hiphop에 비해 40~60% 성능이 향상되었고, 현재 버전의 php 기능들(dynamic feature포함)을 대부분 지원 하는등 많은 면에서 발전을 이루었다. 또한 기존 hiphop을 쓰기 위해서는 웹서버를 hiphop 자체 내장된 서버로만 써야했던 반면 HHVM에는 최근 fastcgi를 지원해서 웹서버 위에서 돌아가도록 구성하는 것도 가능해졌다.

HHVM의 미래

2013년 후반 php의 창시자 Rasmus Lerdorf는 "HHVM이 충분히 범용적이 되면, 아마도 다음 php엔진이 될수도 있을것"이라고 말했다. 하지만 이어서 "지금은 아직 갈길이 멀고, 적어도 2~3년은 더 걸릴것"이라고도 했다. 내 생각에도 현재는 설치도 불편하고 100% 호환이 안되기 때문에 당장 일반적인 사이트에서 사용하기에는 문제가 많이 있다. 하지만 연구를 통해 점점 사용성이 높아진다면 앞으로 php 언어의 인기는 더욱 높아지지 않을까 생각한다.