- •Лекция № 2
- •Введение
- •1. Основные синтаксические и семантические правила
- •1.1. Общая структура программы и данных
- •1.2. Типы данных, их организация в памяти и литералы
- •1.3. Ввод и вывод значений
- •1.4. Литералы значений
- •Литералы целых чисел
- •Перевод чисел в системы с другим основанием
- •Литералы вещественных чисел
- •Строковые литералы
- •Литералы массивов
- •Литералы объектов
- •1.5. Операции и выражения
- •Арифметические операции
- •Строковые операции
- •Операции сравнения
- •Компонентные операции
- •Операции присваивания
- •Другие операции
- •Синтаксис и семантика выражений
- •1.6. Дополнительные понятия и правила синтаксиса Ограничения на идентификаторы
- •Комментарии
- •Лексемы, пробельные символы и комментарии
- •2. Регулярные структуры данных
- •2.1. Многомерные массивы
- •2.2. Рекурсивные структуры объектов
- •Деревья
Введение
В этой лекции мы рассмотрим основные понятия языка JavaScript. Наша цель – разобраться, как устроена программа на этом языке, как и какие данные она обрабатывает, то есть понять и усвоить синтаксис и семантику языка. Синтаксические и семантические правила могут формулироваться на естественном (неформальном) языке, на формальном (искусственном) языке, с помощью графических представлений, но в любом случае они должны даватьточноеопределение языка. При этом обычно исходят из принципа «Запрещено всё, что не разрешено», то есть, правила описываютвседопустимые и обязательные варианты.
Поскольку JavaScript– объектно-ориентированный язык высокого уровня, структура программ и данных радикально отличается от архитектуры практически всех ЭВМ, и от принципов фон Неймана – тоже. В частности, не используются принципы хранимой (в памяти) программы и возможности её изменения в процессе исполнения, а также двоичности информации (правда, в языках, использующих операции над битами данных, двоичность подразумевается). Да и понятие памяти значительно более абстрактное это просто хранилище данных, где вместо адресов используются абстрактные ссылки. Более абстрактны и структуры данных – это произвольные структуры, образованные абстрактными объектами с помощью ссылок.
Вопрос о типах и структурах данных и о методах их обработки в языке JavaScriptявляется центральным в этой лекции. При этом следует иметь в виду, что, как все машины разных серий отличаются друг от друга, так и все языки программирования, даже основанные на общих концепциях, отличаются друг от друга во многих деталях синтаксиса и семантики. Поэтому важно не только получить представление об общих концепция, но и твёрдо усвоить особенности их реализации в конкретном языке программирования.
1. Основные синтаксические и семантические правила
Как уже говорилось, синтаксис– этоправила записи текстапрограммы и её элементов, асемантика–правила выполненияпрограммы и её элементов. Некоторые понятия имеют и синтаксический, и семантический смысл (например, программа, оператор), а некоторые – только синтаксический (например, идентификатор, имя) или только семантический (например, ссылка, структура данных) смысл.
Синтаксис конструкций языка будем описывать как неформально, так и с помощью формальных синтаксических правил – синтаксических формул, которые имеют следующий вид:
Конструкция→ вариант_1 │ вариант_2 │ … │ вариант_n
Здесь Конструкция– это название определяемой конструкции,вариант– вариант вида конструкции, он представляет собой последовательность названий конструкций и символов языка. Символы языка печатаются шрифтомCourier New. Знак → читается, как «– это», а знак │ – как «или». Эти знаки называютсяметасимволами, т.е. символамиметаязыка(языка, используемого для описания языков). В качестве метасимволов используются также «скобки»и. Они выделяютнеобязательную частьварианта. Все метасимволы заметно отличаются от символов языка.
Семантику конструкций языка будем описывать неформально как словесно, так и с помощью диаграмм.
1.1. Общая структура программы и данных
С семантической точки зрения программа– это заданнаяпоследовательность операторов.Выполнениепрограммы начинается с выполнения первого оператора последовательности и заканчивается выполнением её последнего оператора. После завершения выполнение каждого оператора начинается выполнение следующего за ним оператора. Сказанное выражается блок-схемой, представленной на рисунке 1.1. На ней блоки (овалы и прямоугольники) обозначают то, что на них написано, а стрелками указан порядок выполнения операторов –поток управления. Операторы, в свою очередь, могут состоять из других операторов, их блок-схемы могут уже не иметь такой простой линейный вид (они будут рассмотрены дальше).
|
|
оператор1;оператор2;…;операторn
или
оператор1
оператор2;
…
операторn
Формальный синтаксис:
Программа→ ПоследовательностьОператоров
ПоследовательностьОператоров→ ОператорРазделительОператоров ПоследовательностьОператоров
РазделительОператоров→; │ НоваяСтрока
Отметим важную особенность формальных синтаксических определений – их рекурсивность.Рекурсивное определение(от лат.recursio– возвращение) – это частичное определение объектачерез самого себяи набор частных случаев, которые не определяются через этот объект и тем самым обеспечивают завершение рекурсии2. В данном случае рекурсивным является определение конструкцииПоследовательностьОператоров. Раскручивая эту рекурсию, мы можем её заверить, воспользовавшись необязательностью той последовательности конструкций, которая взята в скобкии.
Некоторые детали синтаксиса не могут быть определены подобными формальными правилами (или их определение слишком сложно) и должны оговариваться неформально. В данном случае нужно добавить следующее:
Слева и справа от разделителя операторов можно вставлять любое количество пробельных символов: «пробел» (клавиша ПРОБЕЛ), «табуляция» (клавишаTab), «новая строка» (клавишаEnter). Тогда можно представить текст программы, состоящей из трёх операторов, в таком виде:
оператор1 ; оператор2;
оператор3
Более подробно эти и другие несущественные вставки будут рассмотрены позже.
Текст программы набирается на клавиатуре с использованием всех символьных и цифровых клавиш (в верхнем и нижнем регистрах3) и клавиш ПРОБЕЛ,TabиEnter. Никакие другие приёмы форматирования текста программы не допускаются. Набирая программу, следует иметь в виду, чтоJavaScript–регистрозависимыйязык. Это означает, что буква в нижнем регистре (строчная) и та же буква в верхнем регистре (прописная) считаются разными буквами.
Рассмотрим теперь семантические понятия, связанные с обработкой данных.
Программы обрабатывают данные, поступающие впамять программынепосредственно из текста самой программы, или в процессе выполнения программойвычислений(промежуточные и окончательные результаты), или с внешних устройств (клавиатура, мышь, диски, сеть). Кроме того, программе доступны данные, находящиеся впамяти системы, исполняющей программу. В нашем случае этоWeb-браузер. Результаты программа может выводить на внешние устройства или возвращать системе.

Рисунок
2.1. Блок-схема программы.