-
QuickJS JavaScript Engine카테고리 없음 2019. 7. 12. 16:41
Bellard 선생님이 또 한건 하셨다.
이 시대의 또하나의 천재인 Bellard님이 작업하신 JavaScript engine인데, 특징은 순수 C 구현, 다른 외부 의존성 없이 190KiB로 binary가 떨어짐, 인터프리터 치고는 상당히 빠른 속도. ES2019 표준을 "거의" 지원, ECMAScript test suite를 모모두 pass함, reference counting방식의 GC, 수학 확장(BigInt, BigFloat 등 지원), CLI interface 지원, C로 native 확장 지원.
이것이 가지는 의미는, 웬만한 SW에 약간의 노력으로 JavaScript scripting을 지원 가능해 졌다는 말이다. 이전에도 DuckTape 같은 작은 Javascript 구현체가 있기는 했지만, 표준 Javascript와의 호환성이 떨어져서 자신있게 도입하기가 어려웠었다. 하지만 표준을 거의 지원하고, 준수하는 놈이 나왔으니, 아주 간단하게 JavaScript scripting을 도입하고(문론 자신 있으면 V8을 붙여도 되는데.. 배보다 배꼽이 백배는 큰 꼴이 된다) 추후에 배가 커지면, 큰 배꼽으로 갈아타는 것이 가능해 졌다는 것이다. 즉, 저기서 돌아가는 코드는 왠만하면 V8에서도 돌아간다것이 보장된다는 말이다.
가끔가다 코딩해 두고, scripting을 넣어 볼까 하다가 lua 말고는 적절한 대안이 없어서 포기한 경우가 많았는데, 이제야 쓸만한게 나와 주었다.
성능은, 문론 JIT가 없는 interpreter 방식이라 V8의 2~3% 정도인 듯 하다.
같은 machine은 아니지만 내 notebook에서 chrome으로 돌린것과 홈 페이지에 공개된 bench-v8 결과 수치를 비교해 보면 아래와 같다.
Engine QuickJS V8 비내 Richards 777 24284 3.19% DeltaBlue 761 46338 1.64% Crypto 1061 19003 5.58% RayTrace 915 59597 1.53% EarleyBoyer 1417 34610 4.09% 에게, 2~3%.. 엄청 느리네.. 하겠지만, 이건 V8 Engine이 얼마나 빠른지를 몰라서 하는 말이고, 저정도면 왠만한 scripting을 하는데에는 지장 없다. 저게 너무 느려서 뭘 못하겟다는 시점이 되면 V8로 바꾸면 된다.
build는 bellard선생답게 make 한방으로 깔끔하게 끝나고, 떨어진 qjs binary를 실행시키면, 대략 아래와 같은 느낌으로 실행된다.
Bellard 선생님, 오랫만에 좋은 선물 감사합니다.
Bellard 선생님이 어떤분인지 궁금하신분은,
여담
이 QuickJS를 사용한 예제라고 달랑 걸어 놓은 link인
는, 무려 Javascript를 지원하는 "계산기"이다. 달랑 계산기 서비스 사이트 하나 만들기 위해, C로 javascript engine을 만들고, 그것을 emscripten으로 javascript로 compile해서, javascript extension을 지원하는 계산기 site를 만들었다. 너무나 대담한 잉여력 아닌가?