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

1_7. Из лекций.

Для чего нужны ЯП:

Маш. Взаимод. -> человеческий язык

42 год – первый серийный программируемый компьютер Колосус

Фортран, бейсик, Алгол – первые ЯП, близкие к человеческим.

Императивные, декларативные и функциональные.

Отличия ЯВУ и ЯНУ: исполнитель компилятор(или интерепретатор) (ЯВУ) и процессор (ЯНУ)

Структура ЯП

Алфавит (упор на упорядоч. множество)

Лексика – набор допустимых служебных слов

Синтаксис – правила построения конструкций из лексем

Семантика – правила перевода (извлечение смысла из конструкций)

Осн. Элементы программы (для любого языка, например Паскальчег)

1) заголовок программы;

2) описание внешних модулей, процедур и функций;

3)описание меток;

4) описание констант;

5) описание типов переменных;

6) описание переменных;

7) описание функций и процедур;

8) раздел операторов.

Выбор типа данных – определяет структуру данных и операции над ними.

Типы данных

Простые (символьные, числовые, логические)

Структурные (строки, массивы, файлы)

Реализация основных алгоритмических структур

Следование, ветвление, цикл

Вывод: развитие программирования сопряжено с развитием ЯП

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

Алфавит - фиксированный для данного языка набор основных символов, допус­каемых для составления текста программы на этом языке.

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

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

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

Составление программ для ЭВМ первого поколения велось исключи­тельно на машинном языке, который представляет собой свод правил ко­дирования действий ЭВМ с помощью чисел. Для всех цифровых ЭВМ «по­нятна» только двоичная система счисления (СС), которая для сокращения записи часто программистами заменяется восьмеричной или шестнадцатеричной СС.

Более высоким уровнем, по сравнению с машинными языками, явля­ются машинно-ориентированные языки символического кодирования. Ос­новной принцип создания языков символического кодирования состоит в замене машинных кодов на их буквенные обозначения, а также в автомати­зации процесса распределения памяти и диагностики ошибок. Такой машин­но-ориентированный язык получил название языка Ассемблера.

ЭВМ «понимает» только машинный язык: только команды, операнды и адреса, записанные с помощью двоичных чисел. Поэтому для преобразо­вания программы, написанной на языке Ассемблера, в машинные коды не­обходим «переводчик».

Перевод программы, написанной на языке Ассемблера, на машинный язык осуществляется с помощью транслятора (переводчика) — специаль­ной программы, которая так же имеет название: ассемб­лер.

Недостатком машинно-ориентированных языков является невозмож­ность выполнения программы, составленной для процессора одного типа, на ЭВМ, которая построена на процессоре другого типа. Вид такой программы зависит от типа машины.

На следующем уровне развития языков находятся процедурно-ориентированные языки. В отличие от машинно-ориентированных языков, синтаксис и семантика этих языков не зависят от состава имеющихся команд конкретной ЭВМ (конкретного процессора). Привязку составленной про­граммы к конкретному типу ЭВМ осуществляет соответсвующий транслятор (программа-переводчик).

После ввода в ОЗУ исходной программы, составленной на языке про­граммирования высокого уровня, осуществляется ее трансляция. В резуль­тате создается программа на машинном языке, т. е. программа, состоящая из команд того процессора (той машины), с помощью которого будет решаться задача.

Процесс перевода программы и процесс ее исполнения могут проис­ходить двумя способами. Первый способ, называемый компиляцией (сравнивают с пись­менным переводом статьи), за­ключается в том, что процесс выполнения программы ЭВМ осуществляется только после того, как процесс перевода полностью завершен. Компилятор перед выполнением про­граммы вначале полностью переводит весь текст программы на машинный язык. Для компиляции ха­рактерно то, что осуществляющая ее программа-транслятор во время выпол­нения программы уже не нужна и потому не находится в ОЗУ, тем самым достигается экономное использование памяти.

Второй способ — интерпретация (сравнивают с устным переводом статьи) предполагает, что отдельные операторы сразу после трансляции выполняются, после чего та же процедура совершается над другими опера­торами и т. д. Интер­претатор переводит и сразу выполняет программу последовательно, строчку за строчкой. При интерпретации во время выполнения рабочей программы транслятор находится в ОЗУ, т. е. занимает дополнительный объем опера­тивной памяти. Кроме того, процесс решения задачи замедляется, т.к. между отдельными этапами выполнения рабочей программы управление передает­ся транслятору.

Интерпретатор работает медленнее, чем компилятор, занимает боль­ше места в оперативной памяти. Однако при отладке новых программ удоб­нее работать с интерпретатором, так как он позволяет после исправления ошибки продолжить выполнение программы с места остановки.

При работе с компилятором после устранения ошибки необходимо повторно компили­ровать программу и запускать ее с самого начала, а не с места обнаруженной ошибки.

Существуют комбинированные способы трансляции и выполнения программ. Например, язык Java (произносится джава или ява) позволяет сначала компилировать програм­му в некоторый промежуточный код (байт-код), а затем выполнять его с по­мощью интерпретатора (виртуальной Java-машины).

Классификация языков программирования

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

Струк­турное программирование в целом не выходит за рамки этого направления, оно лишь дополнительно фиксирует некоторые полезные приемы технологии програм­мирования.

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

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

Объекты представляют собой многократно используемые программ­ные модули. Структурно объекты состоят из двух частей: методов и пере­менных.

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

Объектно-ориентированное программирование (ООП) характеризует­ся следующими тремя признаками: инкапсуляцией, наследованием и поли­морфизмом.

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

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

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

1_8 В языках программирования высокого уровня используется два типа подпрограмм: процедуры и функции.

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

Процедура — это любая подпрограмма, которая не является функцией.

Подпрограммы, входящие в состав классов в объектных языках программирования, обычно называются методами. Этим термином называют любые подпрограммы-члены класса, как функции, так и процедуры; когда требуется уточнение, говорят о методах-процедурах или методах-функциях.

Параметры подпрограмм

Назначение параметров

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

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

program SubProgExample2;

// Описание подпрограммы subprog

procedure subprog(Line: String); // Заголовок, включающий имя подпрограммы

begin // начало тела подпрограммы

WriteLn(Line);

end; // конец тела подпрограммы

begin

WriteLn('Hello');

subprog('Good bye,'); // 1-й вызов

subprog('my love,'); // 2-й вызов

subprog('good bye!'); // 3-й вызов

end.

В приведённом примере параметр Line подпрограммы subprog в каждом вызове получает различное значение, благодаря чему выводятся не одинаковые строки, а разные.

Формальные и фактические параметры

Чтобы отличать параметры подпрограммы, описанные в её заголовке и теле, от параметров, указываемых при вызове подпрограммы, первые принято называть формальными параметрами, вторые — фактическими параметрами. Так, в последнем примере параметр Line в заголовке и теле подпрограммы subprog — это формальный параметр, а строка 'Good bye' , использованная в первом вызове этой подпрограммы — фактический параметр. При вызове подпрограммы фактические параметры, указанные в команде вызова, становятся значениями соответствующих формальных параметров, чем и обеспечивается передача данных в подпрограмму.

Способ передачи параметров в подпрограмму

Существует несколько способов передачи параметров в подпрограмму.

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

int func1(int x) { x=x+1; return x; }

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

void func2(int &x) { x=x+1; }

Передача параметров по имени. В формальный параметр может быть помещено произвольное выражение. При этом вычисление этого выражения произойдёт внутри подпрограммы в тот момент, когда потребуется его значение. Если это значение фигурирует несколько раз, то и вычисляться оно будет тоже несколько раз. Параметры, передаваемые по имени, дают возможность писать довольно универсальные подпрограммы. Такой способ передачи параметров используется, к примеру в языках Алгол или Алгол 68.

Передача параметров через стек. Это фактически разновидность передачи параметра по значению «с ручным приводом», в данном случае отсутствует понятие формальных и фактических параметров. Все параметры лежат на стеке, причём их типы, количество и порядок не контролируются компилятором. Данный подход реализован в языке Форт.

Язык программирования может предоставлять возможность передавать параметры в подпрограммы либо только по значению (так сделано в языке Си), либо по значению и по ссылке (это реализовано в Паскале, Аде, C++), либо по имени и значению (это реализовано в языках Алгол и Алгол 68). Во последних двух случаях для различения способов передачи параметра используются отдельные синтаксическая конструкции (в Паскале это ключевое слово var при описании параметра). В действительности, если язык содержит понятие ссылки (указателя), то можно обойтись и без передачи параметра по ссылке (её всегда можно смоделировать, описав параметр типа «ссылка»), но эта возможность удобна, так как позволяет работать с формальным параметром-ссылкой без разыменования, а также повышает надёжность и безопасность программы.

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

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

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

Структу́рное программи́рование — методология разработки программного обеспечения, в основе которой лежит представление программы в виде иерархической структуры блоков. Предложена в 70-х годах XX века Э. Дейкстрой, разработана и дополнена Н. Виртом.

В соответствии с данной методологией

Любая программа представляет собой структуру, построенную из трёх типов базовых конструкций:

последовательное исполнение — однократное выполнение операций в том порядке, в котором они записаны в тексте программы;

ветвление — однократное выполнение одной из двух или более операций, в зависимости от выполнения некоторого заданного условия;

цикл — многократное исполнение одной и той же операции до тех пор, пока выполняется некоторое заданное условие (условие продолжения цикла).

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

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

Разработка программы ведётся пошагово, методом «сверху вниз».

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

Тестирование ПО — попытка определить, выполняет ли программа то, что от неё ожидают. Как правило, никакое тестирование не может дать абсолютной гарантии работоспособности программы в будущем.

Для наглядности: почти все производители коммерческого ПО латают заплатки на свои продукты. [Список:]

Уровни тестирования

Модульное тестирование (юнит-тестирование) — тестируется минимально возможный для тестирования компонент, например, отдельный класс или функция

Интеграционное тестирование — проверяет, есть ли какие-либо проблемы в интерфейсах и взаимодействии между интегрируемыми компонентами — например, не передается информация, передаётся некорректная информация.

Системное тестирование — тестируется интегрированная система на её соответствие исходным требованиям

Альфа-тестирование — имитация реальной работы с системой штатными разработчиками, либо реальная работа с системой потенциальными пользователями/заказчиком на стороне разработчика. Часто альфа-тестирование применяется для законченного продукта в качестве внутреннего приёмочного тестирования. Иногда альфа-тестирование выполняется под отладчиком или с использованием окружения, которое помогает быстро выявлять найденные ошибки. Обнаруженные ошибки могут быть переданы тестировщикам для дополнительного исследования в окружении, подобном тому, в котором будет использоваться ПО.

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

1_9 Указатель (пойнтер, англ. pointer) — переменная, диапазон значений которой состоит из адресов ячеек памяти и специального значения — нулевого адреса. Значение нулевого адреса не является реальным адресом и используется только для обозначения того, что указатель в данный момент не может использоваться для обращения ни к какой ячейке памяти.

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

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

Стек (англ. stack — стопка) — структура данных с методом доступа к элементам LIFO (англ. Last In — First Out, «последним пришел — первым вышел»). Чаще всего принцип работы стека сравнивают со стопкой тарелок: чтобы взять вторую сверху, нужно взять верхнюю.

О́чередь — структура данных с дисциплиной доступа к элементам «первый пришёл — первый вышел» (FIFO, First In — First Out). Добавление элемента (принято обозначать словом enqueue) возможно лишь в конец очереди, выборка — только из начала очереди (что принято называть dequeue, при этом выбранный элемент из очереди удаляется).

В информатике, cвя́зный спи́сок — структура данных, состоящая из узлов, каждый из которых содержит как собственные данные, так и одну или две ссылки («связки») на следующее и/или предыдущее поле. Принципиальным преимуществом перед массивом является структурная гибкость: порядок элементов связного списка может не совпадать с порядком расположения элементов данных в памяти компьютера, а порядок обхода списка всегда явно задаётся его внутренними связями.

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

Формально дерево определяется как конечное множество T одного или более узлов со следующими свойствами:

существует один корень дерева T

остальные узлы (за исключением корня) распределены среди непересекающихся множеств T1,...,Tm, и каждое из множеств является деревом; деревья T1,...,Tm называются поддеревьями данного корня T

Двоичное дерево

Пример дерева

Термин двоичное дерево имеет несколько значений:

Двоичное (бинарное) дерево (неориентированное) — это дерево (обычное, неориентированное), в котором степени вершин не превосходят 3.

Двоичное (бинарное) дерево (ориентированное) — это ориентированное дерево, в котором исходящие степени вершин (число исходящих рёбер) не превосходят 2.

Двоичное дерево (структура данных) — это специальная абстрактная Структура данных используемая в программировании. На двоичном дереве основаны такие структуры данных, как Двоичное дерево поиска, Двоичная куча, Красно-чёрное дерево, АВЛ-дерево, Фибоначчиева куча и др.

1_10 Объе́ктно-ориенти́рованное программи́рование (ООП) — парадигма программирования, в которой основными концепциями являются понятия объектов и классов (либо, в менее известном варианте языков с прототипированием — прототипов).

Класс — это тип, описывающий устройство объектов. Понятие «класс» подразумевает некоторое поведение и способ представления. Понятие «объект» подразумевает нечто, что обладает определённым поведением и способом представления. Говорят, что объект — это экземпляр класса. Класс можно сравнить с чертежом, согласно которому создаются объекты. Обычно классы разрабатывают таким образом, чтобы их объекты соответствовали объектам предметной области.

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

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

Прототип — это объект-образец, по образу и подобию которого создаются другие объекты.

Основные понятия

Абстракция данных

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

Инкапсуляция

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

Сокрытие данных

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

Наследование

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

Полиморфизм

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

Типы наследования

Простое наследование

Класс, от которого произошло наследование, называется базовым или родительским (англ. base class). Классы, которые произошли от базового, называются потомками, наследниками или производными классами (англ. derived class).

В некоторых языках используются абстрактные классы. Абстрактный класс — это класс, содержащий хотя бы один абстрактный метод, он описан в программе, имеет поля, методы и не может использоваться для непосредственного создания объекта. То есть от абстрактного класса можно только наследовать. Объекты создаются только на основе производных классов, наследованных от абстрактного. Например, абстрактным классом может быть базовый класс «сотрудник ВУЗа», от которого наследуются классы «аспирант», «профессор» и т. д. Так как производные классы имеют общие поля и функции (например, поле «год рождения»), то эти члены класса могут быть описаны в базовом классе. В программе создаются объекты на основе классов «аспирант», «профессор», но нет смысла создавать объект на основе класса «сотрудник вуза».

Множественное наследование

При множественном наследовании у класса может быть более одного предка. В этом случае класс наследует методы всех предков. Достоинства такого подхода в большей гибкости. Множественное наследование реализовано в C++. Из других языков, предоставляющих эту возможность, можно отметить Python и Эйфель. Множественное наследование поддерживается в языке UML.

Множественное наследование — потенциальный источник ошибок, которые могут возникнуть из-за наличия одинаковых имен методов в предках. В языках, которые позиционируются как наследники C++ (Java, C# и др.), от множественного наследования было решено отказаться в пользу интерфейсов. Практически всегда можно обойтись без использования данного механизма. Однако, если такая необходимость все-таки возникла, то, для разрешения конфликтов использования наследованных методов с одинаковыми именами, возможно, например, применить операцию расширения видимости — «::» — для вызова конкретного метода конкретного родителя.

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

Большинство современных объектно-ориентированных языков программирования (C#, Java, Delphi и др.) поддерживает возможность одновременно наследоваться от класса-предка и реализовать методы нескольких интерфейсов одним и тем же классом. Этот механизм позволяет во многом заменить множественное наследование — методы интерфейсов необходимо переопределять явно, что исключает ошибки при наследовании функциональности одинаковых методов различных классов-предков.

Метод в объектно-ориентированном программировании — это функция, принадлежащая какому-то классу или объекту.

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

Различают методы класса и метакласса (или в другом толковании статические методы): первые работают с данными объекта, вторые имеют доступ только к данным класса, и общие для всех объектов данного класса. Для статических методов класса не требуется создание объекта.

Полиморфи́зм (в языках программирования) — взаимозаменяемость объектов с одинаковым интерфейсом.

Язык программирования поддерживает полиморфизм, если классы с одинаковой спецификацией могут иметь различную реализацию — например, реализация класса может быть изменена в процессе наследования [1].

Кратко смысл полиморфизма можно выразить фразой: «Один интерфейс, множество реализаций».

Полиморфизм — один из четырёх важнейших механизмов объектно-ориентированного программирования (наряду с абстракцией, инкапсуляцией и наследованием).

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

Абстракция данных

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

Операционные системы Windows – это графические операционные системы, впервые представленные в ноябре 1985 года для использования на компьютерах типа IBM PC

Интерфейс программирования приложений

Для разработчиков Windows-приложений фирма Microsoft предоставляет специальный интерфейс программирования приложений под названием Win32 API (application programming interface), содержащий совокупность функций, к которым может обращаться приложение.

Основные общие свойства Windows-платформ:

Окна и сообщения

Систему Windows часто называют операционной системой передачи сообщений. В основе системы лежит механизм, транслирующий практически каждое событие (нажатие клавиши, перемещение мыши, истечение времени таймера) в сообщение.

Типичное приложение построено на основе цикла сообщений, который принимает эти сообщения и отправляет их к соответствующим функциям – обработчикам сообщений. Хотя сообщения передаются приложениям, они адресованы не им, а другим основополагающим компонентам операционной системы – окнам.

С точки зрения пользователя, окно - это прямоугольная область экрана, которую занимает каждая программа Windows. Хотя одна программа может создать несколько окон, всегда имеется одно окно верхнего уровня, которое называется “главным окном” приложения.

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

Итак, Окно – это гораздо больше, чем просто прямоугольная область на экране компьютера; оно представляет некую абстрактную сущность, через которую взаимодействуют пользователь и компьютер.

Приложения, потоки и окна

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

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

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

Окно всегда принадлежит какому-то потоку. Поток может владеть одним или несколькими окнами или вообще ни одним.

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

Все окна находятся в иерархической зависимости: некоторые из них являются окнами верхнего уровня, другие подчинены своим родительским окнам.

Типы сообщений

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

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

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

  • сообщения DDE (dynamic data exchange),

  • сообщения буфера обмена (clipboard),

  • сообщения мыши,

  • сообщения клавиатуры,

  • сообщения неклиентской (non-client) области окна,

  • сообщения MDI (multiple-document interface),

  • и многие другие типы.

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

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

Вызов функций Windows

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

Основное множество системных вызовов Windows можно разделить на три главных категории. Службы GDI (Graphics Device Interface – интерфейс графических устройств) предлагают аппаратно-независимые функции графического вывода. Службы пользователя включают в себя системные вызовы для управления элементами пользовательского интерфейса, такими как окна, элементы управления, диалоговые окна или сообщения. Службы ядра включают системные вызовы для управления процессами и потоками, управления ресурсами, файлами и памятью. Windows также включает разносторонние пользовательские интерфейсы программирования приложений (API)

CORBA (сокр. от англ.Common Object Request Broker Architecture — общая архитектура брокера объектных запросов; по-русски чаще произносится как [ко́рба], иногда жарг. [ко́бра]) — это технологический стандарт написанияраспределённых приложений, продвигаемый консорциумомOMG. Задача CORBA — осуществить интеграцию изолированных систем, дать возможность программам, написанным на разных языках, работающим на разных узлах сети, взаимодействовать друг с другом так же просто, как если бы они находились в адресном пространстве одного процесса.

OLE (англ.Object Linking and Embedding, произносится как oh-lay [олэй]) — технология связывания и внедрения объектов в другие документы и объекты, разработанные корпорациейМайкрософт.

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

Dynamic data exchange (DDE) — механизм взаимодействия приложений в операционных системах Microsoft WindowsиOS/2. Хотя этот механизм до сих пор поддерживается в последних версиях Windows, в основном он заменён на более мощные механизмы —OLE,COMиMicrosoft OLE Automation. Однако, DDE по прежнему используется в некоторых местах внутри самой Windows, в частности, в механизме ассоциации расширения имени файла с приложениями. Это является следствием модели разработки, в которойMicrosoftв новых версиях ОС Windows следит за обеспечением совместимости со всеми её предыдущими версиями.

COM (англ.Component Object Model — Объектная Модель Компонентов; произносится как [ком]) — этотехнологическийстандарт от компанииMicrosoft, предназначенный для созданияпрограммного обеспеченияна основе взаимодействующих распределённых компонентов, каждый из которых может использоваться во многих программах одновременно. Стандарт воплощает в себе идеиполиморфизмаиинкапсуляцииобъектно-ориентированного программирования. Стандарт COM мог бы быть универсальным и платформо-независимым, но закрепился в основном наоперационных системахсемействаMicrosoft Windows. В современных версиях Windows COM используется очень широко

Соседние файлы в папке ГОСы