LXF98:Что за штука
|
|
|
JavaScript 2?
Половина web-сайтов успешно использует JavaScript – так стоит ли чинить то, что не ломалось? Пол Хадсон объяснит, что к чему…
- ОК, наконец-то я дождался темы, о которой еще до начала ваших объяснений мне известно все!
Правда? Стоит пожалеть деньги, выложенные за этот номер журнала! Но, признаться, я несколько удивлен: о JavaScript 2 знают пока лишь немногие.
- JavaScript 2? Я как-то не до конца вник. Облом! И правда, о JavaScript 2 я пока ничего не слышал – прошу вас, продолжайте…
Уже лучше! Я вижу, вы многое знаете о текущей версии JavaScript, да и немудрено: JavaScript нынче повсюду. Забрались ли вы в Интернет через настольный компьютер или смартфон, работаете ли с XML-файлами или SVG с поддержкой скриптов – вам не обойтись без JavaScript.
Не секрет, что свыше половины всех web-сайтов в той или иной степени используют JavaScript, а некоторые (Google Maps, например) целиком построены на нем!
- Да, да: акроним Ajax нынче повсюду в моде.
Вот именно, буква “J” в Ajax означает JavaScript, поэтому можно смело назвать JavaScript непревзойденным языком программирования Web 2.0. Даже для сайтов без Ajax, JavaScript сегодня вне конкуренции.
- Погодите… зачем тогда что-то менять? Я уважаю стандарты…
Не забывайте, что JavaScript был создан десятилетие назад, когда Сеть была совсем не той, что сейчас. Тогда JavaScript занимался установкой и чтением cookies, выводом простеньких часов на экран, проверкой правильности заполнения форм и другими примитивными задачами. Теперь его основная цель – обеспечить взаимодействие пользователя с web-страницей: не желая наблюдать уныло-статические картинки, современные пользователи жаждут интерактивности: почти мгновенного обновления, общения с другими пользователями, и – вероятно, самое важное – они больше не хотят нажимать кнопку “Reload” (Обновить). Короче: JavaScript был создан для решения простых задач, и уже с трудом удерживает выстроенные вокруг него супер-сайты.
- А разве недостаточно легкой модернизации – скажем, JavaScript 1.1, а не 2.0…
На самом-то деле, добрались уже до JavaScript 1.7! Чтобы соответствовать растущим запросам, новые функции добавляются непрерывно.
- Почему тогда столько внимания 2.0? Рано или поздно, выход из серии 1.х на 2.0 стал бы просто логическим продолжением.
В общем, да. А еще такие значительные изменения нумерации версий обычно знаменуют обратную несовместимость – скрипты прежних версий просто не смогут работать на новой. Обычно имеется в виду вот что: «если уж пришлось пойти на слом обратной совместимости – самое время внести и другие давно назревшие изменения». А изменения назрели действительно радикальные: формальное определение классов вместо ныне существующего быстрого определения прототипов, пространства имен, примитивные типы (вместо представления всего сущего в качестве объектов), модификаторы доступа (private, public и т.п.) и многое другое. Масштабность изменений вынудила одного из критиков сказать следующее: «Предполагается, что JavaScript – высокоуровневый, абстрактный, гибкий язык. Именно этим он был хорош, таким же образом его следовало бы использовать и дальше. Если пойти по пути, предложенному JavaScript 2, то, если честно, понадобится создать новый JavaScript для выполнения тех задач, которые этот язык столь успешно решал».
- В угоду программистам, нужно многое изменить… А чтобы сохранить преемственность, необходимо многое оставить… Возможна ли золотая середина?
Часть проблемы состоит в том, что многие не вполне представляют себе функциональность нынешнего JavaScript – поэтому, просматривая спецификацию JavaScript 2, они удивляются: «Ничего себе, сколько всего!», тогда как половина всех нововведений давно работает в JavaScript 1.7, просто они об этом не знают. Другая проблема – столкновение множества самых разных точек зрения. Брендан Эйх [Brendan Eich], технический директор Mozilla, который и создал JavaScript десять лет назад, еще работая на Netscape, назвал четыре самых распространенных совета, полученных им от самых разных людей: «оставьте язык в покое», «пересмотрите его мощно, необратимо», «чуть-чуть подправьте его (90 вариантов “чуть-чуть”)» и «не превращайте это в Java!».
- Сделать два разных JavaScript – совсем неплохая идея!
Допускаю, но аргументы в пользу унификации еще убедительнее: JavaScript – одно из немногих понятий, однозначно воспринимаемых разными браузерами. Да, совместимость несовершенна – например, подружить Opera с Gmail удалось не сразу. В остальном же способность JavaScript примирять самые разные браузеры и платформы поразительна.
- А если взять да и обновить все разом до JavaScript 2?
Надежда есть – по крайней мере, с годами. Понадобилось немало лет, чтобы JavaScript достиг нынешнего уровня, и хотя Mozilla, Konqueror, Opera и Safari не заставят себя долго ждать, на адаптацию Internet Explorer может уйти несколько лет. Тем временем многие сайты будут просто отказываться работать под ним, а пользователи будут испытывать неудобства.
- А разве нельзя подготовить одну версию страницы для JavaScript 2, а другую – для версии 1.7?
Можно, но ведь разработчику сайта понадобится написать, отладить и поддерживать вдвое больше кода – едва ли это будет способствовать увеличению продуктивности, обещанному JavaScript 2! Но ходят разговоры о создании конвертора с JavaScript 2 на JavaScript 1.7, то есть программирование будет выполняться на JavaScript 2, а эквивалент для версии JavaScript 1.7 сгенерирует компьютер.
- Звучит разумно. А если точнее, о каких новых функциях идет речь?
Схематично я уже описал основные отличия новой версии, и похоже на то, что все эти нововведения войдут в финальный стандарт. С другой стороны, одна из целей – максимально упростить переход на JS2. Может быть, стоит более подробно остановиться на новшествах…
- Имеет смысл. Начните с пространств имен — хоть что-то знакомое…
Да, да, пространства имен и их близкие друзья-пакеты есть в C++, Java, C# и Perl, и вполне могут однажды возникнуть в PHP. «Пространство имен» в терминологии программистов означает набор использованных ключевых слов. Например, Scriptaculous API предоставляет десятки эффектов и DOM-инструментарий для сборки. Если воспользоваться ими, да еще парочкой других API, то скоро проявятся конфликты между различными именами классов и функций, определенных разными API – гляди в оба, чтобы не ошибиться. Пространство имен позволяет сказать: «В этом скрипте под словом Effect я подразумеваю Scriptaculous Effect».
Улавливаете? Конечно, пространство имен касается лишь крупных сайтов с множеством разнообразных компонентов. Есть понятия попроще: JavaScript 2 будет способен различать объекты, массивы, функции, логические переменные, целые числа, числа с плавающей точкой, десятичные числа, строки, даты, регулярные выражения и ошибки. Версия 1.7 втиснула целые числа, числа с плавающей точкой и десятичные числа в упрощенный тип данных “number”, но в JavaScript 2 все будет иначе.
- Хм… А разве десятичное число – это не число с плавающей точкой?
Числа с плавающей точкой обладают известной неточностью – например, вы думаете, что имеете дело с числом 0,1, а на самом деле оно 0,99999999 или 0.10000001. А значит, даже простая арифметика может вылиться в проблему. Возьмем маленькую команду: alert((0.1+0.7)*10). Это означает: «сложить 0,1 с 0,7, умножить результат на 10, затем показать это в окне сообщения». Вы ожидаете, что в окне выведется 8, а увидите 7.99999999.
- Но… но это же плохо!
Во-во, полная фигня.
- Э-э… как-то вы уж очень по-простому.
Извините – инженерным разговорам свойственна непринужденность. В общем, проблема неточности будет решена введением десятичного типа.
- И будет строгая типизация данных?
Нет, не совсем. Но программисты получат возможность строго определять некоторые типы данных, а также сообщать, какой тип данных ожидается на возврате из функции. Все это похоже на “type hints” в PHP.
- Стойте – для меня это уже слишком. Не могли бы вы объяснить в общих чертах?
ОК. JavaScript 2 взял итераторы и слайсинг от Python, перегрузку операторов от C++, ключевое слово let из Basic. Получилось некоторая мешанина, но в итоге JavaScript 2 обещает вобрать в себя лучшие черты других популярных языков программирования.
- Звучит так необычно… Не опасно ли внедрять так много нового сразу?
Верно. Именно поэтому JavaScript 1.7 (поставляемый с Firefox 2.0) уже обладает многими из заявленных свойств – например, let уже там, итераторы тоже. JavaScript 1.9, выпуск которого планируется совместить с выходом Firefox 3.0, будет обладать еще большим количеством нововведений. После этого переход на JavaScript 2.0 уже не будет потрясением.
- Надо полагать. Ой! Кажется… утюг! Я забыл выключить утюг – скорее, дайте мне URL, мне надо бежать!
Давать-то пока нечего, JavaScript 2.0 настолько новое понятие, что нет еще ни книг, ни учебников, ни howto и, уж конечно, никаких примеров для загрузки. Сожалею!
- Эх, уже убежал…