Java Script

Мало кто представлял себе, что этот язык превратится в профессиональную платформу

Если ещё лет 20 назад вы бы сказали, что JavaScript станет одним из самых популярных языков в мире, на вас бы посмотрели как на умалишённого: JavaScript на рубеже веков был не способен выполнять задачи, с которыми справлялись профессиональные языки программирования. Разработчики, создававшие веб-приложения, не считали его серьёзным инструментом для работы с кодом. В их арсенале уже имелся готовый инструмент — Java с компонентом апплет.

Но в 1995 году в компании-разработчике первого веб-браузера Netscape Navigator пришли к необходимости создания более простого инструмента. Действовать приходилось в сложной ситуации: они воевали за рынок с Microsoft, были на грани разрыва отношений в рамках стратегического партнёрства с Sun Microsystems и к тому же крайне ограничены во времени. Нужно было создать новый язык и при этом вписаться в строгие временные рамки. Для этого в компанию взяли Брендана Эйха. Первая версия JavaScript была готова за десять дней, и её тут же включили в этот симпатичный браузер.

Skillbox
Netscape 2: дебют JavaScript

На самом деле, Эйху хотелось создать браузерную версию языка программирования типа Scheme. Но в Netscape вышла другая версия: в компании решили, что язык внешне должен походить на Java. Схожесть названий — Java и JavaScript — привела впоследствии к многолетней путанице.

«Руководству хотелось сделать его похожим на Java, чтобы получилось что-то вроде его младшего брата, не хватающего с неба звёзд и держащегося в его тени». — Брендан Эйх

Эра интерактивных кнопок

В первые пять лет жизни JavaScript был инструментом для людей, неискушённых в программировании на Java. Помимо любителей и тех, у кого не хватает времени на что-то более сложное, им активно пользовались и веб-разработчики — только-только появившиеся компьютерщики, которые занимались созданием графического пользовательского интерфейса веб-страниц. Им хотелось сделать его стильным и элегантным, использовав что-то более замысловатое, чем тег <blink>, и более модное, чем вращающийся шар в формате GIF.

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

Кому была нужна интерактивная кнопка? Да всем!

Интерактивная кнопка circa 2000

Уже очень скоро JavaScript активно использовался для замены одного изображения на другое при наведении курсора и/или щелчке мышью.

Может показаться безумием то, с каким упорством разработчики совершенствовали код ради светящихся кнопок на веб-страницах. Но сегодня у нас есть возможность с помощью CSS применять все эти эффекты, используя больше настройки стиля и анимацию, нежели предварительно сгенерированные файлы с изображениями. Мало кто ожидал от JavaScript чего-то большего: разработчики были довольны уже тем, что у них есть язык программирования на стороне сервера. Мысль о том, что JavaScript может реализовывать логику предметной области приложения казалась такой же абсурдной, как и то, что хранимые процедуры баз данных можно заменить на макросы Excel.

В плену тестовой среды

Критика JavaScript сегодня обычно обусловлена ограничениями в самом языке — запатченные средства объектно-ориентированного программирования, слабая безопасность типов, громоздкая модель DOM, путаница == против === и так далее. Но таких ограничений не было в первые годы жизни JavaScript, когда этот инструмент программирования казался просто ужасным. Между прочим, многие из таких ужасных языков программирования стали незаменимыми, оказавшись в нужном месте в нужное время (среди них BASIC, COBOL, SQL и PHP). И JavaScript, будучи единственным языком, имеющим встроенную поддержку в любом веб-браузере — появившийся в то время, как веб-сайты покоряли мир — он оказался в нужном месте в нужное время.

Реальным ограничением для JavaScript стала тестовая среда — жёстко контролируемая среда, которая привязывает код к определённому месту. Тестовая среда отрывает JavaScript от десктопного мира. Например, код на JavaScript не имел прямого доступа к файловой системе, экрану или «железу». Более того, код отрезал JavaScript от всего, что есть на сервере: баз данных со списками клиентов и каталогами продуктов, кода на стороне сервера, управлявшего логикой предметной области приложения. Вынужденному пребывать в таком заточении, JavaScript не оставалось ничего другого, кроме как предоставлять возможность играться с кнопками на странице.

Открытие конвейерной обработки запросов с XMLHttpRequest

Как ни странно, у Microsoft имелась веская причина сохранить JavaScript. И это была не сегодняшняя компания Microsoft, которая ратует за появление открытого ПО в каждой операционной системе. Напротив, это был жёсткий боец, ведущий беспощадную борьбу против общедоступного, бесплатного ПО и уничтожающий конкурентов своей стратегией «Поддержать, настроить и уничтожить».

Вот как это происходило. Примерно в то же время, когда мир сходил с ума по интерактивным кнопкам, в Microsoft искали способ сделать более гибкий клиентский веб-интерфейс для Outlook. Они разрабатывали продукт под названием Outlook Web Access, который выглядел вот так:

Outlook Web Access в 2000 году

Цель была поставлена довольно скромная: создать программу для чтения электронных писем, которая запускалась бы в браузере. Самое главное, чего им хотелось добиться, — избавиться от необходимости постоянно перезагружать страницу. Для этого требовалась технология, которая позволила бы веб-странице проверять, есть ли новые сообщения. Причём делать это в фоновом режиме. Быть может, эта задача не кажется сейчас такой запредельной, но не забывайте: Gmail на тот момент ещё не появился, а сама компания Google существовала всего несколько лет.

В Microsoft создали связующее ПО с компонентом ActiveX, который они назвали XMLHttpRequest. Основная идея XMLHttpRequest была проста — предоставить коду возможность делать веб-запросы. Подобно браузеру, которому надо связаться с сервером, чтобы сделать запрос (например, запросить доступ к какой-нибудь странице), код JavaScript мог использовать объект XMLHttpRequest для своих запросов (например, прислать новые сообщения).

Тогда появилась возможность с веб-страницы подключаться ко всем ресурсам сервера. Нужна информация из базы данных? Вызываем сервер и делаем запрос. Нужно получить от сервера вычисления, тест на безопасность или сверхсекретную проверку подлинности? Обращаемся к серверу и в этом случае. И самое главное: вызов происходит в фоновом режиме и никак не влияет на страницу.

XMLHttpRequest, однако, был не без странностей. Во-первых, его название: смешение строчных букв с прописными могло вызвать недопонимание у такого чувствительного к регистру символов языка, как JavaScript. Во-вторых, название предполагает отправку и получение кодом XML-сообщений. Такими сообщениями может быть практически что угодно — обычный текст, блочные элементы в HTML или объекты JavaScript, сериализованные в формат JSON. Но самой большой проблемой представлялось то, что XMLHttpRequest создавался с использованием ActiveX, то есть работать он мог только на компьютерах с Windows и только в Internet Explorer.

Но надолго эти недостатки не задержались: всего через несколько лет в других браузерах возникли новые реализации XMLHttpRequest — тот же объект в коде, но без головняков с ActiveX.

Несмотря на создание XMLHttpRequest, в Microsoft не торопились задействовать его в своих интернет-разработках (например, в своей общедоступной системе обмена электронной корреспонденцией Hotmail). Они дождались, пока Google не поразит мир веб-программирования, использовав XMLHttpRequest сначала с Gmail в 2004, а затем с Google Maps в 2005. Тут и мелькнула заветная цель: интернет-программы, которые выполнялись бы с быстротой реагирования настольных приложений.

Google Maps в 2005

На пути к современности

XMLHttpRequest стал главным элементом, повлиявшим на развитие JavaScript. Однако были и другие важные поворотные пункты в его истории.

Многие годы язык JavaScript был заморожен во времени. Проблема была в том, что лидер рынка, браузер Internet Explorer, обновлялся в сроки, ограниченные возможностями операционной системы — ну, то есть очень медленно. Разработчики были вынуждены писать код, который проверял версии браузера, пытаясь на ходу адаптироваться.

В 2006 году разработчики нашли решение в виде jQuery. Хотя на сегодня jQuery немного устарел, 10 лет назад он был незаменим в том, чтобы отладить функциональность и не тратить время на выявление и устранение проблем с совместимостью.

В 2008 году в Google презентовали новый движок JavaScript под названием V8. Если jQuery впервые решил проблему разработчиков с совместимостью, то V8 дал им высокую производительность. А так как движок V8 был отдельным компонентом с открытым кодом, другие проекты также могли его использовать. Уже гораздо позднее, благодаря этому, появились такие инновационные решения, как Node.js и Electron.

Далее в 2008 году появилась первая рабочая версия HTML5. Сам HTML5 не имел отношения к JavaScript, но был из одной плеяды с новыми API-интерфейсами JavaScript. На ровном месте у разработчиков появились инструменты для хранения локальных данных, управления историей просмотров в браузере, использования аудио, а также для выполнения фоновых задач. И снова разрыв между веб-функциями и настольными возможностями сократился.

JavaScript в наше время

Был ли успех JavaScript предопределён его привилегированным положением в браузере? Или это было дело случая: сочетания удачи и идеального времени?

Одно можно сказать наверняка — JavaScript был вынужден пробивать себе дорогу. Большую часть жизни JavaScript не был фаворитом. Люди отдавали предпочтение встраиваемым Java-апплетам, затем Flash и даже Silverlight. JavaScript не спасовал перед конкурентами и одолел их всех.

Пожалуй, самой справедливой оценкой будет тот факт, что JavaScript доказал то, что — по сути — знает каждый разработчик. А именно: самый важный фактор для новой технологии — это её доступность. Если у технологии высокая доступность, не нужно стремиться сделать ее лучшей — достаточно того, что уже есть.

Язык JavaScript стремительно развивается. Его путь можно сравнить с широкой разветвляющейся дорогой. Теперь у нас есть JavaScript, работающий на серверах (благодаря Node.js) и управляющий настольными приложениями (благодаря Node.js и Electron). У нас есть языки типа TypeScript, которые находятся в одном шаге от полноценных языков и компилируются в JavaScript, предоставляя возможность писать для веб-страниц без ущерба для душевной организации разработчиков. А в будущем вполне возможно, что WebAssembly окончательно снесёт языковые ограничения, предоставляя разработчикам возможность использовать язык любого, сколь угодно высокого уровня, на движке JavaScript.

Пора признать: несмотря на все недостатки, JavaScript остаётся одним из лучших языков программирования. Брендан Эйх включил JavaScript в браузер Netscape Navigator. А мы впихнули в браузер весь мир. В результате получилась современная Сеть.

«Никогда не сомневайтесь в JavaScript». — Брендан Эйх

Читайте также:


Перевод статьи Matthew MacDonald:How JavaScript Grew Up and Became a Real Language