Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
билеты мини.docx
Скачиваний:
2
Добавлен:
01.07.2025
Размер:
154 Кб
Скачать
☆

Вопрос 10. Концепция связывания, способы связи переменных с памятью

Связывание — процесс установления некоторой связи, например, между атрибутом и объектом или между операцией и символом. Момент установления связи называется временем связывания (binding time).

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

Например, символ звездочки (*) обычно связывается с операцией умножения в процессе создания языка, а тип данных INT/INTEGER с некоторым диапазоном возможных значений целых чисел во время реализации языка. В языках C и Pascal переменная связывается с конкретным типом данных, а вызов библиотечной функции с её командами при компиляции программы.

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

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

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

Связывание переменных с ячейками памяти

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

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

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

Явные динамические переменные — это безымянные (абстрактные) ячейки памяти, размещаемые и удаляемые с помощью явных команд периода выполнения, определяемых программистом. Обращаться к этим переменным можно только с помощью указателей и ссылок. Память для таких переменных извлекается из так называемой кучи (heap), которая представляет собой неорганизованный набор ячеек. Явные динамические переменные создаются либо специальным оператором, как, например, в языках Ada и C++, либо вызовом предусмотренной для этого системной подпрограммы, как в языке C. Кроме того, в некоторых языках, в частности в C++, есть средства уничтожения таких переменных. Явные динамические переменные часто применяются для организации различных динамических структур, таких как связанные списки и деревья, которые могут «увеличиваться» и «уменьшаться» во время выполнения программы. Также такие переменные используются в объектно-ориентированном программировании для работы с объектами.

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

Именованной константой называется переменная, связываемая со своим значением только во время связывания её с ячейкой памяти. Значение именованной константы невозможно изменить оператором присваивания или ввода.