2009-12-11 4 views
8

예를 들어, Chrome이 자바 스크립트 파일을 다운로드하면 해석되고 JITed됨을 알고 있습니다.Javascript가로드시 파싱/해석됩니까? (IE)

제 질문은 IE6,7,8에서 Javascript 파일을 다운로드 할 때 전체 구문을 해석하고 해석합니까?

내 이해는 최상위 함수 서명과 전역 범위에서 실행 된 모든 항목 만로드시 구문 분석된다는 것이 었습니다. 그런 다음 함수 몸체와 나머지는 실행시 파싱되었습니다.

로드가 완전히 파싱 된 경우 나중에 시간을 절약하면 기능 본문을 다운로드하여 나중에 구문 분석하도록 연기했다고 생각합니까?

+0

작은 nitpick, 흠 나는 정정을 의미한다. V8 * 절대로 * 해석하지 않는다. * 항상 * 원시 코드로 컴파일한다. 인터프리터도 가지고 있지 않으며 네이티브 코드 컴파일러 만 가지고 있습니다. –

+0

@ Jörg W Mittag 예, 저는 구문 분석/해석/실행이라고 가정합니다. 이 두 가지는 본질적으로 동일합니다 : interpret/execute – Adam

답변

2

예, <script> 태그를 사용하면 모든 브라우저에서 리소스 다운로드가 페이지의 다른 모든 항목 (CSS 다운로드, 다른 JS 다운로드, 렌더링)을 차단합니다.

처음부터 또는 페이지 전체에서 모든 자바 스크립트를로드하는 경우 요청이 약 50ms이고 라이브러리 파일 또는 이와 유사한 항목에 대한 구문 분석이 100ms 이상일 수 있으므로 딸꾹질이 표시됩니다. 100ms는 표준으로 사용되며, 그 중 큰 것이 사용자에 의해 "지연"으로 나타납니다.

시간 절약은 무시할 만하지만 페이지가로드 될 때 일시 중지되면 사용자 경험이 약간 손실되는 경우 상황에 따라 크게 달라질 수 있습니다.

많은 기사와 로딩 및 구문 분석 지연의 이점에 대한 훌륭한 설명은 LABjs' site을 참조하십시오.

5

로드시 완전히 구문 분석됩니다. (IE는 각 함수 몸체가 끝나는 지점을 알아 내기 위해 스크립트를 구문 분석해야합니다.) 오픈 소스 구현에서 모든 함수는 바이트 코드 또는 심지어 머신 코드로 컴파일되고 IE가 같은 방식으로 작동한다고 상상합니다 .

실제로 너무 느리게로드되는 페이지가 있고 아마도 사용하지 않을 스크립트 100K로드를 지연 할 수 있다면로드 시간에 도움이 될 수 있습니다. 아니면 아래의 업데이트를 참조하십시오.

은 (퀴즈 :. 스파이더 같은 JS 벤치 마크는 일반적으로 코드를 분석하고 컴파일하는 데 걸리는 시간을 측정하지 않음)

UPDATE -이 대답을 게시 이후 상황이 변경되었습니다! 구현시에는 표준에서 요구하는대로 적어도 ScriptArrors를 감지 할 수있을만큼로드 할 때마다 각 스크립트를 구문 분석합니다. 그러나 그들은 처음 컴파일 될 때까지 컴파일 기능을 연기하기도합니다.

+0

업데이트 소스를 공유 할 수 있습니까? –

+1

[SpiderMonkey 소스 코드는 여기에 있습니다.] (http://hg.mozilla.org/mozilla-central/file/tip/js/src/). Parser 클래스는 즉시 컴파일 ('Parser ')을 위해 AST를 생성하거나 구문 오류만을 감지 할 수있는 템플릿 ('Parser ')이다. 런타임에 컴파일되지 않은 함수가 호출되면'js :: frontend :: CompileLazyFunction'이 호출됩니다. –

+0

아, 고마워요! –

3

함수를 정의하는 것은 실제로 작업이므로 예, 전체 javascript 파일이 구문 분석되고 모든 최상위 작업이 해석됩니다. 함수 내부의 코드는 호출 될 때까지 실제로 실행되지 않지만 구문 분석됩니다.

예를 들어

:

var i=0; 
var print = function(a) { 
    document.getElementById('foo').innerHtml = a; 
} 

모든 것은 위의 예에서 구문 분석됩니다, 라인 1과 2가 실행 얻을. 그러나 3 번 줄은 호출 될 때까지 실행되지 않습니다.

스크립트 태그를 맨 위 대신 HTML 하단에 놓는 등 사용자와 함께 할 수있는 "지각 적 게임"은 거의 없으므로 브라우저가 페이지 상단을 렌더링하기 전에 맨 위를 렌더링합니다 다운로드하고 자바 스크립트를 구문 지침. 함수 정의를 문서로 푸시 할 수도 있습니다.onload 함수를 사용하여 전체 페이지가로드되고 메모리에 저장 될 때까지 실행되지 않도록합니다. 그러나 자바 스크립트가 비주얼 스타일을 물건에 적용하는 경우 (예 : jQuery UI와 같은) "스타일없는 플래시"가 발생할 수 있습니다.

+0

로 해석하면 실행 된 것입니까? – Adam

+0

예. 인터넷 익스플로러가 뭐라 할 지 모르겠다. –

+0

그것이 맞는다면 그것은 흥미 롭습니다. 필자는 다음 번에 함수가 호출 될 때 성능상의 이유로 그냥 jitting을 수행 할 것이라고 생각합니다. 나는 순수한 해석이 느리다는 생각은 오래된 생각이다. – ChrisDiRulli

1

"다운로드"란 무엇을 의미합니까? 태그가 포함되어 있거나 XMLHttpRequest를 통해 다운로드 할 때?

스크립트로 포함하는 것을 의미하면 IE는 모든 js 파일을 한 번에 해석합니다. 그렇지 않으면 해당 파일에서 함수를 호출하거나 구문 오류 메시지를 볼 수 없습니다.

XMLHttpRequest로 다운로드하려는 경우 파일 내용을 직접 평가해야합니다.

+0

스크립트 태그 사용 – Adam