№55 Переменные в языках программирования. Имя, тип и значение переменной. Область видимости и время жизни переменной

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

В некоторых языках программирования, таких как Пролог, РЕФАЛ или Scheme, понятие переменной оказывается при внешней схожести совершенно иным; в таких языках переменная однозначно определяется как имя, с которым может быть связано значение или даже (как в языке Scheme) место (location) для хранения значения.

Классификация
Статическая и динамическая типизация переменных

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

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

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

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

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

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

По наличию внутренней структуры, переменные могут быть простыми или сложными (составными).

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

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

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

Переменная в программировании (тип, имя, значения). Операция присваивания.

Переменные предназначены для хранения и обработки данных.

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

Переменная в программе представлена именем и служит для обращения к данным определенного типа. Конкретное значение переменной хранится в ячейках оперативной памяти.

Тип переменной. Тип переменной определяется типом данных, которые могут быть значениями переменной. Значениями переменных числовых типов (Byte, Integer, Long, Single, Double) являются числа, логических (Boolean) – True или False, строковых (String) – последовательности символов и так далее. Обозначения типов переменных являются ключевыми словами языка и поэтому выделяются.

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

Различные типы данных требуют для своего хранения в оперативной памяти компьютера различное количество ячеек (байтов). Для хранения целых чисел в интервале от 0 до 255 в переменных типа Byte достаточно одного байта; для хранения вещественного числа с двойной точностью в переменных типа Double требуется уже восемь байтов, а для хранения символьных строк в переменных типа String требуется один байт на каждый символ.

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

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


Время жизни и область видимости программных объектов

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

1. Переменная, объявленная глобально (т.е. вне всех блоков), существует на протяжении всего времени выполнения программы.

2. Локальные переменные (т.е. объявленные внутри блока) с классом памяти register или auto, имеют время жизни только на период выполнения того блока, в котором они объявлены. Если локальная переменная объявлена с классом памяти static или extern, то она имеет время жизни на период выполнения всей программы.

Видимость переменных и функций в программе определяется следующими правилами.

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

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

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

4. Функции с классом памяти static видимы только в исходном файле, в котором они определены. Всякие другие функции видимы во всей программе.

Метки в функциях видимы на протяжении всей функции.

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

Hosted by uCoz