Методы описания синтаксических конструкций языков программирования. Алфавит, синтаксис и семантика языка программирования Синтаксис языка программирования

Синтаксис проверяется на ранних стадиях трансляции . В интерпретируемых языках программирования проверка синтаксиса производится или в процессе интерпретации (выполнения), или в процессе предварительной компиляции в промежуточный код. Кроме того, синтаксис может проверяться непосредственно при редактировании исходных текстов программ при использовании IDE .

Синтаксис записи функции

Синтаксис записи функции - формальные правила, которым должна удовлетворять запись определения или вызова функции ; форма записи функции. Если синтаксис функции будет неверен, компилятор вернет ошибку, и программа не будет собрана, пока ошибка не будет исправлена.

К синтаксическим ошибкам записи функции, например, относятся:

  • написание названия функции при её вызове, не соответствующее грамматике языка (неверный регистр символов для регистрострогих языков);
  • использование при вызове или определении функции литералов, не соответствующих грамматике языка (другие виды скобок, разделитель аргументов);
  • отсутствие возвращаемого функцией типа данных (для тех языков, для которых это определено грамматикой).

Конспект урока

Два аспекта языков
  • У языка программирования есть два аспекта:
    • Синтаксис (правила написания кода, правописание, порядок слов)
  • Некоторые языки программирования имеют похожий синтаксис
  • Некоторые языки имеют экзотический, необычный синтаксис
  • Семантику сложно увидеть, она неявная
Синтаксис и семантика
  • В современных языках хороший код означает легко понятную семантику
  • Если понять то, что делает код сложно, то код не слишком хороший
  • Синтаксис легко изучать
  • Синтаксис необходимо знать, но этого недостаточно
Выбор языка
  • Не так важно с какого языка начинать
  • Вы будете переключаться на разные языки и использовать несколько языков и технологий одновременно. Такова реальность современного программирования.
  • Мы выбрали JavaScript, потому что он простой, очень популярный и работает почти везде.
  • JavaScript обычно используется для написания веб-сайтов, мобильных приложений, программного обеспечения для серверов и многого другого.
  • Этот сайт в эту самую секунду использует JavaScript.
  • Программы, написанные на JavaScript, запущены сейчас на ваших компьютерах.

Дополнительно

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

Транскрипт урока

Мы назвали систему нажимания кнопок "языком". Рычаг, видимо, это отдельная штука, он как команда "ЗАПУСТИТЬ". Мы вводим код кнопками и ЗАПУСКАЕМ его рычагом.

Знаете, как лингвисты обсуждают грамматику, структуру слов и подобные вещи? Их не особо интересуют романы, песни или рассказы, они больше заинтересованы в языке, который используется для этих романов, песен и рассказов. Их интересует код. Большинство людей, напротив, заинтересовано в историях и смысле. Не только в книгах и фильмах, но и в жизни. Когда я прошу свою девушку купить мне новый альбом, потому что я делаю нелепые рисунки для этих уроков, меня интересует результат, цель, а не этимология и структура слова "альбом".

Можно считать, что у языка есть два... компонента или две особенности: грамматика и назначение. Языки программирования похожи в этом смысле, но поскольку они намного проще, чем человеческие, грамматика у них не на первом месте, но синтаксис - порядок слов и словообразование - важен. А для назначения, для понятия "смысл" программисты используют модное слово "семантика".

Попробуем сравнить язык магического ящика Тоты с каким-нибудь современным языком программирования.

У этого ящика очень сложный синтаксис, с символами Х и О сложно работать. А вот этот современный код выглядит... хмм, как английский язык! Этот синтаксис намного легче освоить, как минимум можно догадаться, что значит каждое слово.

Набор правил, который описывает как символы и слова могут использоваться - это синтаксис.

Вы увидите, что некоторые языки программирования имеют похожий синтаксис, а некоторые - экзотический, необычный.

Семантику или смысл увидеть сложнее, потому что он неявный. Какое назначение у этого кода? Это огненная вспышка, как мы уже поняли. Какое назначение у этого кода? Возможно, вы догадались: он выводит на печать фразу задом наперед. Смысл, конечный результат запущенного кода - это семантика.

В современных языках программирования связь между кодом и его видимым назначением можно использовать, чтобы судить о качестве кода. Если вы смотрите на код и быстро улавливаете его назначение, то это хороший код. Если при взгляде на код у вас возникает мысль "что это, чёрт возьми, такое?!", вероятно, он не слишком хороший. Это подводит нас к важной идее: код пишется для людей. Компьютерам всё равно, легко ли читается код: для них любой код легкочитаемый.

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

К счастью, у языков программирования очень простой синтаксис по сравнению с языками, на которых говорят люди. Так что не беспокойтесь, не смотря на то, что нам придётся изучать синтаксис, эта задача будет достаточно простой.

Получается... программировать легко? Если компьютеры тупые и выполняют только то, что мы им говорим, а синтаксис языка программирования - простая штука, всё вместе должно быть достаточно лёгкой задачей, так?

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

Вы быстро поймёте, что синтаксис легко изучить, но сам по себе он вам не поможет. Это необходимая вещь, но не самодостаточная.

На протяжении следующих уроков мы сфокусируемся на семантике, назначении и рассмотрим несколько крутых идей, которые позволили появиться компьютерам, интернету, роботам и мобильным телефонам. Параллельно мы изучим синтаксис.

Последний момент, который мы затронем перед погружением - это, мм, какой язык выбрать? Их так много и это может казаться критическим моментом. Момент, конечно, критический, но не потому что "нужно принять окончательное решение, которое повлияет на всю оставшуюся жизнь", а потому что мы должны понимать, что выбор языка программирования - это как выбор инструмента для ввода текста, а не человеческого языка.

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

Язык нужно выбрать достаточно хороший, достаточно простой, известный и с хорошими возможностями. В процессе профессионального роста вы БУДЕТЕ переключаться между языками, использовать сразу несколько языков и технологий одновременно и это не будет для вас проблемой, так же как переход с печатной машинки на Microsoft Word - это не проблема.

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

Ну что, давайте начнем программировать!

Основными элементами любого языка программирования являются его алфавит, синтаксис и семантика.

Алфавит – совокупность символов, отображаемых на устройствах печати и экранах и/или вводимых с клавиатуры терминала. Обычно это набор символов Latin-1 с исключением управляющих символов. Иногда в это множество включаются неотображаемые символы с указанием правил их записи (комбинирование в лексемы).

Лексика – совокупность правил образования цепочек символов (лексем), образующих иден­тификаторы (переменные и метки), операторы, операции и другие лексические компоненты языка. Сюда же включаются зарезервированные (запрещенные, ключевые) слова языка программирования, предназначенные для обозначения операторов, встроенных функций и пр. Иногда эквивалентные лексемы, в зависимости от языка программирования, могут обозначаться как одним символом алфавита, так и несколькими. Например, операция присваивания значения в языке Си обозначается как «=», а в языке Паскаль – «:=». Операторные скобки в языке Си задаются символами «{» и «}», а в языке Паскаль – begin и end. Граница между лексикой и алфавитом, таким образом, является весьма условной, тем более что компилятор обычно на фазе лексического анализа заменяет распознанные ключевые слова внутренним кодом (например, begin – 512, end – 513) и в дальнейшем рассматривает их как отдельные символы.

Синтаксис – совокупность правил образования языковых конструкций, или предложений языка программирования – блоков, процедур, составных операторов, условных операторов, опера­торов цикла и пр. Особенностью синтаксиса является принцип вложенности (рекурсивность) правил построения конструкций. Это значит, что элемент синтаксиса языка в своем определении прямо или косвенно в одной из его частей содержит сам себя. Например, в определении оператора цикла телом цикла является оператор, частным случаем которого является все тот же оператор цикла.

Необходимо строгое соблюдение правил правописания (синтаксиса) программы. В частности, в Паскале однозначно определено назначение знаков пунктуации. Точка с запятой (;) ставится в конце заголовка программы, в конце раздела описания переменных, после каждого оператора. Перед словом End точку с запятой можно не ставить. Запятая (,) является разделителем элементов во всевозможных списках: списке переменных в разделе описания, списке вводимых и выводимых величин.

Строгий синтаксис в языке программирования необходим прежде всего для транслятора. Транслятор – это программа, которая исполняется формально. Если, допустим, разделителем в списке переменных должна быть запятая, то любой другой знак будет восприниматься как ошибка. Если точка с запятой является разделителем операторов, то транслятор в качестве оператора воспринимает всю часть текста программы от одной точки с запятой до другой. Если вы забыли поставить этот знак между какими-то двумя операторами, то транслятор будет принимать их за один, что неизбежно приведет к ошибке.

Основное назначение синтаксических правил – придать однозначный смысл языковым конструкциям. Если какая-то конструкция может трактоваться двусмысленно, значит, в ней обязательно содержится ошибка. Лучше не полагаться на интуицию, а выучить правила языка.

Для описания синтаксиса языка программирования тоже нужен какой-то язык. В этом случае речь идет о метаязыке («надъязыке»), предназначенном для описания других языков. Наиболее распространенными метаязыками в литературе по программированию являются металингвистические формулы Бекуса – Наура (язык БНФ) и синтаксические диаграммы. Язык синтаксических диаграмм более нагляден, легче воспринимается.

В БНФ всякое синтаксическое понятие описывается в виде формулы, состоящей из правой и левой части, соединенных знаком::=, смысл которого эквивалентен словам «по определению есть». Слева от знака::= записывается имя определяемого понятия (метапеременная), которое заключается в угловые скобки < >, а в правой части записывается формула или диаграмма, определяющая все множество значений, которые может принимать метапеременная.

Синтаксис языка описывается путем последовательного усложнения понятий: сначала опреде­ляются простейшие (базовые), затем все более сложные, включающие в себя предыдущие понятия в качестве составляющих.

В такой последовательности, очевидно, конечным определяемым понятием должно быть понятие программы.

В записях метаформул приняты определенные соглашения. Например, формула БНФ, опре­деляющая понятие «двоичная цифра», выглядит следующим образом:

<двоичная цифра>::=0|1

Значок «|» эквивалентен слову «или».

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

Понятие «двоичный код» как непустую последовательность двоичных цифр БНФ описывает так:

<двоичный код>::=<двоичная цифра>|<двоичный

код><двоичная цифра>

Определение, в котором некоторое понятие определяется само через себя, называется рекурсивным. Рекурсивные определения характерны для БНФ.

Возвратная стрелка обозначает возможность многократного повторения. Очевидно, что диа­грамма более наглядна, чем БНФ.

Синтаксические диаграммы были введены Н. Виртом и использованы для описания созданного им языка Паскаль.

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

Используя математическую терминологию, мы можем определить язык как объект, включающий в себя следующие компоненты:

    Множество информации или «смыслов», характеризующее план содержания данного языка;

    Множество « текстов », т.е. последовательностей физических сигналов, которые характеризуют план выражения данного языка;

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

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

Элементами множества текстов являются тексты или предложения языка, подчиняющиеся строгим правилам построения.

Правила, описывающие входящие в язык тексты как цепочки некоторых символов, называются синтаксисом , а правила, определяющие смысловую сторону входящих в язык цепочек, т.е. приписывающие им определенные смысловые значения, – семантикой данного языка.

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

Т А – множество текстов языка А ,

Т В – множество текстов языка В ,

S – множество смыслов языков А и В (для простоты считаем, что смысловые множества языков совпадают),

f А – функция, отображающая Т А в S ,

f B – функция, отображающая S в Т В .

    Семантический (смысловой) перевод:

f А : Т А S f B : S Т В

Пусть имеется некоторый текст t Т А , тогда:

    f А (t ) = s S

    f B (s ) t’ Т В .

Итак, переводом текста t Т А является текст t Т В .

    Формальный перевод.

Этот способ заключается в явном задании алгоритма вычисления функции, являющейся суперпозицией функций f А и f B . Обозначим эту суперпозицию через I AB .

I AB = f B (f А (t )).

3.2. Нормальные формы Бекуса

Определение : Язык, описывающий свойства другого языка, называют метаязыком .

Так, метаязыком, описывающим русский язык, может быть тот же самый русский язык или другой разговорный язык, например английский. Описание языков программирования обычными средствами оправдано только в том случае, если оно используется лишь для изучения этих языков программистами-пользователями. В настоящее время используется ряд языков для описания синтаксиса алгоритмических языков для дальнейшей обработки и изучения математическими средствами. Это так называемые метасинтаксические языки . Разрабатываются также специальные языки для описания семантики – метасемантические языки .

Наиболее распространенным метасинтаксическим языком являются нормальные формы Бекуса (или металингвистические формулы). Основное назначение форм Бекуса заключается в представлении в сжатом и компактном виде строго формальных и однозначных правил написания основных конструкций описываемого языка программирования.

Классы объектов, которые используются в формах Бекуса:

    Цепочка основных символов языка.

    Имена конструкций описываемого языка, или так называемые металингвистические переменные . Значение металингвистических переменных – это цепочки основных символов описываемого языка.

    Металингвистическая связка :: = . Она соединяет левую и правую части формулы.

Каждый вариант представляет собой цепочку, состоящую из металингвистических переменных и основных символов. Для того, чтобы построить определяемую формулой конструкцию, нужно выбрать некоторый вариант построения из правой части формулы и, используя соответствующие формулы, подставить вместо каждой металингвистической переменной некоторые цепочки основных символов. Варианты правой части формулы разделяются металингвистической связкой |, имеющей значение «или». Металингвистическая переменная обозначается словами, заключенными в угловые скобки < >, которые поясняют смысл описываемой конструкции.

Числа определяются в языке при помощи следующих правил:

    <число>:: = <число без знака> | + <число без знака>| – <число без знака>

    <число без знака> :: = <десятичное число> | <порядок> | <десятичное число> <порядок>

    <десятичное число> :: = <целое без знака> | <правильная дробь> | <целое без знака> <правильная дробь>

    <порядок> :: = e <целое>

    <правильная дробь> ::= .<целое без знака>

    <целое> ::= <целое без знака> | + <целое без знака> | – <целое без знака>

    <целое без знака> :: = <цифра> | <целое без знака> <цифра>

    <цифра> :: = 0|1|2|3|4|5|6|7|8|9

Пример 7: Вывод по формулам числа 1.5 e -2

<число>, <число без знака>, <десятичное число> <порядок>, <целое без знака> <правильная дробь> <порядок>, <цифра> <правильная дробь> <порядок>, 1 <правильная дробь> <порядок >, 1. <целое без знака> <порядок>, 1. <цифра> <порядок>, 1. 5 <порядок>, 1. 5e<целое>, 1. 5 e- <целое без знака>, 1. 5e- <цифра> , 1. 5 e-2 .

Интересной особенностью металингвистических формул является наличие в них рекурсий , т.е. использование для описания некоторых конструкций самих описываемых конструкций.

Во всяком языке программирования определены способы организации данных и способы организации действий над данными. Кроме того, существует понятие «элементы языка», включающее в себя множество символов (алфавит), лексемы и другие изобразительные средства языка программирования. Несмотря на разнообразие указанных языков, их изучение происходит приблизительно по одной схеме. Это связано с общностью структуры различных языков программирования высокого уровня, которая схематически отражена на рис. 1.12.

Рис. 1.12. Структуры языка программирования высокого уровня

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

Язык программирования имеет три основные составляющие: алфавит, синтаксис и семантику.

Синтаксис языка программирования – совокупность правил написания чисел, переменных, выражений, операторов, процедур и других элементов и синтаксических конструкций данного языка программирования.

Семантика языка программирования – совокупность правил, определяющих смысл чисел, переменных, выражений, операторов, процедур и других элементов и синтаксических конструкций данного языка программирования.

Соблюдение правил в языке программирования должно быть более строгим, чем в разговорном языке.

Для описания синтаксиса языка программирования тоже нужен какой-то язык. В этом случае речь идет о метаязыке («надъязыке»). Метаязык – язык, используемый для описания других языков. Наиболее распространенными метаязыками являются металингвистические формулы Бекуса-Наура (язык БНФ) и синтаксические диаграммы. В дальнейшем мы чаще всего будем использовать язык синтаксических диаграмм. Он более нагляден, легче воспринимается. В некоторых случаях для удобства мы будем обращаться к отдельным элементам языка БНФ.

В БНФ всякое синтаксическое понятие описывается в виде формулы, состоящей из правой и левой части, соединенных знаком::=, смысл которого эквивалентен словам «по определению есть». Слева от знака::= записывается имя определяемого понятия (метапеременная), которое заключается в угловые скобки < >, а в правой части записывается формула или диаграмма, определяющая все множество значений, которые может принимать метапеременная.

Синтаксис языка описывается путем последовательного усложнения понятий: сначала определяются простейшие (базовые), затем все более сложные, включающие в себя предыдущие понятия в качестве составляющих.

В такой последовательности, очевидно, конечным определяемым понятием должно быть понятие программы.

В записях метаформул приняты определенные соглашения. Например, формула БНФ, определяющая понятие «двоичная цифра», выглядит следующим образом:

<двоичная цифра>::=0|1.

Значок | эквивалентен слову «или». Это определение можно представить на языке синтаксических диаграмм (рис. 1.13).

Рис. 1.13. Понятие «двоичная цифра» на языке синтаксических диаграмм

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

Понятие «двоичный код» как непустую последовательность двоичных цифр БНФ описывает так:

<двоичный код> ::= <двоичная цифра> | <двоичный код> <двоичная цифра>.

Определение, в котором некоторое понятие определяется само через себя, называется рекурсивным. Рекурсивные определения характерны для БНФ.

Синтаксическая диаграмма двоичного кода представлена на рис. 1.14.

Рис. 1.14. Синтаксическая диаграмма двоичного кода

Возвратная стрелка обозначает возможность многократного повторения. Очевидно, что диаграмма более наглядна, чем БНФ.

Синтаксические определения языка программирования состоят из имени, определяемого в настоящий момент и не определенного где-либо выше термина, за которым следует двоеточие (:). Альтернативы обычно следуют за этим в отдельных строках, но могут также помещаться и в одной строке, в таком случае им предшествует фраза «одно из».

Грамматические правила лексики языка рассматриваются с точки зрения существования раз-личных категорий словоориентированных языковых единиц (лексем), распознаваемых компилятором. Грамматические правила структуры фраз подробно определяют допустимые способы группирования лексем в выражения, операторы и прочие смысловые единицы языка.

Например, лексемы языка C++ образуются из последовательности операций, выполняемых с программой компилятором и препроцессором языка.

Программа на языке C++ – последовательность ACSII-символов, представляющих собой ее исходный код, создаваемый при работе в текстовом редакторе.

Базовая программная единица в языке C++ представляет собой файл. Обычно такой файл соответствует файлу ОС, находящемуся в оперативной памяти или на диске и имеющему созданное по правилам ОС имя и расширение.С или.СРР.

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

ASCII-символы, обычно рассматриваемые как пробельные, могут входить в строки литералов и в данном случае будут защищены от нормального процесса разбиения на лексемы и пробелы.

Комментарии – текстовые части, предназначенные для аннотирования программы. Комментарии перед лексическим анализом исключаются из исходного текста программы.

Традиционный комментарий языка С представляет собой любую последовательность символов, помещаемую после пары символов /*. Признаком конца комментария служит первая пара символов */, встретившаяся после исходной пары /*.

Компилятор языка C++ распознает лексемы шести классов: ключевые слова, идентификаторы, константы, строковые литералы, операции и знаки пунктуации (также называемые разделителями). Формальное описание лексемы имеет следующий вид:

– ключевое слово;

– идентификатор;

– константа;

– строковый литерал;

– операция;

– знак пунктуации.

Во время лексического анализа исходного кода выбирается лексема максимальной длины. Например, слово external будет рассматриваться как отдельный идентификатор, а не как ключевое слово extern, за которым следует идентификатор al.

Ключевые слова – слова, зарезервированные для специальных целей, которые не должны использоваться в качестве обычных имен идентификаторов.

Формальное определение идентификатора имеет следующий вид:

– не-цифра;

– идентификатор не-цифра;

– идентификатор цифра.

Не-цифра: одно из

abcdefghijklmnopqrstuvwxyz_ ;

ABCDEFGHIJKLMNOPQRSTUVWXYZ;

цифра: одно из

Идентификатор – произвольное имя любой длины, присваиваемое классам, объектам, функциям, переменным, определяемым пользователем типам данных и т.д. Идентификаторы могут содержать буквы от А до Z и от а до z, символ подчеркивания (_) и цифры от 0 до 9. Существуют только два ограничения:

– первый символ должен являться буквой или символом подчеркивания;

– уникальность и контекст идентификаторов.

Хотя имена идентификаторов могут быть произвольными (в пределах изложенных правил), в случае использования одного и того же имени для более чем одного идентификатора в пределах одного контекста и разделении ими одного пространства имен возникает ошибка. Повторение имен в различных пространствах имен допустимо всегда, независимо от контекста.

Константами называются лексемы, представляющие собой фиксированные числовые или символьные значения. Тип данных константы определяется компилятором по таким ключевым характеристикам, как числовое значение и формат, используемым при записи константы в исходном коде. Определение формата константы:

– константа-с-плавающей-точкой;

– целочисленная-константа;

– перечислимая-константа;

– символьная-константа.

Операциями называются лексемы, вызывающие некоторые вычисления с переменными и объектами, указанными в выражении. Набор операций C++ включает в себя помимо обычных арифметических и логических операций средства манипуляции с данными на битовом уровне, доступа к компонентам структур и объединений, а также операции с указателями (установка и обращение по ссылке).

Контекст, видимость, продолжительность и тип компоновки определяют части программы, из которых могут быть сделаны допустимые ссылки на идентификатор с целью доступа к соответствующему объекту.

Объект – идентифицируемая область памяти, которая может содержать фиксированное значение переменной (или набор таких значений). Каждая величина имеет связанное с ней имя и тип (который также называют типом данных). Имя используется для доступа к объекту. Имя может являться простым идентификатором либо сложным выражением, уникальным образом «указывающим» на данный объект.

Тип используется:

– для определения требуемого количества памяти при ее исходном распределении;

– для интерпретации битовых кодов, находимых в объектах при последующих к ним обращениях;

– в ситуациях контроля, требуемого для обнаружения возможных случаев недопустимого присваивания.

Объявления устанавливают необходимые соотношения распределения памяти между идентификаторами и объектами. Каждое объявление связывает идентификатор с некоторым типом данных. Большинство объявлений, известных как объявления определения, также задают создание (где и когда) объекта, иначе говоря, распределение физической памяти и ее возможную инициализацию. Прочие объявления, называемые объявлениями ссылки, просто делают указанные в них идентификаторы известными компилятору. Один и тот же идентификатор может иметь множество объявлений ссылки, особенно в многофайловых программах, однако для каждого идентификатора допустимо только одно объявление определения.

Для связи идентификаторов с объектами требуется, чтобы каждый идентификатор имел как минимум два атрибута: класс памяти и тип (иногда его называют типом данных).

Класс памяти задает размещение объекта (сегмент данных, регистр, куча или стек) и продолжительность времени его существования (все время работы программы либо же при выполнении некоторых конкретных блоков кода). Класс памяти может быть установлен синтаксисом объявления, расположением в исходном коде или обоими этими факторами.

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

Контекст идентификатора – часть программы, в которой данный идентификатор может быть использован для доступа к связанному с ним объекту. Существуют пять категорий контекста:

– функция;

– прототип функции;

Контекст зависит от того, как и где объявлены идентификаторы.

Идентификатор, имеющий контекст типа блока (или локального контекста), начинается в точке объявления и заканчивается в конце блока, содержащего данное объявление (такой блок называется объемлющим блоком). Объявления параметров в определении функции также имеют контекст типа блока и ограничены контекстом блока, где эта функция определена.

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

Идентификаторы, объявленные в списке объявлений параметров в прототипе функции (не являющиеся частью определения функции), имеют контекст прототипа функции. Конец этого контекста совпадает с концом прототипа функции.

Идентификаторы с контекстом файла, называемые часто глобальными, объявляются вне всех блоков и классов; их контекст лежит между точкой объявления и концом исходного файла.

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

Пространство имен – это контекст, в пределах которого идентификатор должен быть уникальным.

Видимость идентификатора – область исходного кода программы, из которого допустим нормальный доступ к связанному с идентификатором объекту.

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

Видимость не может выходить за пределы контекста, но контекст может превышать видимость.

Загрузочный модуль (выполняемая программа) создается из полученных в результате раздельной компиляции объектных модулей с автоматическим поиском и присоединением библиотечных подпрограмм и процедур. Компоновка – это процесс, который позволяет правильно связать каждое вхождение идентификатора с одним конкретным объектом или функцией. Все идентификаторы имеют один из трех атрибутов компоновки, тесно связанных с их контекстом: внешняя компоновка, внутренняя компоновка или отсутствие компоновки. Эти атрибуты определяются местоположением и форматом объявлений, а также явным (или неявным по умолчанию) использованием спецификатора класса памяти.

Каждое вхождение конкретного идентификатора с типом компоновки внешняя представляет тот же самый объект или функцию во всех файлах и библиотеках, составляющих программу.

Идентификаторы с типом компоновки отсутствие представляют уникальные элементы программы.

Правила внешней и внутренней компоновки:

– любой идентификатор объекта или файла, имеющий файловый контекст, будет иметь внутренний тип компоновки, если его объявление содержит спецификатор класса памяти static ;

– если объявление идентификатора объекта или функции содержит спецификатор класса памяти extern , то идентификатор имеет тот же тип компоновки, что и видимое объявление идентификатора с файловым контекстом. Если такого видимого объявления не имеется, то идентификатор будет иметь внешний тип компоновки;

– если функция объявлена без спецификатора класса памяти, то ее тип компоновки определяется, как если бы был использован спецификатор класса памяти extern ;

– если идентификатор объекта с файловым контекстом объявлен без спецификатора класса памяти, то идентификатор имеет внешний тип компоновки.

Все шесть взаимосвязанных атрибутов (класс памяти, тип, контекст, видимость, продолжительность и тип компоновки) могут быть определены разными способами с помощью объявлений.

Различают объявления определения (их обычно просто называют объявлениями) и объявления ссылки (иногда называемыми неопределяющими объявлениями). Объявление определения, как и следует из названия, выполняет две функции: объявления и определения. Неопределяющие объявления требуют наличия где-либо далее в программе определений. Объявление ссылки просто вводит в программу одно или более имен идентификаторов. Определение фактически распределяет объекту память и связывает идентификатор с этим объектом.

В число объектов, которые могут быть объявлены, входят:

– переменные;

– функции;

– классы и компоненты классов;

– компоненты структур;

– компоненты объединений;

– массивы прочих типов;

– перечислимые константы;

– метки операторов.

Спецификатор типа с одним или более модификатором используется для задания типа объявляемого идентификатора.

Типы делятся на фундаментальные и производные. К фундаментальным типам относятся: void, char, int, float, double, short, long, signed, а также некоторые варианты unsigned. Производные типы включают в себя указатели и ссылки на другие типы, массивы других типов, типы функций, типы классов, структуры и объединения. Объект класса может, например, содержать некоторое число объектов различных типов вместе с функцией манипуляции этими объектами, плюс механизм контроля доступа и наследования от других классов.

Фундаментальные спецификаторы типа создаются из следующих ключевых слов:

char, int, signed, double, long, unsigned, float, short.

На базе этих ключевых слов можно построить интегральные типы и типы с плавающей точкой, которые в совокупности называются арифметическими типами. Типы char, short, int и long называются интегральными типами.

Простые объявления идентификаторов переменных имеют следующий шаблон:

тип данных перем1 <=иниц1>, перем2 <=иниц2>,...;

где перем1, перем2, ... – это произвольная последовательность отдельных идентификаторов. Каждая из переменных объявляется с указанным типом данных.

Указатели делятся на две основные категории: указатели объектов и указатели функций. Указатели обоих типов представляют собой специальные объекты, хранящие адреса памяти. Два этих класса указателей имеют отличные друг от друга свойства, назначения и правила манипулирования, хотя и те, и другие разделяют между собой определенные операции. Указатели функций используются для доступа к функциям и для передачи одних функций другим в качестве аргументов; выполнение арифметических операций с указателями функций не допускается. Указатели объектов при сканировании массивов или более сложных структур памяти регулярно инкрементируются и декрементируются.

«Указатель на объект типа type» содержит (то есть указывает) адрес объекта с типом type. Поскольку указатель сам по себе является объектом, то можно установить указатель на указатель. В число прочих объектов, на которые обычно устанавливается указатель, входят массивы, структуры и классы. Размер указателей объектов зависит обычно от модели памяти, размера и расположения сегментов данных.

Указатель функции лучше всего рассматривать как адрес, обычно в кодовом сегменте, где располагается выполняемый код функции. Это адрес, по которому передается управление при вызове функции. Размеры и расположение кодовых сегментов программы определяются действующей моделью памяти и в свою очередь определяют размер указателей функций, которые нужны для вызова функций.

Указатель функции имеет тип «указатель функции, возвращающей тип type», где type есть тип возвращаемых функцией данных.

Объявление указателя всегда должно устанавливать его на некоторый конкретный тип, даже если этот тип void (что фактически означает указатель на любой тип). Однако уже после объявления указатель обычно может быть переназначен на объект другого типа. Указатель со значением null – это адрес, гарантированно отличный от любого допустимого указателя, используемого в программе. Присвоение указателю целой константы 0 определяет его значение null.