Компьютеры на самом деле не могут запустить код, в котором вы пишете JavaScript (или любой другой язык в этом отношении). Компьютеры могут запускать только машинный код. Машинный код, который может запустить конкретный компьютер, определен в процессоре, который будет выполнять эти команды, и может отличаться для разных процессоров.
Очевидно, что написание машинного кода людям было трудно это сделать (125 - это команда добавления, или это 126 или, может быть, 27). Чтобы обойти эту проблему, были созданы так называемые языки ассемблера. Эти языки использовали более очевидные имена для команд (например, ADD для добавления) и таким образом избавили от необходимости запоминать точные машинные коды. Языки ассемблера по-прежнему имеют отношение один к одному с конкретным процессором и машинным кодом, в которые компьютер преобразует эти команды.
Языки ассемблера должны быть скомпилированы или интерпретированы
Очень рано стало понятно, что проще написать языки были необходимы и чтобы сам компьютер мог использоваться для перевода тех инструкций в машинный код, которые компьютер может действительно понять. В этом переводе можно было использовать два подхода, и были выбраны обе альтернативы. (один или другой будет использоваться в зависимости от используемого языка и места его использования).
Скомпилированный язык - это тот, где после написания программы вы передаете код через программу, называемую компилятор и это производит версию программы с машинным кодом. Когда вы хотите запустить программу, вы просто называете версию машинного кода. Если вы вносите изменения в программу, вам необходимо перекомпилировать ее, прежде чем вы сможете протестировать измененный код.
Интерпретируемый язык - это язык, в котором инструкции преобразуются из того, что вы написали, в машинный код во время работы программы. Интерпретируемый язык в основном получает инструкцию из исходного кода программы, преобразует ее в компьютер код, запускает этот машинный код и затем получает следующую инструкцию из источника, чтобы повторить процесс.
Два варианта компиляции и интерпретации
Один вариант использует двухэтапный процесс. В этом варианте исходный код вашей программы компилируется не напрямую в машинный код, а в вместо этого преобразуется в подобный ассемблеру язык, который все еще не зависит от конкретного процессор. Когда вы хотите запустить код, он обрабатывает этот скомпилированный код через интерпретатор, специфичный для процессора, чтобы получить машинный код, соответствующий этому процессору. Этот подход имеет много преимуществ компиляции при сохранении независимости процессора, поскольку один и тот же скомпилированный код может интерпретироваться многими различными процессорами. Java - это один из языков, который часто использует этот вариант.
Другой вариант называется компилятором Just in Time (или JIT). При таком подходе вы фактически не запускаете компилятор после написания своего кода. Вместо этого это происходит автоматически при запуске кода. При использовании компилятора Just in Time код не интерпретируется оператор за оператором, он компилируется все в одном каждый раз, когда он вызывается для запуска, а затем создается только что созданная версия, запустить. Этот подход делает его похожим на интерпретируемый код, за исключением того, что вместо ошибок можно найти только когда оператор с ошибка достигнута, любые ошибки, обнаруженные компилятором, приводят к тому, что не выполняется ни один код, а весь код до этого момента запустить. PHP это пример языка, который обычно использует как раз вовремя компиляцию.
JavaScript компилируется или интерпретируется?
Итак, теперь мы знаем, что означают интерпретируемый код и скомпилированный код, и нам нужно ответить на следующий вопрос: какое отношение все это имеет к JavaScript? В зависимости от того, где именно вы запускаете свой JavaScript, код может быть скомпилирован или интерпретирован или использовать любой из двух других упомянутых вариантов. Большую часть времени вызапуск вашего JavaScript в веб-браузере и там JavaScript обычно интерпретируется.
Интерпретируемые языки обычно медленнее, чем скомпилированные языки. Для этого есть две причины. Во-первых, код, который должен быть интерпретирован, должен быть интерпретирован, прежде чем он может быть запущен, и, во-вторых, он имеет происходит каждый раз, когда должен выполняться оператор (не только каждый раз, когда вы запускаете JavaScript, но если он находится в петля тогда это должно быть сделано каждый раз в цикле). Это означает, что код, написанный на JavaScript, будет работать медленнее, чем код, написанный на многих других языках.
Как знание этого помогает нам, когда JavaScript является единственным языком, доступным для нас во всех веб-браузерах? Сам интерпретатор JavaScript, встроенный в веб-браузер, не написан на JavaScript. Вместо этого он написан на другом языке, который затем был скомпилирован. Это означает, что вы можете заставить ваш JavaScript работать быстрее, если вы можете использовать любые команды, которые предоставляет JavaScript, которые позволяют перенести задачу на сам движок JavaScript.
Примеры того, как заставить JavaScript работать быстрее
Примером этого является то, что некоторые, но не все браузеры внедрили метод document.getElementsByClassName () в движке JavaScript, в то время как другие еще не сделали этого. Когда нам нужна эта конкретная функциональность, мы можем разбирать код быстрее в тех браузерах, где механизм JavaScript предоставляет его с помощью функции ощущая, что метод уже существует, и создавая собственную версию этого кода в JavaScript, только когда механизм JavaScript не предоставляет его для нас. Там, где движок JavaScript обеспечивает такую функциональность, он должен работать быстрее, если мы его используем, а не запускаем собственную версию, написанную на JavaScript. То же самое относится к любой обработке, которую механизм JavaScript делает доступной для непосредственного вызова.
Также будут случаи, когда JavaScript предоставляет несколько способов сделать один и тот же запрос. В этих случаях один из способов доступа к информации может быть более конкретным, чем другой. Например, document.getElementsByTagName ('table') [0] .tBodies и document.getElementsByTagName ('table') [0] .getElementsByTagName ('tbody') оба получить тот же список узлов тегов tbody в первой таблице на веб-странице, однако первая из них - это специальная команда для получения теги tbody, где вторая идентифицирует, что мы извлекаем теги tbody в параметре, а другие значения можно заменить для извлечения других теги. В большинстве браузеров более короткий и конкретный вариант кода будет работать быстрее (в некоторых случаях намного быстрее) чем второй вариант и поэтому имеет смысл использовать более короткий и конкретный версия. Это также облегчает чтение и сопровождение кода.
Теперь во многих из этих случаев фактическая разница во времени обработки будет очень маленькой, и это будет только тогда, когда Вы добавляете много таких вариантов кода вместе, что вы получите заметную разницу во времени, которое ваш код занимает запустить. Однако довольно редко изменение кода для ускорения его выполнения приведет к значительному удлинению или усложнению поддержки кода, и часто обратное будет верным. Существует также дополнительное преимущество, что будущие версии движков JavaScript могут быть созданы, что ускоряет даже более конкретный вариант кроме того, использование конкретного варианта может означать, что ваш код будет работать быстрее в будущем без необходимости что-либо менять.