- •Вопрос 4. Деревья синтаксического анализа.
- •Генерация дерева синтаксического анализа
- •Вопрос 5. Приоритет операторов. Ассоциативность операторов.
- •Вопрос 6. Расширенная форма Бэкуса-Наура и синтаксические графы.
- •Вопрос 10. Концепция связывания, способы связи переменных с памятью
- •Вопрос 11. Арифметические выражения, порядок вычисления операторов.
- •Вопрос 12. Перегруженные операторы
- •Вопрос 13. Преобразование типов.
- •Вопрос 15. Операторы присваивания.
- •Вопрос 16.Структура операторов управления. Составной оператор и оператор ветвления (2 варианта).
- •Вопрос 14. Отношения и булевские выражения. Сокращенные вычисления.
- •Вложенные операторы ветвления и замыкание операторов ветвления.
- •I. Вложенные операторы ветвления.
- •Многовариантные операторы ветвления.
- •Вопрос 19. Операторы цикла. Циклы со счетчиком. Оператор do в Fortran. Оператор цикла в Pascal, algol 60.
- •Вопрос 21. Логически управляемые циклы.
- •Вопрос 22. Циклы с механизмом управления, размещаемым пользователем.
Вопрос 10. Концепция связывания, способы связи переменных с памятью
Связывание — процесс установления некоторой связи, например, между атрибутом и объектом или между операцией и символом. Момент установления связи называется временем связывания (binding time).
Связывание может происходить во время разработки или реализации языка, а также в ходе компиляции, загрузки или выполнения программы.
Например, символ звездочки (*) обычно связывается с операцией умножения в процессе создания языка, а тип данных INT/INTEGER с некоторым диапазоном возможных значений целых чисел во время реализации языка. В языках C и Pascal переменная связывается с конкретным типом данных, а вызов библиотечной функции с её командами при компиляции программы.
Переменная может связываться с ячейкой памяти при загрузке программы в память или перед началом выполнения фрагмента, в котором к ней обращаются, например, в случае переменных, объявленных в подпрограммах на языке Pascal.
Статическое связывание типов может осуществляться с помощью некоторой формы явного или неявного объявления. Явное объявление — это оператор программы, перечисляющий имена переменных и устанавливающий определенный тип для них. Примером является оператор объявления переменной в разделе var на языке Pascal. Неявное объявление — это способ связывания переменных с типами в соответствии с принятыми по умолчанию соглашениями, без использования специальных операторов. В этом случае первое появление имени переменной в программе является её неявным объявлением. Неявные объявления могут значительно снизить надежность программы и привести к появлению трудноуловимых ошибок, поскольку соответствующие переменные получают типы по умолчанию и способны иметь неожиданные атрибуты.
При динамическом связывании в операторе объявления тип не указывается. Переменная связывается с типом при присвоении ей значения посредством оператора присваивания. Основное преимущество динамического вида связывания заключается в том, что оно обеспечивает значительную гибкость программирования, по сравнению со статическим. Однако динамическое связывание имеет два существенных недостатка. Во-первых, присвоение переменной одного типа значения другого типа не будет считаться ошибкой с точки зрения системы реализации языка. Поэтому данный тип связывания может послужить причиной появления трудноуловимых ошибок. Другой недостаток динамического связывания состоит в снижении эффективности выполнения программы, так как требуется дополнительное время на проверку и преобразование типов и перераспределение памяти, а также требуются дополнительные ресурсы для хранения в памяти сведений о текущем типе каждой переменной.
Связывание переменных с ячейками памяти
Связывание переменной с ячейкой памяти происходит посредством выделения свободной ячейки из пула доступной памяти. Этот процесс называется размещением в памяти. Обратный процесс называется удалением из памяти и связан с перемещением открепленной от переменной ячейки памяти обратно в пул доступной памяти. Время жизни переменной начинается в момент её связывания с некоторой ячейкой памяти и заканчивается в момент её открепления от этой ячейки. В соответствии с вариантами времени жизни можно выделить следующие категории скалярных (неструктурированных) переменных.
Статические переменные связываются с ячейкой памяти до начала выполнения программы и остаются связанными с ней в течение всего времени работы программы. Статические переменные можно использовать для организации глобальных переменных, а также переменных внутри подпрограмм, которые должны зависеть от предыстории, т.е. сохранять свои значения между отдельными вызовами подпрограммы.
Автоматические переменные связываются с памятью при обработке их операторов объявления, но соответствующие им типы связываются статически. Память автоматическим переменным выделяется из стека выполняемой программы. Таким образом, распределение памяти и связывание происходит в процессе выполнения программы при достижении фрагмента кода, включающего объявление переменной. Автоматические переменные используются, в частности, при организации работы рекурсивных подпрограмм.
Явные динамические переменные — это безымянные (абстрактные) ячейки памяти, размещаемые и удаляемые с помощью явных команд периода выполнения, определяемых программистом. Обращаться к этим переменным можно только с помощью указателей и ссылок. Память для таких переменных извлекается из так называемой кучи (heap), которая представляет собой неорганизованный набор ячеек. Явные динамические переменные создаются либо специальным оператором, как, например, в языках Ada и C++, либо вызовом предусмотренной для этого системной подпрограммы, как в языке C. Кроме того, в некоторых языках, в частности в C++, есть средства уничтожения таких переменных. Явные динамические переменные часто применяются для организации различных динамических структур, таких как связанные списки и деревья, которые могут «увеличиваться» и «уменьшаться» во время выполнения программы. Также такие переменные используются в объектно-ориентированном программировании для работы с объектами.
Неявные динамические переменные связываются с ячейкой памяти в момент присваивания им значения. Каждый раз при присвоении переменной некоторого значения фактически выполняется связывание всех её атрибутов. В упрощенном виде такие переменные можно рассматривать как имена, приспособленные для любого требуемого использования.
Именованной константой называется переменная, связываемая со своим значением только во время связывания её с ячейкой памяти. Значение именованной константы невозможно изменить оператором присваивания или ввода.
