Javascript компилирует или интерпретирует с двумя проходами? - PullRequest
5 голосов
/ 31 августа 2011

Я признанный начинающий программист JavaScript и пытаюсь узнать больше.Поэтому я обращаюсь к вам, ребята за помощью, с этим простым вопросом :).Книга О'Рейли, которую я читаю, постоянно ссылается на время компиляции кода JavaScript.Мои знания в области функционального программирования (схемы и тому подобное) говорят мне, что JavaScript на самом деле интерпретируется браузером, и, скорее всего, требуется два прохода через JavaScript.

Я ошибаюсь в своей оценке?Или время компиляции, на которое ссылается книга, - это всего лишь первый проход интерпретатора, похожий на то, как будут функционировать Perl или Python?Спасибо!

Ответы [ 3 ]

11 голосов
/ 31 августа 2011

Это зависит от браузера.Посмотрите на SquirrelFish Extreme и Google V8 от WebKit, чтобы увидеть, что является самым быстрым достижением, и посмотрите на JaegerMonkey в Mozilla для этой реализации.

AFIAK V8 и SFX являются JIT, поэтому они компилируют код JS в нативный.JaegerMonkey и TraceMonkey объединяются в Firefox, образуя систему, в которой, если код будет отслеживаться быстрее, TraceMonkey выполняет его, а если код был быстрее собственного, JaegerMonkey компилирует его, как SFX.

0 голосов
/ 31 августа 2011

В JS есть время чтения и время выполнения (как мне нравится думать об этом, так как он на самом деле не скомпилирован, а интерпретирован). Похоже, что книга О'Рейли использует время компиляции как синоним времени чтения.

Время чтения - это когда механизм читает весь код и оценивает все в глобальной области видимости. Обычно это устанавливает ловушки для событий, которые будут запускать выполнение кода.

Время выполнения - это все остальное.

0 голосов
/ 31 августа 2011

У вас есть предложение, которое вы могли бы процитировать, чтобы помочь с контекстом?

Javascript скомпилирован в браузере (он отправляется в браузер в виде простого источника).Но это только скомпилировано, поскольку это загружено.Так что если у вас есть тег script, за которым следует тег div, за которым следует тег script, он будет загружать эти вещи последовательно.Браузер прекратит загрузку всей страницы (он по-прежнему загружает ресурсы, просто не загружает HTML), пока ваш скрипт не будет загружен (это потому, что в скрипте может быть «document.write» внутри).

<script>
var someVariable = 'hello world';
alert(document.getElementById('someid')); //alerts undefined
</script>

<div id='someid'></div>

<script>
alert(document.getElementById('someid')); //alerts 'someid'
alert(someVariable); //alerts 'hello world'
</script>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...