Что вообще такое язык программирования? За этим понятием скрывается две связанных, но независимых темы.

Язык программирования

С одной стороны, языком программирования называют правила (лексические, синтаксические и семантические), по которым записывается исходный код. В отличие от правил естественных языков, эти правила достаточно строги. Любая мельчайшая ошибка — и код не запустится, или запустится, но не заработает как ожидается. Например, в js нельзя написать const name;. Эти правила существуют не только в книгах и головах разработчиков, пишущих программы на этом языке. Они очень четко описаны в спецификации — документе, который является эталоном языка программирования и истиной в последней инстанции. Спецификация у языка, как правило, одна.

С другой стороны, языком программирования называют программу, которая непосредственно запускает или компилирует наш код. В предыдущем уроке мы как раз установили такую программу. Программы, которые выполняют интерпретацию кода, называют рантаймом или средой исполнения. Рантайм — конкретное воплощение спецификации. Интерпретаторов может быть сколько угодно. Их создают и крупные IT-компании, и разработчики-одиночки. В случае js их по-настоящему много. JavaScript можно запускать на железе (embedded systems), в различных браузерах, на сервере и даже как обычную программу внутри операционной системы (electron).

ECMAScript

js в этом смысле повезло больше, чем другим. Исторически язык разрабатывался под браузер. В какой-то момент из игрушки он превратился в полезный инструмент для создания интерактивных сайтов. В свою очередь, это привело к тому, что интерпретатор js был встроен в каждый браузер. Дальнейший рост популярности вывел его за рамки браузеров — это произошло после создания Node.js. В итоге js стал самым распространенным и популярным языком современности.

Основа js — язык ECMAScript. ECMAScript — это встраиваемый, расширяемый, не имеющий средств ввода-вывода (то есть он не может писать и читать файлы) язык программирования, используемый в качестве основы для построения других скриптовых языков. По сути, он существует только на бумаге. Стандартизирован международной организацией ECMA в спецификации ECMA-262. js основан на ECMAScript, но расширяет его. Кстати, js не единственный язык, расширяющий ECMAScript. Кроме него также используются JScript и ActionScript.

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

  • es3
  • es5.1
  • strict mode
  • ECMAScript 2015 (es6)
  • es7 ?

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

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

На Хекслете изучается последний стандарт языка. Мы делаем это по нескольким причинам. Во-первых, он настолько сильно преображает язык, что js становится по-настоящему мощным и выразительным инструментом. Во-вторых, современный инструментарий позволяет использовать практически любые возможности, не боясь, что определенный интерпретатор (например, браузер) их не поддерживает. Подробнее об этом в уроке про Babel.

Возникает вопрос, что подразумевается под изучением js в связи со всем вышесказанным? Речь, конечно же, идет непосредственно о ядре языка: том, что умеет ECMAScript. Эти знания одинаково пригодятся как и в клиентской разработке, так и в серверной. Для удобства на Хекслете используется Node.js.

JavaScript

JavaScript — динамический, слабо типизированный, интерпретируемый язык программирования. Разберем эти слова по отдельности.

Интерпретируемый

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

$ node
> eval('10 * 3 + Math.random()')

Динамический

В отличие от статических языков, проверка типов в js происходит в момент выполнения кода. А значит, если мы случайно ошиблись и, например, вызываем несуществующую функцию, то ошибка всплывет только во время вызова этой функции. В статических языках подобные ошибки отслеживаются на этапе анализа исходного текста без запуска кода на выполнение. Такие инструменты называются статическими анализаторами кода. Слово статический как раз означает, что программа не выполняется. Для динамических языков они тоже существуют, но отслеживают значительно меньшее число ошибок. Об одном из таких инструментов мы поговорим в соответствующем уроке.

Слабо типизированный

Об этом уже говорилось в курсе "Введение в программирование". И эту черту языка нельзя назвать положительной. Слабая типизация означает, что js автоматически приводит типы там, где считает нужным. Подробнее этот механизм описан в спецификации. С одной стороны, слабая типизация позволяет писать более короткий код. С другой стороны, количество ошибок резко возрастает, так как вместо остановки выполнения, код продолжает работать там, где он не должен работать. Например, мы можем сложить число со строкой по ошибке, и js молча выполнит эту операцию. В языках типа ruby/python подобное невозможно. Выполнение кода прекратится с сообщением о невозможности выполнить операцию для этих типов. Никогда не полагайтесь на эту особенность языка, во избежание проблем.

$ node
> 3 + '8ha'
'38ha'
> '8ha' * 3
NaN
> true + 1
2
Мы учим программированию с нуля до стажировки и работы. Попробуйте наш бесплатный курс «Введение в программирование» или полные программы обучения по Node, PHP, Python и Java.

Хекслет

Подробнее о том, почему наше обучение работает →