Освоение серии JavaScript

Часто говорят, что JavaScript — это интерпретируемый язык, и, чтобы добавить путаницы, некоторые на самом деле также говорят, что JavaScript не является компилируемым языком. Для любого, кто имеет некоторое образование в области компьютерных наук, известно, что для того, чтобы что-либо было прочитано компьютером, оно должно быть переведено на компьютерный язык, и это делает компилятор. Почему тогда JavaScript не «переводится»?

Упущенная здесь тонкость заключается в том, что в конечном итоге JavaScript тоже компилируется, но не так, как другие языки. Другие языки компилируются в нечто, называемое объектной программой. Затем объектная программа действует автономно, независимо от среды, в которой она была создана. Однако с помощью JavaScript у вас нет объектной программы как таковой. Вместо этого вам всегда нужно иметь механизм интерпретатора/компилятора на машине, на которой вы хотите запускать код JavaScript. Например, одним из таких двигателей является двигатель V8.

Подумайте об этом так. Если бы мне пришлось поставить вам программу на языке C. Я набирал свой код, компилировал его в исполняемый файл (.exe) и затем отправлял вам конечный продукт как finalproduct.exe. Все, что вам нужно сделать как пользователю, это дважды щелкнуть по нему. Он будет работать в вашей системе.

Этот файл .exe имеет все зависимости, необходимые для его запуска — ну, если только разработчик специально не закодировал программу так, чтобы она требовала чего-то еще, прежде чем она попытается запуститься.

С JavaScript это похоже на отправку кому-то документа Word. Читатель должен иметь установленный Microsoft Word на своем компьютере, чтобы иметь возможность прочитать ваш файл. С JavaScript разработчик фактически отправляет вам исходный код, something.js, и для того, чтобы вы могли запустить его на своем компьютере, вам нужен интерпретатор/компилятор/читатель (V8, Rhino или TraceMonkey и т. д.). Причина, по которой вы можете не заметить, что вам нужна программа для чтения, в первую очередь заключается в том, что почти каждый новый браузер имеет некоторую поддержку JavaScript, а Chrome является лидером со своим движком V8.

Итак, доставляет ли язык программирования видимую объектную программу или сценарий. Процесс компиляции всегда должен происходить до того, как ваша программа (написанная на любом из языков более высокого уровня) запустится в вашей системе.

Давайте немного разберемся с компиляторами, и на этом мы закончим.

Многие компиляторы имеют определенные общие процессы. Важно знать абстрактную сущность этих процессов. Помните, что может быть множество процессов, зависящих от машины и операционной системы, среда Windows отличается от MacOS, а ноутбук отличается от умных часов. Здесь мы пытаемся понять, что вообще происходит при компиляции языка. Эти фазы не обязательно происходят отдельно в реальном компиляторе. Но часто удобно концептуально разделить компилятор на эти этапы, чтобы изолировать проблемы, которые являются уникальными для части процесса компиляции.

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

Лексический анализ:

Эта фаза на первом месте. Это анализирует все символы (также известные как ваш код), введенные в компилятор. Лексический анализатор выполняет такие задачи, как удаление любых пробелов или комментариев в вашем исходном коде, группирует определенные символы в определенную синтаксическую единицу и, выполняя все это, разбивает ваш код на серию токенов. В конце концов, что означает этот токен, подразумевается спецификацией языка программирования (V8 содержит эту спецификацию для JavaScript). Если лексический анализатор находит токен недействительным, он генерирует ошибку, в противном случае выходные данные токена на этом этапе готовы к дальнейшей обработке.

Бухгалтерские операции или операции с таблицами символов:

Как только токены обнаруживаются при лексическом анализе, информация об определенных токенах собирается и сохраняется в одной или нескольких таблицах. Как выглядят эти таблицы и какая информация содержится в них, зависит от спецификаций языка программирования.

Разбор, синтаксический анализ или синтаксический анализ:

На этот этап приходит строка токенов, полученная в результате лексического анализа. Здесь токены проверяются, чтобы определить, соответствует ли строка определенным структурным соглашениям. И снова соглашения явно выражены в синтаксическом определении языка.

Генерация кода или перевод в промежуточный код (например, язык ассемблера):

Дерево, построенное на этапе синтаксического анализа, используется для генерации перевода входной программы. Этот перевод может быть переводом вашей программы на машинный язык. Но чаще это промежуточный язык, который может выглядеть как длинная пошаговая таблица с последовательными командами. Сделай это; Сделай это; ПОЛОЖИТЕ это туда; ПОСТАВЬТЕ это здесь;

Оптимизация кода:

Во многих ситуациях важно, чтобы компиляторы создавали программы, которые работают эффективно. Оптимизация кода — это последняя попытка сделать объектные программы более эффективными, более быстрыми, компактными и т. д. Объектные программы могут быть файлом .exe для программиста на C, но для разработчика JavaScript вы не сможете увидеть свою объектную программу. Но важно знать, что он все еще концептуально присутствует.

Генерация объектного кода (например, сборка):

Единицы и нули, которые читает компьютер. Неважно, на каком языке написана программа, на этом заканчивается весь код. Здесь ваш код общается с машиной и делает то, для чего вы его запрограммировали.