В.Г. Абрамов, Н.П. Трифонов, Г.Н. Трифонова - Введение в язык Паскаль (1107618), страница 55
Текст из файла (страница 55)
ЯКОВЛЕВСЕРГЕЙАНДРЕЕВИЧ*16783**400. ЯНОВАЛЕКСЕЙГЕННАДЬЕВИЧ*13985**. . . . *************************************************************ВСЕГО ПРИНЯТО 400 СТУДЕНТОВГЛАВА13ССЫЛОЧНЫЕ ТИПЫДо сих пор мы рассматривали только статические программные объекты.Этим термином обозначаются объекты, которые порождаются непосредственно перед выполнением программы, существуют в течение всего времени ее выполнения и размер значений которых (в смысле объема машинной памяти, необходимой для их размещения) не изменяется по ходу выполнения программы. Статические объекты порождаются с помощьюсоответствующих им описаний.
Например, описание переменной х в разделепеременныхvarх:arrayС1..10Эof real;к а к раз и свидетельствует о том, что в программе вводится в употребление(порождается)статическая переменная регулярного типа (массив),значением которой может быть упорядоченная последовательность из десяти вещественных чисел.Поскольку статические объекты порождаются до выполнения программы и размер их значений известен заранее, то место в памяти машины,необходимое для хранения их значений, можно выделить еще на этапетрансляции исходного текста программы на язык машины.Обратим внимание на следующее обстоятельство. В программе, записанной на алгоритмическом языке, ссылка на программные объекты осуществляется путем указания их имен, т.е. считается, что по имени осуществляется непосредственный доступ к объекту.
На машинном же языкессылка на объект осуществляется путем указания его места в памятимашины: на современных ЭВМ это место обычно задается адресом объекта,т.е. номером ячейки памяти, начиная с которой размещен этот объект.Из указанных выше свойств статических объектов видно, что вся работапо размещению таких объектов в памяти машины и формированию ссылокна эти объекты в машинной программе может быть выполнена на этапетрансляции, что и является положительной стороной использования статических объектов.Однако использование при программировании только статическихобъектов может вызвать определенные трудности, особенно с точки зренияполучения эффективной машинной программы, а такая эффективность бывает чрезвычайно важной при решении ряда задач.
Дело в том, что иногдамы заранее (т.е. на этапе составления программы) не знаем не только раз236мера значения того или иного программного объекта, но даже и того, будетсуществовать этот объект или нет. Такого рода программные объекты,которые возникают уже в процессе выполнения программы или размерзначений которых определяется (или изменяется) при выполнении программы, называют динамическими объектами.Если например, в заданном тексте, состоящем из слов произвольнойдлины, требуется найти первое по порядку слово, обладающее заданнымсвойством, то переменная, значением которой является искомое слово,в процессе выполнения программы может вообще не появиться (еслив тексте нет ни одного слова с заданным свойством), а если она и появится,то заранее неизвестна длина слова, являющегося значением этой переменной. Так что такая переменная по своему существу является динамическимпрограммным объектом.
В принципе, конечно, и в этом случае можнобыло бы обойтись использованием только статических переменных.Однако очевидно, что для переменной-результата пришлось бы отвестиместо в памяти в расчете на максимально возможную длину слова(описав соответствующим образом эту переменную), что может привестик весьма нерациональному использованию памяти машины.Кроме того, часто бывает так, что какой-либо программный объектнужен не на все время выполнения программы, а только на какую-то часть(иногда очень малую) этого времени.
Такие временные программныеобъекты могут занимать значительный объем памяти и одновременное существование всех таких объектов может потребовать столь большогообъема машинной памяти, что соответствующая программа просто не сможет разместиться в ограниченной оперативной памяти машины (особенноэто актуально для микро-ЭВМ).Язык паскаль, как уже отмечалось, предусматривает возможность составления эффективных программ, с учетом специфики ЭВМ.
Поэтому дляустранения указанных выше недостатков, связанных с использованием статических объектов, в нем предусмотрена возможность использования динамических объектов. Правда, использование таких объектов влечет за собойи определенные трудности. Одна из таких трудностей заключается в Том,что возникают объекты динамически, в процессе выполнения программы,а действия над ними необходимо задать уже при написании программы,до ее выполнения. Так что возникает вопрос — а как же в программесослаться на еще непорожденные, т.е.
пока несуществующие объекты?Можно было бы пойти по такому пути: каждому из используемых динамических объектов тоже дать свое имя, задав в тексте программы соответствующее указание о том, что это имя динамического объекта, и, к а кобычно, использовать эти имена для ссылок на динамические объекты.Но в этом случае возникает проблема трансляции — на какие же машинныеадреса заменять имена динамических объектов, если в это время ещенеизвестно их место в памяти машины? Очевидно, что формирование такихадресов придется как-то предусматривать в самой программе, что заведомоприведет к ее усложнению и к потере ее эффективности, а это противоречиттой цели, ради достижения которой в языке и предусматриваютсядинамические объекты. Поэтому в паскале выбран другой путь.
Его идеясостоит в том, что в языке для работы с динамическими объектамипредусматривается специальный тип значений — так называемый ссылочный237тип. Значением этого типа является ссылка на какой-либо программныйобъект, по которой осуществляется непосредственный доступ к этомуобъекту. На машинном языке такая ссылка как раз и представляется указанием места в памяти (адресом) соответствующего объекта.В этом случае для описания действий над динамическими объектамикаждому такому объекту в программе сопоставляется статическаяпеременная ссылочного типа — в терминах этих ссылочных переменных иописываются действия над соответствующими динамическими объектами.Значения же переменных ссылочного типа, как обычно, определяются ужев процессе выполнения программы, а для достаточно удобного формирования таких значений в языке предусмотрены соответствующие средства,которые будут рассмотрены ниже.13.1.
Динамические объекты и ссылкиПрежде всего рассмотрим вопрос о том, как задается ссылочный тип значений. В паскале — с целью повышения надежности программ — в этом задании обязательно должен фигурировать тип значений тех динамических программных объектов, на которые будут указывать значения переменныхзадаваемого ссылочного типа.
Синтаксически задание ссылочного типа определяется следующим образом:{ задание ссылочного типа >:: = t < имя типа >где стрелка t — это признак ссылочного типа, а (имя типа) — это имя либостандартного, либо ранее описанного типа значений. Значениями переменных определенного таким образом ссылочного типа могут быть ссылки надинамические объекты, причем только того типа, имя которого указанов задании после стрелки. Здесь же обратим внимание на тот факт, что в задании ссылочного типа после стрелки может фигурировать только и м ятипа динамического объекта, но не непосредственное его задание.Переменные ссылочного типа вводятся в употребление обычным путем,с помощью их описания в разделе переменных, а их тип тоже определяетсялибо путем непосредственного задания типа в описании переменных, либопутем указания имени ранее описанного типа, напримерtypeмассив-аггау С 1..1003 of integer;динмас= tMaccHB;varр:tinteger;q:tchar;Рабмас:динмас;В силу этих описаний значением переменной р может быть ссылка на динамический объект целого типа, значением переменной q — ссылка на динамический объект литерного типа, а значением переменной Рабмас ссылка на динамический объект, значением которого является массив изста целых чисел.
У всех этих статических ссылочных переменных есть однаобщая черта — их значения указывают место в памяти соответствующегодинамического объекта, поэтому переменные ссылочного типа часто называют указателями.Связь указателя с объектом схематично можно изобразить следующимобразом:ОбъектНа этой схеме звездочкой изображено значение указателя р, а стрелка,исходящая из этой звездочки, отражает тот факт, что значением указателяявляется ссылка на объект, посредством которой он и доступенв программе.В некоторых случаях возникает необходимость в качестве значения указателя принять такую ссылку, которая не связывает с данным указателемникакого объекта, т.е.
"пустую" ссылку. Такое значение в паскале задаетсяслужебным словом nil и принадлежит любому ссылочному типу. Схематично результат выполнения оператора присваивания р : = nil можно изобразить следующим образом:QТеперь рассмотрим вопрос о том, как же порождается сам динамический объект. Дело в том, что после введения в употребление ссылочнойпеременной в разделе описаний, она не ссылается ни на какой программный объект и даже не имеет в качестве своего значения пустойссылки nil.