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

114

.pdf
Скачиваний:
25
Добавлен:
05.06.2015
Размер:
1.45 Mб
Скачать

Объектно-ориентированное программирование

ментами различают односвязные и двусвязпые списки с «встречным» направлением стрелок.

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

Основными операциями над списками являются операции вставки-удаления элементов. Такие операции всегда (независимо от техники реализации) должна выполняться корректно:

+сохранять общую структуру связанной организации списка;

+не приводить к образованию «мусора» и «висячих ссылок »;

+сохранять отношение порядка элементов в списке. Список относится к особой группе структур — это так

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

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

71

Объектно-ориентированное программирование

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

Специфические особенности модуля заключаются в следующем:

1)модуль — это автономно компилируемая программная единица;

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

3)сборка программной системы из модулей связана с отдельным технологическим этапом — компоновкой программы. Правила такой компоновки полностью определяются системой модульных оболочек.

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

кконструированию пакетов прикладных программ путем их послойной разработки и отладки.

72

Языки программирования Ассемблер, Фортран, Бейсик и Рефал

Языки программирования Ассемблер, Фортран, Бейсик и Рефал

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

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

Одним из первых и наиболее удачных компиляторов стал язык Фортран, разработанный фирмой IBM. Дословное название языка FORmulae TRANslation — преобразование формул.

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

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

73

Языки программирования Ассемблер, Фортран, Бейсик и Рефал

К 1962 г. относится появление языка, известного под именем Фортран IV и ставшего наиболее употребительным в настоящее время.

Язык Фортран до сих пор продолжает развиваться и совершенствоваться, оказывая влияние на создание и развитие других языков. Например, Фортран заложен в основу Basic — диалогового языка, очень популярного для решения небольших задач, превосходного языка для обучения навыкам использования алгоритмических языков в практике программирования.

Бейсик был создан в 1964 г. как язык обучения программированию. Бейсик является общепринятым сокращением от «Beginner's All-purpose Symbolic Instruction Code» (BASIC), что значит «многоцелевой символический обучающий код для начинающих».

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

С появлением транслятора QuickBasic фирмы Microsoft разработчики получили возможность строить на Бейсике приложения из раздельно откомпилированных модулей, некоторые из которых могут быть написаны на других языках. Разработчик имеет выбор из нескольких промышленных библиотек подпрограмм, которые содержат готовые решения для распространенных задач программирования.

Несомненный интерес представляют некоторые языки программирования, созданные у нас на родине. Один из таких языков — Рефал, разработанный в России (СССР) в 1966 г. ИПМ АН СССР. Этот язык прост и удобен для описания манипуляций над произвольными текстовыми объектами.

Рефал широко применяется при разработке трансляторов с алгоритмических языков как универсальных и проблемно-ориентированных, так и автокодов. Кроме использования в задачах трансляции, Рефал имеет такие важные сферы применения, как машинное выполнение

74

Языки программирования Ассемблер, Фортран, Бейсик и Рефал

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

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

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

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

75

Язык программирования Си

программ: группирование операторов, принятие решении (IF), циклы с проверкой завершения в начале (WHILE, FOR) или в конце (DO) и выбор одного из множества возможных вариантов (SWITCH).

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

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

У языка Си, подобно любому другому языку, существуют свои недостатки. Некоторые операции имеют неудачное старшинство; некоторые разделы синтаксиса могли бы быть лучше; существует несколько версий языка, отличающихся небольшими деталями. Тем не менее язык Си зарекомендовал себя как эффективный и выразительный язык для широкого разнообразия применений программирования.

78

Язык программирования Си++

Язык программирования Си++

Название Си++ придумал Рик Масситти. Название указывает на эволюционную природу перехода к нему от Си, «++» — это операция приращения в Си. Чуть более короткое имя Си+ является синтаксической ошибкой, кроме того, оно уже было использовано как имя совсем другого языка.

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

В качестве базового языка для Си++ был выбран Си, потому что он:

+многоцелевой, лаконичный и относительно низкого уровня;

+отвечает большинству задач системного программирования;

+работает везде и на всем;

+пригоден в среде программирования UNIX. Базовый язык Си, подмножество Си++, спроектиро-

ван так, что имеется очень близкое соответствие между

79

Язык программирования Си++

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

вскрытой поддержке во время выполнения или подпрог раммах.

Различие между Си и Си++ состоит в первую очередь

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

Существенным критерием при разработке языка C++ была простота. Там, где возникал выбор между упроще нием руководства по языку и другой документации и упрощением компилятора, выбиралось первое. Огромное значение также предавалось совместимости с Си, это по мешало удалить синтаксис Си.

ВСи++ нет типов данных высокого уровня и первич ных операций высокого уровня. В нем нет, например, матричного типа с операцией обращения или типа строка с операцией конкатенации. Если пользователю понадо бятся подобные типы, их можно определить в самом язы ке. По сути дела, основное, чем занимается программирование на Си++ — это определение универсальных и специально-прикладных типов. Хорошо разработанный тип, определяемый пользователем, отличается от встроенного типа только способом определения, но не способом использования.

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

80

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