Р.У. Себеста - Основные копцепции языков программирования (2001) (1160794), страница 48
Текст из файла (страница 48)
Момент времени, когда переменная связывается с адресом, очень важен для понимания языков программирования. Подробнее этот вопрос рассмотрен в разделе 4.4.3. 17В Глава 4. Имена, связывание, проверка типов и области видимости 4.3.3. Тип Тип (зуре) переменной опрелеляет диапазон значений, которые может иметь переменная, и набор операций, предусмотренных лля переменных этого типа.
Например, для типа 1БТЕСЕй в некоторых реализациях языка гОЯТЯА)ч устанавлен диапазон значений от -32 768 до 32 767 и определены арифметические операции сложения, вычитания, умножения, деления н возведения в степень, а также некоторые библиотечные функции для выполнения других операций, например, вычисления абсолютной величины числа. 4.3.4. 3 е Значение переменной — это содержимое ячейки или ячеек памяти, связанных с данной переменной. Память компьютера улобно представлять себе в терминах абстрактных ячеек, а не физических. Ячейки, или отдельно адресуемые единицы, большинства современных компьютеров имеют размер, равныЯ байту, как правило, солержашему восемь битов. Этот размер слишком мал для большинства программных переменных. Мы будем считать, что абстрактная ячейка памяти имеет размер, достаточный для хранения связанной с неЯ переменной.
Несмотря на то что числа с плаваюшей точкой в отлельной реализации конкретного языка могут занимать четыре физических байта, мы считаем, что число с плаваюшей точкой занимает одну абстрактную ячейку памяти. Мы полагаем, что величина любого элементарного неструктурированного типа занимает отдельную абстрактную ячейку. С этого момента под ячейкой памяти мы будем подразумевать абстрактную ячеЯку памяти. Значение переменной иногда называется ее правым значением (г-ча!це).
поскольку именно оно необходимо при использовании переменной, указанной в правой части оператора присваивания. Для того чтобы получить доступ к правому значению переменной, вначале следует опрелелить ее левое значение. Значительно усложнить этот процесс могут, например, правила обзора данных, как это показано в разделе 4.8. 4.4. Концепция связывания В общем смысле, связывание (Ъ|пб(п8) представляет собой процесс установления связи, аналогичной сушествуюшей между атрибутом и объектом или между операцией и символом.
Момент времени, когда эта связь устанавливается, называется временем связывании (Ь(п41пй типе). Связывание и время связывания — важные понятия семантики языков программирования. Связывание может происходить во время разработки или реализации языка; при компиляции, загрузке или выполнении программы. Звезлочка (*), например, обычно связывается с операцнеЯ умножения во время разработки языка. Тип данных, например тип 1ИТЕ6Ей в языке ГОЯТ)(АН, связывается с диапазоном возможных значениЯ во время реализации языка.
В языках С и Разов! переменная связывается с конкретным типом данных во время компиляции программы. Вызов библиотечной подпрограммы связывается с командами подпрограммы при компиляции. Переменная может связываться с ячейкой памяти при загрузке программьг в память. Аналогичное связывание в некоторых случаях не происходит вплоть до времени выполнения программы, например, лля переменных, объявленных в подпрограммах языка Разса), или функций языка С (если объявления не содержат спецификатор з С а к 1 с). 1У9 4.4. Концепция связывания Рассмотрим следующий оператор присваивания языка С с указанным определенпсч переменной соцпс: дпа соцпсг ссопс = ссцпс + 5; Ниже приведены некоторые виды связывания и времен связывания для частей оператора присваивания. ° Множество возможных типов переменной соцпс: связывание во время разработки языка. ° Тип переменной соцпс: связывание во время компиляции.
° Множество возможных значений переменной соцпс: связывание при разработке компилятора. ° Значение переменной соцпс:связывание во время выполнения указанногооператора. ° Множество возможных значений функционального символа +: связывание во время разработки языка. ° Смысл функционального символа + в данном операторе: связывание во время компиляции. ° Внутреннее представление константы 5: связывание во время разработки компилятора. Для того чтобы разобраться в семантике языка программирования, необходимо понять, что такое время связывания арибутов с сущностями программы. Например, необходимо знагь. как при вызове подпрограммы фактические параметры связываются с формальными параметрами в ее определении. Для того чтобы определить текущее значение переменной.
нужно узнать, когла данная переменная была связана с ячейкой памяти. 4.4.1. Связывание атрибутов с переменными Связывание называется статическим (згайс), если оно выполняется до выполнения программы и не меняется во время ее выполнения. Если связывание происходит во вречя выполнения программы или может меняться в ходе ее выполнения, то оно называется динамическим (дупапйс). Физическое связывание переменной с ячейкой в среде виртуальной памяти — сложный процесс, поскольку страница или сегмент адресного пространства, в котором находится ячейка, во время выполнения программы может мною- кратно загружаться и выгружаться из памяти. В некотором смысле такие переменные чногократно связываются и открепляются.
Такие связи, однако, поддерживаются аппаратным обеспечением компьютера, а программе и пользователю эти изменения не вилны. Поскольку это не представляет интереса для обсуждения, мы не фокусируем внимание на аппаратном связывании. Главным моментом для нас являются различия между статическим н динамическим связываниями. 4.4.2. Связывание типов Прежле чем к переменной программы можно будет обращаться, она должна быть связана с типом ланных. При этом необходимо рассмотреть два важных аспекта этого связывания: каким образом указывается этот тип и когда происходит связывание. Типы могут определяться статически с помощью некоторой формы явного или неявного объявления.
1ВО Глава 4. Имена, связывание, проверка типов и области видимости 4.4.2.1. Объввпение переменных Явное объявление (ехрйсй бес(агайоп) — это оператор программы, перечисляющий имена переменных и устанавливаюший. что они имеют определенный тип. Неявное объявление(ипрссй бес(агайоп) — это средство связывания переменных с типамн посредством принятых по умолчанию соглашений. а не операторов объявления. В этом случае первое появление имени переменной в программе является ее неявным объявлением. И явное.
и неявное объявления создают статические связи с типами. Большинство языков программирования, созданных с середины )960-х годов. требуют явного объявления всех переменных (двумя исключениями являются языки Рег! и МЕ). Некоторые широко используемые языки, первоначальные работы по созданию которых были проведены в конце )960-х голов, допускают неявные объявления переменных, особенно это касается языков РОКТКАН. Р1Л и ВАЯС.
Например, в программах иа языке РОКТКАХ идентификатор, для которого не было выполнено явного объявления, объявляется неявно в соответствии со следующим соглашением: если идентификатор начинается с одной из букв 1, 1. К, Е. И или (Ч, то неявно объявлено, что он имеет тип 1(ДТЕ0ЕК; в противном случае неявно объявлено, что он имеет тип КЕАЬ.
Неявные объявления могут нанести серьезный ущерб надежности программы. поскольку они препятствуют выявлению на этапе компиляции различных опечаток или программистских ошибок. Переменные, которые программистом были случайно оставлены необъявленными, получат типы по умолчанию и будут иметь неожиданные атрибуты, что может вызвать неявные ошибки, которые трулно обнаружить. Некоторых проблем. связанных с неявными обьявлениями, можно избежать.
требуя, чтобы имена отдельных типов начинались с конкретных специальных символов. Например, в языке Рег! все имена, начинаюшиеся с символа 5, являются скалярными величинами, которые могут быть строкой или числом. Если имя начинается с символа С. то именуемая им сушность является массивом; если имя начинается с символа Ъ. то оно обозначает хешированную структуру ()зазй игцсшге). Подобный полход создает различные пространства имен для различных типов переменных. При таком сценарии имена барр1е и (арр1в не связаны между собой.
поскольку принадлежат различным пространствам имен. Более того. тнп переменной определяется ее именем. В языках С и С++ необходимо различать объявления и определения. Обьявления устанавливают типы и другие атрибуты, но не приводят к распределению памяти. Определения устанавливают атрибуты и вызывают распределение памяти. Для конкретного имени в программе на языке С может содержаться любое количество согласованных объявлений, но только одно определение. В языке С можно объявлять переменные, внешние по отношению к функции.
Объявление указывает компилятору тип переменной и то, что она гле-то была опрелелена. Эта идея переносится на функции языков С и С++, в которых прототипы объявляют имена и интерфейсы, но не команды функций. С другой стороны, определения функций являются полными. 4.4.2.2. Динамическое сввдывание типов При динамическом связывании в операторе объявления тип не указывается.