자바 스크립트 엔진에

그것은 자바 스크립트 엔진, 친숙하고 이상한 모두 많은 사람들이 올 때. 많은 JS 코드에서 매일 작성하는, 그러나 원리 및 작동 메커니즘에 익숙하지 않지만 때문에. 시스템에 충분한 자원이 결함을 밝혀,하지만 브라우저 나 성능 요구 사항 다른에 호환이있을 때 자른 교부해야 할 수 없습니다. 그래서 엔진의 작동 원리는 여전히 매우 필요하다 이해합니다.

엔진은 무엇을 할 수 있습니까? 개인적으로 컴퓨터를 다시 필드를 느낄 엔진 소프트웨어 컨버터의 일종이다, 당신은 기계 인식 및 명령 작업 라인에 코드를 입력 한 후 출력. 자바 스크립트를 타고, 엔진 기계 언어 서로 다른 환경으로 컴파일 구문 분석 JS 코드에 대한 책임이 있습니다. 언어이기 때문에 엔진 JS 압력의 성능이 매우 클 수 있도록 그러나 동적 자바 스크립트는 컴파일 된 자바, C ++ 등의 언어에 비해, 언어를 해석했다. 따라서, 성능은 현대 JS 엔진을 측정하는 주요 지표 중 하나가 될 것입니다.

이제 주류 JS 엔진은 구글 크롬의 V8 엔진과 JavaScriptCore는이다, 웹킷 코어에 속해 먼저 애플에서 사용하는 웹킷, 그리고 나중에 영향력이 점차 개발하기 위해 많은 기업을 유치 증가했다. 다음 동의 이후 우리는 V8의 성능 최적화 많은 기술의 도입을 볼 수 있도록, 웹킷 밖으로 구글 단독 컷, 자체 브라우저 크롬 시리즈, 고성능의 시리즈를 개발, 동안 JavaScriptCore는 항상 기본 웹킷 코어에 속한 한 반대 엔진은 천천히 반복 최적화합니다. 우리가 그것을보고 특정의 유사점과 차이점은 무엇입니까.

V8 엔진

전체 프로세스 흐름 V8에서 첫번째보기 :

첫 번째 단계는 파서가 추상 구문 트리를 생성하고, 다음 JIT (그냥 시간) 전체 코드 생성기는 지역 코드를 생성을 사용합니다. 여기에서 전체 코드 생성기 (전체 코드 발생기) JavaScriptCore는 결과로부터 JIT 컴파일러 중간 바이트 코드의 다른 부분이,이 설계는 성능 고려 사항이지만, 일부 시나리오보다 소비를 트리거로도 의 계산.

전체 컴파일 된 코드 발생기 후단 결과는 다음과 같이 최종 어셈블리 코드가 생성 달성하는 다른 플랫폼에 의존한다 :

另外值得一提的是V8的内存管理:涉及到如何管理数据分片和垃圾回收。数据层面使用Zone类,这是引擎调度的最小单元,整块的存取删除Zone区域,在Zone内部保存同类型的数据类型。如果要回收也是回收整个Zone内存块,这样做的好处是可以高效的处理一大批类似的操作,比如生成抽象语法树,但缺点也是非常明显,在Zone内的零散数据结构很难被及时清理导致内存消耗上升。

针对内存的垃圾回收V8也是采用了经典的3分类做法,分为年轻分代,年老分代和大对象。如下图所示:

V8中使用句柄来标记对象位置,与指针的区别是句柄一般是操作系统的整数字节,一般是4或8个字节。句柄可以生成对应的指针地址,也可以针对小的整数数据直接保存。

JavascriptCore引擎

作为苹果公司维护的默认webkit引擎,JavaScriptCore引入了很多的苹果公司的技术,例如LLVM、DFG(Data-Flow Graph)JIT编译器。与V8最大的不同在于其在生成抽象语法树后并不直接生成本地代码,而是生成跨平台的字节码:

然后借助类似于Java虚拟机的解释器来解析字节码。

在内存管理这块,JavaScriptCore和V8是类似的,分代策略及Zone的变体JSGlobalData。

综上,V8和JavaScriptCore作为js引擎的代表,在发展的路线上各有特点,但性能都是两者绕不开需要不断完善的一块。随着HTML5标准的推广,更多的视频、webgl渲染等被加入进来,相信不久的将来web引擎的功能将会更加完善。

추천

출처www.cnblogs.com/crazycode2/p/12185389.html