• Тип с параметром. Параметризованные типы необходимы для создания универсальных структур данных. Например, для создания универсального стека тип содержимого должен быть указан в качестве параметра. В традиционных языках вместо параметра иногда использовались указатели.
• Списки. В функциональных языках программирования списки заменяли собой массивы. В новых императивных языках списки используются как массивы переменной длины.
• Первый, остаток. Эти две когда-то основные функции работы со списками — получение первого элемента и получение остатка списка (без первого элемента) — ведут свое происхождение от LISP. Название функциям LISP (SDR и SAR) дали соответствующие ассемблерные команды. Сейчас эти функции используются достаточно редко.
• Строки как списки символов. Эта возможность позволяет применять к строкам символов функции работы со списками (например, сделать «срез» символов из строки). Это очень удобная возможность унифицировать списки и строки.
• Списки как массивы. Возможность получить элемент списка по его номеру (например, «список[5]») существует только в новых императивных языках.
• Списки с элементами произвольного типа. Как правило, тип у всех элементов списка (подобно массиву) одинаков. Однако некоторые языки дают программисту возможность объединять в списке элементы разных типов.
• Кортежи. Традиционно кортеж — это список из двух элементов. Использовались кортежи обычно при создании хэш-таблиц (первый элемент — индекс, второй — значение). С появлением встроенных хэш-таблиц кортежи перешли в разряд анахронизмов. В Python название «кортеж» использовано для именования списков-констант.
• Кортежи, первый и второй. Специальные функции для получения первого и второго элементов кортежа. Применяются редко, как и сами кортежи.
• Хэш-таблицы. Хэш-таблицы (словари) традиционно использовались для быстрой выборки по ключевому значению (например, по строке символов) и были сильноразреженными массивами (большинство элементов такого массива не заполнено). Перерасход памяти окупался быстротой доступа. Новые императивные языки содержат встроенные хэш-таблицы.
• Объявление функции. При объявлении функции требуется задать имя, список параметров, типы результата и параметров, и тело функции (выражение или блок операторов).
• Рекурсивные функции. Как правило, все функции в современных языках программирования рекурсивны, т. е. могут вызывать сами себя.
• Лямбда-функции. Из всего большого раздела логики, называемого лямбда-исчислением, современные языки унаследовали только термин «лямбда-функции». Это маленькие функции без имени. Казалось бы, зачем нужны функции без имени, ведь их даже вызвать нельзя? Однако они могут быть использованы как параметры или результат функций высшего порядка (см. следующий пункт).
• Функции высшего порядка. В лямбда-исчислении функциями высшего порядка называются функции, которые могут принимать (в виде параметров) и возвращать (в виде результата) другие функции. В функциональных языках все функции — это функции высшего порядка.
• Отложенные вычисления. Отложенные («ленивые», lazy) вычисления — механизм, позволяющий функциональным языкам определять потенциально «бесконечные» функции. Как правило, такая функция рекурсивно вызывает сама себя. В императивных языках все функции являются «ленивыми».
• Классы. Основаны на конструкции «атрибуты+методы».
• Класс с параметром. Как и параметризованный тип, класс с параметром может использоваться для создания абстрактных типов данных. В ООП есть и другие средства для параметризации типов.
• Конструкторы и деструкторы. При создании объекта может вызываться специальная функция, называемая «конструктором», для инициализации структур данных. Аналогично перед удалением объекта может быть вызван «деструктор». Наиболее мощные языки ООП (например, Си++) допускают наличие нескольких конструкторов (деструкторов) в одном классе.
• Виртуальные методы. Си++ и другие языки допускают наличие методов двух типов — простых и виртуальных. Простые методы вызываются как обычные процедуры и не могут быть перегружены.
• Наследование. Как правило, объектно-ориентированное программирование подразумевает механизм наследования (создания нового класса на основе старого с добавлением новых атрибутов и методов).
• Множественное наследование. Создание нового класса на основе двух и более существующих классов.
• Описание. Чтобы создавать библиотеки функций (без которых любой язык неполноценен), необходим механизм модулей. Наиболее простой заключается в использовании файловой системы: функции одного модуля хранятся в одном файле и импортируются указанием имени файла. Более мощные языки имеют специальные заголовки модулей.
• Интерфейс. Описание интерфейса модуля необходимо для сокрытия внутренних функций и использования откомпилированного модуля без повторного компилирования исходного текста. В Си интерфейсы модулей хранятся в файлах с расширением «.h».
• Модуль с параметром. Модули с параметром необходимы для создания абстрактных типов данных. С появлением ООП отпала необходимость в параметризованных модулях.
• Байт-код. Байт-код — внутреннее представление программы на интерпретируемом языке программирования. Наличие байт-кода позволяет избежать повторной компиляции исходных текстов модулей. Кроме того, низкоуровневый байт-код позволяет в разы увеличить скорость интерпретации программ.
• Компилятор. Создание компилятора — последняя стадия в разработке любого языка программирования. Проблема (помимо сложности перевода языка высокого уровня на язык команд процессора) состоит в том, что компилятор необходимо писать для каждой платформы отдельно.
1. Дунаев В. Самоучитель JavaScript / В. Дунаев — 2-е изд. СПб.: Питер, 2005. — 395 с.: ил.
2. Елманова Н. Тенденции создания корпоративных веб-решений / Н. Елманова // КомпьютерПресс. 2006. № 10.
3. JavaScript Справочник: пер. с англ. / Аллен Вайк и др. — СПб.: ООО «ДиаСофтЮП», 2002. — 896 с
4. Днепров А.Г. Javascript на 100% / А.Г. Днепров — СПб.: Питер, 2008. — 304 с.: ил.
5. Эффективный самоучитель по креативному Web-дизайну. HTML, XHTML, CSS, JavaScript, PHP, ASP, ActiveX. Текст, графика, звук и анимация: пер с англ. / Крис Джамса, Конрад Кинг, Энди Андерсон — М.: ООО ДиаСофтЮП, 2005. — 672 с.
6. Богатырев Р. Природа и эволюция сценарных языков / Р. Богатырёв // Мир ПК. 2001. № 11.
7. Андреев А. Языки программирования: история продолжается! / А. Андреев // PC Magazine/Russian Edition. 2006. № 10.
8. Рева О.Н. JavaScript в кармане / О.Н. Рева. — М.: Эксмо, 2008. — 256 с.: ил.
Учебное издание
Деревянко Владимир Николаевич
ЯЗЫК JAVASCRIPT
В авторской редакции
Компьютерный набор В.Н. Деревянко
Подписано к изданию 21.12.2010.
Объем данных 826 Кб
ГОУВПО «Воронежский государственный технический
университет»