예전에 여러번 포스트했던 JägerMonkey(이후 JM)에 관한 글에 관한 글들이 있긴 하지만, Mozilla의 JM작업의 사용된 기술 중 일부분에 대해 잘못된 오해를 갖고 있는 것 같습니다. 그래서 우리가 무엇을 사용하는지, 여러가지 각 부분들이 무엇을 하고 어디에서 왔는지에 대해 아무 간략하게 살펴 보고자 합니다.
1. SpiderMonkey. 이것은 Mozilla의 자바스크립트 인터프린터 코어 입니다. 이 엔진은 원시 자바스크립트를 중간 바이트 코드로 변환 한 후, 바이트 코드를 해석합니다. SpiderMonkey는 Firefox 3 와 그 이전 버전에서 모든 자바스크립트를 처리하는 역할을 맡고 있었습니다. Firefox 3.5, 3.6과 그 후 릴리스하게 될 버전에서 작업 했던 많은 것을 기반으로 하여, 우리는 계속해서 이 엔진을 개선시켜 나갈 것 입니다.
2. 추적기능. 추적기능은 Firefox 3.5 이전에 추가되었으며, 성능을 크게 향상 시키기 위한 책임을 갖고 있었습니다 (비록 일부는 SpiderMonkey 엔진의 근본적인 개선을 위한 이유 때문이긴 했지만 말입니다).
이것이 추적기능이 하는 일 입니다.
- 해석된 자바스크립트 코드가 한번 이상 사용 된 코드 경로를 찾아 실행하는 동안 모니터링 합니다.
- 한 번 이상 사용된 코드의 조각을 찾고, 그 코드를 최적화 합니다.
- 최적화된 내용을 기계 코드에 결합하뒤 실행합니다.
우리는 Firefox 3.5 이후로 완전한 추적 모드에 있을 때 정말 정말 빠르다는 것을 발견 했습니다. SpiderMonkey로 되돌아 가거나, 해석과 기록을 해야 할 때는 느립니다.
추적기능의 어려운 부분 중 한 가지는, 빠르게 실행하는 코드를 생성 하는 것 입니다. 이것은 Nanojit이라는 코드 조각에 의해 이루어 지는데요. Nanojit은 원래 Tamarin 프로젝트의 일부 였던 코드의 조각입니다. Mozilla는 다음 두 가지 이유 때문에 Tamarin의 대부분을 사용하지 않습니다: 1. 우리는 ECMAScript 4를 탑재하지 않았으며, 2. Tamarin의 인터프린트 부분은 SpiderMonkey보다 더 느리기 때문 입니다. 우리는 Firefox 3.5를 위해 Nanojit의 가장 좋은 부분을 채택했으며, SpiderMonkey로 다시 되돌아가지 않기 위해 노력 했습니다.
Nanojit은 다음의 두 가지 일을 합니다: 자바스크립트의 상위 수준 표현(high level representation)을 구현하고 최적화 하며, 또한 어셈블러를 최적화 된 표현과 기계 수준의 실행에 대한 네이티브 코드 생성하는 것 입니다.
Mozilla와 Adobe는 계속해서 Nanojit을 공동으로 작업하고 있습니다. Adobe는 ActionScript VM의 일부로 Nanojit을 사용합니다.
3. 니트로 어셈블러(Nitro Assembler)는 실행을 위해 원시 코드를 생성하는 코드 조각이며, 웹킷의 Apple 버전에서 가져왔습니다. 니트로 어셈블러는 Nanojit과 매우 다릅니다. Nanojit은 높은 수준의 표현을 하면서, 성능 최적화나 코드 생성등을 하는 반면, 니트로 어셈블러는 단순히 코드 생성만을 합니다. 낮은 수준의 코드이기 때문에 복잡 하지만, Nanojit과 동일한 작업을 하지는 않습니다.
우리는 자바스크립트를 컴파일하는데 (많은 개선이 이루어진) 니트로 어셈블러를 사용하고 있습니다. JS 코드 추적을 위해 Firefox 3.5에서 사용할 수 있도록 할 예정이며, 보다 나은 성능을 위해 코드 추적을 할 수 있도록 하여 다른 가상머신처럼 실행할 수 있는 네이티브 코드를 SpiderMonkey가 생성할 수 있도록 할 예정입니다.
이 글이 우리가 사용하는 작은 기술이 무엇인지, Firefox의 JS 성능이 어떤 식으로 최적화 되는지를 이해하는데 도움이 되길 바랍니다.
원저자: Christoper Blizzard – 원문으로 가기
작성자: Jade Won
안녕하세요~
댓글이 없습니다.