Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

3345

.pdf
Скачиваний:
2
Добавлен:
15.11.2022
Размер:
4.34 Mб
Скачать

грамме, где эти значения будут использованы*.

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

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

* Например, мало кого волнует, как реализован датчик случайных чисел, если он правильно функционирует, генерируя числа типа RAND и NORM.

161

компонента, не влияющие на интерфейс, являются полностью изолированными от пользователя.

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

Но мы таким приемом достигли и нечто бόльшего, а именно независимости внешнего описания содержания выполняемых функций от внутреннего механизма их реализации. То есть программный продукт получился в двух срезах: во внешнем, показывающем какие функции используются и куда (кому) пересылаются результаты исполнения; во внутреннем – как эта функция реализуется внутренним механизмом, который становится невидимым с внешней стороны. Внешний (открытый) срез называется интерфейсом, внутренний (скрытный) – реализацией. Скрытие механизма реализации вовнутрь как раз и обрубает множество перекрестных связей, являющихся бичом старой программной технологии, называемой структурно-ориентированной, сцепленной в единый конгломерат обилием взаимосвязанных глобальных переменных, действующих (видимых) во всей программе и отображающих моделируемую закономерность, «растянутую» по всей программе. Полученный же нами программный продукт, состоящий как бы из множества центров функциональной кристаллизации, связанных между собой минимально необходимым (бледным) интерфейсом,

162

раздающим результат, стал называться объектноориентированным или объектно-дифференцированным (распределенным). То есть сплошь растянутая по программе моделируемая закономерность «разрубается» на фрагменты, требующие более бедной связи сущностей.

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

Кроме того, абстрактный тип данных определяется пользователем. Этим они принципиально, как средства локализации, отличаются от модулей, создаваемых программистом. Модули создаются, исходя из «нужд» программы, а АТД – исходя из потребности ясного представления сущностей моделируемой ситуации. Тем самым в сложные программные продукты кардинальным способом (через механизм задания типов данных) вводится ясность представления о моделируемой предметной сущности. При этом АТД, хотя и определены пользователем, но имеют всю мощь поддержки встроенного в язык типа данных, то есть подчиняются тем же правилам именования, области видимости, создания, времени жизни, копирования и т.д. Модули такой «свободы» не имеют и о ней необходимо «заботиться» программисту.

Абстрактный тип данных задается с помощью классов, определенных соответствующим образом. С помощью класса в один (составной) фрагмент объединяются данные и функции (опера-

163

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

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

1.Все переменные класса (объекты!) должны быть закрытыми членами.

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

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

4.Запись абстрактных утверждений(содержания интерфейса)должна производиться на языке, понятном как пользователю, так и разработчику.

5.Утверждения должны быть точными.

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

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

164

чатель «сам знает», что должно произойти. То есть он имеет все механизмы выполнения желания отправителя по его установкам, посланным в сообщении.

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

На этом мы закончили рассмотрение свойств структур данных, используемых в компьютере. Но в начале курса, впервой лекции, мы условились соизмерять возможности структур данных с выразительными способностями естественного языка. Это очень важно, ибо человеческий мир, использующий компьютер, стремится сделать его полностью согласованным со своими уникальными интеллектуальными средствами, одним из которых является язык. Пока это далеко не так: между человеком и компьютером лежит пропасть ортогональности. Но посмотреть на «согласованность» все-таки необходимо. Для этого на рис.3.15 показана степень приближения возможностей изученных структур данных к выразительной мощи естественного языка. «Края всегда полезно знать!»

3.8. Общие характеристики операций над данными

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

Имеется два типа операций: операции над данными, определяемые программистом, и операции над данными, определяемые системой. К первым относятся арифметические и логические операции. Ко вторым относятся операции перехода, вызова подпрограмм, присваивание имен структурам данных, передачи параметров.

165

166

структур возможности Выразительные

 

данных

В ы р а з и т е л ь н а я м о щ ь е с т е с т в е н н о г о я з ы к а

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Должны

обеспечить

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

автоматическую ге-

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

нерацию многослой-

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ных предметных

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Обеспечивают

 

сущностей в реаль-

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ном масштабе логи-

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

автоматический

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ческого вывода, зак-

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

вывод

нового

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

рывающих ―брешь‖

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

знания, обуслов-

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

в формируемом

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Обеспечивают

 

 

ленного

сово-

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

представлении о рас-

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

манипулирова-

 

 

купностью за-

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

сматриваемой ситуа-

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ние многослой-

 

 

фиксированных

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ции, диктуемой

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ными предмет-

 

 

условий

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

смыслом разума

 

 

 

 

 

 

 

 

 

 

 

 

 

Обеспечивают

 

ными сущностя-

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

субъекта

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ми, фиксирован-

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

манипулирова-

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

но заданными

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ние совокупно-

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

программистом

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Обеспечивают

 

стями, не имею-

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

щими внутрен-

 

в соответствии

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

манипулирова-

 

 

со сходством

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

него упорядо-

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ние совокупно-

 

 

(общностью)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

чения

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

стями разнород-

 

 

выполняемых

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Обеспечивают

 

ных объектов,

 

 

 

 

 

функций

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

доступных по

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

манипулирова-

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

имени

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ние группой од-

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Обеспечивают

 

нородных объек-

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

тов, доступных

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

обозначение и

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

по индексам

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

пересчет диск-

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ретных объектов

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Простые типы

 

Однородные

 

Неднородные

 

Множества

 

Абстрактный

 

Данные с интеллекту

-

Неизвестные

 

 

Типы

 

 

 

 

 

 

 

 

данных

 

 

массивы

 

 

массивы

 

 

 

 

 

тип данных

 

альными свойствами

типы данных

данных

Рис.3.15. Соизмерение возможностей структур данных с выразительной мощью естественного языка

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

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

Естественно рассматривать операцию в ЯзПр как математическую функцию: для данного множества входных операндов (аргументов) она выдает вполне определенный и единственный результат. Каждая операция имеет область определения – множество допустимых входных операндов, на котором она определена, и область значений – множество результатов, которые она может выдать. В математике принято определять функцию заданием области определения, области значений и алгоритма преобразования первой во вторую. Однако в программировании (к сожалению!) используется только частичная спецификация операций. Задание для данной операции области определения и области значений может оказаться значительно более сложным, чем задание алгоритмов, на которых она основывается. Существенны при этом 4 фактора.

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

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

167

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

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

Второй тип побочных эффектов имеет место в программе, которая изменяет свои входные параметры.

4.Самоизменение (вирусы). Имеются следующие возможности самоизменений: операция может модифицировать свою собственную структуру, свои локальные данные, свои команды, то есть при двух последовательных выполнениях с одними и теми же операндами давать разные результаты. Пример (положительный) – датчик случайных чисел, обеспечивающий при одном и том же затравочном числе отличающиеся числа на выходе.

По мере улучшения понимания языков программирования увеличивается возможность создания их математикой формализации, но пока увы!

Информация о свойствах операций задается в декларациях. Однако явное описание операций задается только в подпрограм-

168

мах, для примитивных же операций их свойства фиксируются в самих ЯзПр.

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

3.8.1. Элементарные операции. К ним относятся встроенные в ЯзПр операции, выполняющие основные действия над простыми типами данных, например, арифметические, логические и операции преобразования типов данных.

Основные характеристики арифметических операций состоят

вследующем:

1.Операнды и результаты являются числами.

2.Операция является простой функцией без неявных операндов и самоизменения, но, возможно, с остановками по ошибке (АВОСТ).

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

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

169

(true, false). В настоящее время операции сравнения используются при сортировке цепочек литер. Для упорядочения таких цепочек используется правило алфавитного упорядочения. Одна цепочка считается меньше другой, если она предшествует ей в таком упорядочении.

3.8.1.2. Логические операции. Они относятся к примитивам во многих языках. Операндами логических операций могут быть только логические значения (истина – ложь, 0 или 1), результатом

– одно логическое значение. Основные операции – это «и», «или» и «не», а иногда – «эквивалентность», «импликация» (следование из Р Q) и др. Логические операции часто обобщаются на цепочки битов.

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

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

170

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]