- 크롬의 엔진인
V8
에 대해서 살펴보자.
V8
은 구글에서 제공하는 오픈소스 자바스크립트 엔진이다. SpiderMonkey
, Rhino
, JavaScriptCore
등의 다른 엔진들도 있다.
- 이런 엔진은 자바스크립트를 CPU가 해석할 수 있는 기계어로 번역해주는 역할을 한다.
V8
엔진은 C++
로 작성됬고 Node.js
와 Chrome
에서 사용된다.
C/C++
와 같은 언어에 비해 자바스크립트는 더 많이 추상화 되어 있어 두 언어에 비해 속도가 느리다. (추상화가 많이 될수록 기계어가 될 떄 까지 더 많은 과정을 거쳐야 하므로)
- 내가 만든 C++함수를 V8엔진에 추가 하는 일도 충분히 가능하다.

- 이런일들이 가능하기 때문에 내가 엔진에 함수를 추가하게 되면 원래의 자바스크립트를 커스텀하는 일도 가능해진다.
- C++은 기본적으로 JS보다 하드웨어에 더 가깝기 떄문에 더 많은 일을 할 수 있다. 따라서, 이 엔진에 함수를 추가해서 JS를 커스텀 한다는것은 강력한 효과를 낼 수 있다.
- Node.js 자체는 V8엔진이고 C++로 구현되어있다.
- 오픈 소스 이기 때문에 내가 엔진을 커스터마이징해서 JS를 확장시킬 수 있다.
(https://github.com/v8/v8/blob/master/samples/shell.cc)
예를들어, JS
에는 없는 Print
라는 함수를 엔진에 추가해놓고 JS
에서 Print()
를 호출하면 정상 동작하게 만들 수 있다.
// 자바스크립트에서 'print' 함수가 호출될 때마다, v8엔진에 의해 콜백이 호출됩니다.
// C++로 구현된 V8엔진에 Print라는 함수를 추가했고, JS에서 가져다 썼다.
void Print(const v8::FunctionCallbackInfo<v8::Value>& args) {
bool first = true;
for (int i=0; i<args.length(); i++) {
v8::HandleScope handle_scope(args.GetIsolate());
if (first) {
first = false;
} else {
print(" ");
}
v8::String::Utf8Value str(args.GetIsolate(), args[i]);
const char* cstr = ToCString(str);
printf("%s", cstr);
}
printf("\\n");
fflush(stdout);
}