рефераты конспекты курсовые дипломные лекции шпоры

Реферат Курсовая Конспект

Программирования

Программирования - раздел Информатика, СОВРЕМЕННАЯ ИНФОРМАТИКА   Важнейшим Из Факторов, Влияющих На Разработку Языков Программ...

 

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

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

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

В связи с этим по-прежнему актуально понимание основных принципов и структуры этих языков. Именно эти языки являются основным инструментом большинства программистов, занимающихся прикладным программированием и использующих либо FORTRAN в рамках научно-технических задач, либо С со всеми его расширениями (С++, С builder, С# и т.п.), который позволяет опуститься на более низкий уровень и осуществлять как прикладное, так и системное программирование. Определенной популярностью пользуется и Pascal (особенно в рамках среды Delphy).

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

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

Все популярные языки программирования используют латинский алфавит, ряд специальных символов, которые имеются на клавиатуре, а также английские слова и выражения (real, integer, if, then, else, do и т.п.), представляющие собой ключевые, или зарезервированные слова. Существуют некоторые различия в ключевых и зарезервированных словах.

Ключевые слова (Keyword) используются в Фортране и имеют свое функциональное предназначение, находясь, как правило, в неисполняемой части программы (описательной). Так, указание REAL L в начальной части программы указывает, что значение переменной L – действительное. В то же самое время слово «REAL» в исполняемой части может рассматриваться в некоторых языках как обычный идентификатор, например, для обозначения арифметического выражения.

Зарезервированные слова (reserved word) могут использоваться только в контексте, предусмотренном правилами (семантикой) языка.

Ряд языков (например, ADA) могут содержать так называемые предопределенные слова, значения которых могут переопределяться пользователями.

Программы оперируют с объектами данных. Объект данных – комбинация данных, атрибутов, описывающих их свойства, и методов, раскрывающих их поведение.

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

 

PARAMETER (MILE=5280, FOOT=12, METER=39.36)

имя значение

а в Паскале –

CONST

MILE=5280;

FOOT=12;

METER=39.36;

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

1. Элементарные типы данных – типы данных, не определяемые в других типах и существующие практически во всех императивных языках:

числовые типы:

целые – Integer, действительные – REAL (с фиксированной и плавающей точкой);

комплексные (COMPLEX) и с двойной точностью (DOUBLE PRECISION) – только в Фортране;

булевские, или логические, типы – простейшие из всех типов, они имеют, прежде всего, значения – TRUE и FALSE (0, 1 для С);

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

2. Массивы (array, dimension), структурированные типы данных – однородное множество данных, в котором каждый элемент идентифицируется его положением по отношению к первому элементу.

К менее распространенным типам, которые используются в ряде языков, можно отнести: порядковые типы, символьные строки (Character strings), запись (record), множества (set type), указатели (Pointer) и т.п.

Все языки имеют три типа выражений.

Арифметические выражения задают порядок действий над элементами данных и состоят из операндов (константы, переменные и т.п.), круглых скобок и знаков операций, традиционных (с очень небольшими отличиями) для всех языков +, -, *, /. Для Фортрана и Бейсика в стандарте предусмотрены знаки возведения в степень – **, ^. Арифметические операции могут быть унарными (unary), содержащими один операнд – U**2, бинарными (binary), содержащими два операнда – a + b, и тернарными (ternary, три операнда) в языках С, С++ и Java.

Логические выражения (булевские) состоят из операндов (констант, переменных, элементов массивов и т.п.), логических операций (not, and, or и т.п.) и операций отноше­ния, которые приводятся ниже для языков Бейсик, Фортран и Паскаль. Операции отноше­ния выполняют сравнение двух операндов, а с помощью логических операций составляются более сложные логические выражения. Результатом выполнения логических выра­жений являются значения True или False.

Символьные выражения (литерные) порождают значения, имеющие литерный тип данных.

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

Операторы в алгоритмических языках могут быть:

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

б) ввода-вывода, в качестве которых наиболее часто используются термины read, write, print;

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

Ниже представлены разновидности структурных операторов и логических отношений для языков Бейсик, Фортран и Паскаль.

Условные операторы:

 

Бейсик Фортран Паскаль

= .eq. =

<> .ne. <>

> .gt. >

< .lt. <

>= .ge. >=

<= .le. <=

and .and. and

or .or. or

 

Операторы цикла:

Бейсик Фортран Паскаль

10 if i>1 then i=0 if (i .gt. 1) i=0 if i>1 then i:=0;

20 if i>1 then i=0 else i=–1 if (i .gt. 1) then if i>1

i=0 i:=0

else else

i=–1 i:=–1;

30 if i>1 then i=0: j=2 else i=–1 if (i .gt. 1) then if i>1 then

j=0 begin

j=2 i:=0;

else j:=2

i= –1 end

end if else

i:=–1

Циклы:

 

Бейсик Фортран Паскаль

10 for i = 1 to n do 10 i=1, n for i:=1 to n begin

20 x = x+1 x=x+1 x:=x+1

30 next i 10 continue end;

10 while i >10 do 10 idum = 1,10000 while i < 10 do

20 i=i+1 if (i .ge. 10) go to 100 begin

30 wend i =i+1 i:= i + 1

10 continue end;

100 continue

10 while idum = 0 do 10 idum = 1,10000 repeat

20 i = i + 1 i = i + 1 i:= i + 1

30 if i>=10 then goto 50 if (i .ge. 10) go to 100 until i >= 10;

40 end 10 continue

50 'имитация цикла repeat – until’ 100 continue

Указанные языковые конструкции являются общими для всех традиционных (императивных) языков программирования. На этом уровне различия в языках нельзя считать принципиальными. В качестве примера использования перечисленных средств программирования (как начального уровня) представлены тексты программ на языках FORTRAN, PASCAL и С, и блок-схема программы определения максимального и минимального элементов массива (рис. 4.3).

 

 
 

 

 


Рис. 4.3. Блок-схема программы, определяющей максимальный

и минимальный элементы массива

 

Фортран:

PROGRAM MINMAX

real a(100)

integer n, numax, numin, i

print *,’ input n’

read *,n

do 10 i= 1, n

print *, ‘input a( ‘.i.’)’

read *,a(i)

10 continue

numax=1

numin=1

do 20 i=2, n

if (a(i).gt.a(numax) ) numax= i

if (a(i).It.a(nuinin ) ) numin=i

20 continue

print *, ' max{a(i)}=’,a(numax),’ min{a(i)}=’ ,a(numin)

end

Паскаль:

program extrem( input, output);

var

n , i , nuimax, numin : integer ;

a: array [ 1..100 ] of real;

begin

writeln( ‘ input n ‘) ;readln(n) ;

for i:=1 to n do

begin

writeln( ‘ input a(‘.j.’ ) ‘);readIn (a [ i ] );

end ;

numax: = 1; numin : = 1;

for i: =2 to n do

begin

if a[ i ]> a[numax] then numax:=i;

if a[ i ]< a[numin] then numin :=i;

end;

writeln(' max{a(i)}=’,a[numax],’ min{a(i)}=’ ,a[numin]);

end.

Си:

# include<stdio. h >

int n , i ,numax,numnin ;

float, a[100];

main( )

{

printf("input nn" ) ;

scanf(" %g ", &n );

for( i = 0; i <n; i++)

{

printf("input a(%d)n", i ); scanf("%g",&a[i ]);

}

numax=numin=0;

for( i=1;i<n;i++)

{

if (a[ i ] > a[numax])numax=i ;

if (a[ i ] < a[numin] )numin=i;

}

printf( "max{a( i ) }=%g min{a( i)}=%g" ,a[numax] ,a[numin] ) ;

}

 

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

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

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

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

 

Рис. 4.4. Схема работы программы, многократно использующей

внешний модуль

На первом этапе такие модули в объектном виде включались в виде внутренних библиотек в транслятор языка и подключались на уровне компоновки в исполнимую программу. К ним относились продпрограммы – функции для вычисления наиболее распространенных математических функций (тригонометрических, логарифмов, MIN, MAX и т.п.). Затем средства разработки этих модулей были включены в стандарт языка, и разными фирмами было разработано большое количество внешних подпрограмм для различных приложений. Так, фирма IBM разработала библиотеку научных подпрограмм на Фортране, в которую были включены практически все разделы вычислительной математики. В России была разработана библиотека графических подпрограмм на Фортране (ГРАФОР). Кроме этого в различных организациях было создано большое количество узкоспециализированных библиотек.

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

Такой подход позволяет:

1) сократить текст основной программы путем включения дополнительных (внешних) модулей на уровне компоновки (иногда многократного включения одних и тех же модулей на различных фазах выполнения программы);

2) распараллеливать выполнение проекта, распределяя работу между программистами;

3) структурировать программу, облегчая ее тестирование и поиск ошибок.

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

Фортран включает три структуры, использующие указанные принципы.

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

Name(arg) = EXPRESSION

где Name – имя оператора функции; arg – список формальных параметров; EXPRESSION – само выражение.

Например, в программе необходимо многократно вычислять выражение:

ах2 + by2 + cxy + d

Его можно оформить, как оператор функцию.

QUAD(X,Y)=A*X**2+B*Y**2+C*X*Y+D

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

Так, например:

RESULT=X4+200*QUAD(X1,Y1)+300*QUAD(X2,Y2)+400*QUAD(X3,Y3)

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

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

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

t FUNCTION f(a1,a2…an)

t – тип функции, может быть: Integer, Real, Double Precision, Сomplex, Logical; по умолчанию Real или Integer определяется первой буквой имени функции; FUNCTION – ключевое слово; f – имя функции; a1,a2, …, an – имена формальных параметров.

Структура этой подпрограммы следующая:

FUNCTION Name(a1, a2, …, an)

исполнимая

часть

 

Name=Result

Return

End

После выполнения основной (исполнимой) части имени функции присваивается значение полученного результата ее работы (Result). Оператор Return передает результат в вызывающую программу (End – указание транслятору о завершении текста подпрограммы при трансляции).

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

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

В качестве примера рассмотрим подпрограмму функции для скалярного произведения двух векторов X и Y.

Алгоритм скалярного произведения:

n

S = ∑ Xi·Yi

i=1

 

FUNCTION SKALAR(X,Y,N)

DIMENSION X(100),Y(100)

s=0.0

do 1 i=1,N

s=s+X(i)*Y(i)

l Continue

SKALAR=s

RETURN

END

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

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

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

Программа SUBROUTINE оформляется следующим образом:

SUBROUTINE S(a1,a2, …, an)

Тело подпрограммы

Исполнительная часть

RETURN

END

где SUBROUTINE – ключевое слово; S – имя подпрограммы (не имеет типа и никак не связано с входными и выходными параметрами); a1,a2, …, an – формальные параметры, используемые при работе подпрограммы, включая и выходные параметры (результаты вычислений). Формальные и фактические параметры должны быть согласованы между собой (так же, как и в подпрограмме функции) по типу, количеству и порядку следования. Естественно выходные (вычисляемые) параметры фигурируют в главной программе только в виде имен (не имеющих значений до начала работы модуля). RETURN и END – выполняют те же функции, что и в подпрограмме функции.

В качестве примера использования SUBROUTINE рассмотрим математический алгоритм перемножения матрицы на вектор.

 

SUBROUTINE MATRIX(A,X,Y,N)

DIMENSION F(50,50),X(50),Y(50)

DQ 2 I=1,N

s=0.0

DQ1 I=1,N

s=s+A(I,J)*X(j)

Y(I)=s

RETURN

END

 

В данном случае значения всех параметров передаются из главной программы, и в результате работы этой SUBROUTINE в главную программу возвращается вычисленное значение вектора Y(I).

Вызов подпрограммы SUBROUTINE осуществляется следующим оператором:

CALL(a1,a2, …, an)

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

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

Появление парадигмы структурного программирования обычно связывается с разработкой Никлаусом Виртом языка Pasсal в 1972 г. Основное назначение этого языка изначально связано с обучением студентов программированию. Следует отметить, что Вирт – одна из ключевых фигур в создании программистской идеологии. Он разработал также такие языки, как Modula, Oberton, Object Pascal. Справедливости ради необходимо отметить, что большую популярность Pasсal приобрел благодаря очень удачной среде Turbo Pascal, разработанной фирмой Borland. При этом стандарт «оригинального» языка значительно расширен фирмой. Что же касается структурного программирования по отношению в языку Pasсal, то здесь можно выделить несколько основных элементов, отношение к которым не всегда однозначно, хотя принципы блочности, иерархичности и декомпозиции явно просматриваются в его структуре.

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

2. Включаются в текст программы структуры FUNCTION и PROCEDURE, функционально являющиеся полным аналогом FUNCTION и SUBROUTINE, но в отличие от Фортрана они являются внутренними подпрограммами, транслируемыми вместе с основной программой, и недоступны извне.

3. Используются блочные конструкции begin…end, придающие автономность отдельным частям текста программы, продолжение выполнения которой возможно только после завершения выполнения участка, заключенного в эти скобочные конструкции.

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

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

Так, если основная критика Фортрана связана с оператором безусловного перехода (go to) и наличием меток, что приводит в больших программах к «паутине» переходов, затрудняя чтение программы и поиск ошибок (нарушает структурированностью), то, тем не менее, в Pascal эти средства также были введены, поскольку они в ряде случаев оказались очень удобны. Локализация имен и меток, наличие глобальных имен также является отходом от основной (генеральной) линии Pascal.

Кроме этого, начиная с определенных версий Turbo Pascal (фирмы Borland), введены автономные (отдельно транслируемые) модули UNIT (по образу и подобию Фортрана). В связи с этим разговоры о структурированности уменьшились, особенно в связи с переходом на парадигму объектно-ориентированного программирования и развитием CASE-технологии. Концепция объектно-ориентированного программирования представляет современную парадигму традиционного программирования.

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

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

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

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

SORT_int(list,list_len)

Этот вызов является абстракцией реального процесса сортировки (алгоритм которого в вызывающей программе не определен и не зависит от алгоритма в вызываемой программе). Единственным существенным моментом является имя вызываемой подпрограммы (SORT_int), а также указание (передачи в программу SORT_int) массива подлежащего сортировке (list) и имя отсортированного массива, который возвращается в основную программу (list_len).

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

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

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

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

Экземпляр абстрактного типа данных называется объектом.

Концепция объектно-ориентированного программирования (object-oriented) уходит корнями в язык SIMULA-67 (норвежцы – Кристен Нигаард и Оле Йохан Дал), но она не была полностью разработана, пока эволюция языка Smalltalk (американец Ален Лэй) не привела к появлению языка Smalltalk 80.

На сегодняшний день для всех традиционных языков программирования разработаны объектно-ориентированные диалекты (начиная с C++, Ada, Pascal, Fortran) и т.п. Некоторые из современных языков программирования, разработанных для объектно-ориен­тированного программирования, не поддерживают другие парадигмы программирования, но продолжают использовать некоторые основные структуры императивных языков и внешне на них похожи. К таким языкам, например, относится Java. Кроме того, существует один полностью объектно-ориентированный язык, упомянутый ранее, – Smalltalk.

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

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

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

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

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

Абстрактные типы данных с похожими свойствами в объектно-ориентированных языках обычно называются классами (classes).

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

Класс, от которого производится новый класс, называется родительским классом (parent class), или суперклассом (super class).

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

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

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

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

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

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

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

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

Еще одно направление в развитии императивных языков связано с параллельным программированием. Вопрос о параллельном программировании возник достаточно давно в связи с появлением первых суперкомпьютеров и являлся занятием довольно узкого круга людей, занимающихся научными задачами в области военной проблематики. Однако в последнее время необходимость в параллельном программировании приобретает массовый характер. Этому способствует как непрерывное падение цен на параллельные компьютеры, так и постоянное усложнение задач, решаемых на них. Причем это не только традиционные задачи физики, химии, биологии, медицины и других наук, в которых переход от упрощенных моделей к реальным задачам сопряжен с количественным ростом объема вычислений, но также задачи, связанные с разработкой систем управления базами данных (СУБД), разнообразными Internet-серверами запросов (WWW, FTP, DNS и т.п.) и совместного использования данных (NFS, SMB[‡‡] и др.), автоматизированными системами управления производством (АСУП) и технологическими процессами (АСУТП), поскольку в этих задачах требуется обеспечить обслуживание максимального количества запросов в единицу времени, а сложность самого запроса растет.

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

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

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

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

Реализация распараллеливания процессов и задач возможна как с помощью средств операционных систем, прежде всего различных версий UNIX, так и с помощью функций императивных языков программирования. Так, появившийся в 1990 г. интерфейс MPI (Message Passing Interfere), ставший фактически стандартом для программирования систем с распределенной памятью, приобрел большую популярность и теперь с успехом используется также в системах с общей памятью и разнообразных смешанных вычислительных установках. Он представляет собой набор утилит (вспомогательных программ) и библиотечных функций (для языков C/C++, FORTRAN), позволяющих создавать и запускать приложения, работающие на параллельных вычислительных установках различной природы.

 

– Конец работы –

Эта тема принадлежит разделу:

СОВРЕМЕННАЯ ИНФОРМАТИКА

Московский инженерно физический институт... государственный университет...

Если Вам нужно дополнительный материал на эту тему, или Вы не нашли то, что искали, рекомендуем воспользоваться поиском по нашей базе работ: Программирования

Что будем делать с полученным материалом:

Если этот материал оказался полезным ля Вас, Вы можете сохранить его на свою страничку в социальных сетях:

Все темы данного раздела:

СОВРЕМЕННАЯ ИНФОРМАТИКА
    Москва 2010 УДК 004(075) ББК 32.97я7 А19   Аверьянов Г.П., Дмитриева В.В. Аннотация Учебное

ОСНОВНЫЕ СОКРАЩЕНИЯ
  АКД – аппаратура канала данных АЛУ – арифметико-логическое устройство АСНИ – автоматизированные системы научных исследований АСУ – автоматизированная сист

Структура современных систем обработки данных
  За сравнительно небольшой период развития электронных вычислительных систем появилось довольно много технических средств обработки данных (СОД). На рис. 1.1 представлена пр

И краткая характеристика его составных частей
  Более чем за 50 лет развития современной вычислительной техники прогресс в аппаратной реализации компьютеров и их технических характеристиках превзошел все мыслимые прогнозы, и пока

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

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

Суперкомпьютеров, мейнфреймов и мини-компьютеров
  Хотя современные персональные компьютеры (ПК) обладают впечатляющими возможностями, которые существенно расширились в связи с появлением 64-разрядных микропроцессоров, не следует по

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

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

Периферийных устройств
  Архитектура ПК определятся системой шин, с помощью которых ЦП связан с ОП и периферийными устройствами. Современная архитектура ПК является результатом довольно длительного

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

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

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

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

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

Современное состояние и ближайшие перспективы
  Глобальные или всемирные сети (GAN – Global Area Network) предназначены для связи абонентов, расположенных в различных географических регионах, и включают в себя множество сетей раз

Технические средства, используемые ЛВС
  Локальные вычислительные сети (ЛВС) начали использоваться с середины 70-х годов в результате падения цен на электронные компоненты, расширения возможностей терминальных устройств, п

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

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

Обеспечения и краткая характеристика отдельных частей
  До 70-х годов изготовители ЭВМ, как правило, продавали лишь изделие одного вида – аппаратуру (Hard ware). Операционные системы (ОС), вспомогательные служебные программы, пакеты прик

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

Сетевые операционные системы
  Большое разнообразие и различие функциональных возможностей ОС больших и малых ЭВМ 70-х – 80-х годов объясняется различием в уровне технических средств этих машин. Значительное увел

Общая структура программного обеспечения
  Все компоненты программного обеспечения, описанные в гл. 5, присутствуют и в структуре ПО ПК. Однако система программного обеспечения этого вида ЭВМ имеет ряд специфических особенно

Краткая характеристика ОС, применяемых в ПК
  До последнего времени для ПК IBM-клона применяются три типа локальных ОС: однопользовательская однозадачная DOS; однопользовательские многозадачные OS/2, Windows 9

Инструментальное программное обеспечение ПК
  На ПК, совместимых с IBM PC, реализованы практически все широко распространенные языки программирования, а многие из них имеют несколько независимых реализаций. Следует отметить ряд

Пакеты прикладных программ
  Разработка ППП является одним из основных направлений развития ПО ПК. Именно благодаря этому виду прикладного программного обеспечения ПК приобрели всеобщую популярность и стали нео

Программное обеспечение компьютерной графики.
  Программные средства работы с компьютерной графикой называют графическими редакторами (graphics editor). Существуют два типа графических редакторов: 1) редакторы для

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

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

О некоторых понятиях компьютерной безопасности
  Термины «информационная безопасность» (information security) и «безопасность сети» (network security) в широком смысле относятся к секретности, т.е. гарантии того, что информация и

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

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

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

Бизнес в Интернете
  В конце 1999 г. сразу два автомобильных гиганта Ford и General Motors объявили о своем намерении перевести большую часть своих коммерческих операций во Всемирную паутину и объединит

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

Беспроводные среды
  По мере того как электронные информационные системы затрагивают все большие аспекты деятельности человека, необходимость привязываться к этим системам проводами в ряде случаев значи

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

Спутниковая система связи
23 апреля 1965 г. был запущен на высокую эллиптическую орбиту спутник связи «Молния 1», который ознаменовал становление в нашей стране спутниковой радиосвязи. Почти одновременно в США был запущен н

Системы подвижной радиосвязи
  В настоящее время доминирующее положение на рынке подвижной радиосвязи занимают: профессиональные (частные) системы подвижной радиосвязи (PMR – Professional Mobil Radio, PA

Беспроводное подключение узлов в локальных сетях.
Беспроводная (wireless) связь в локальных сетях осуществляется в инфракрасном и радиочастотном диапазоне электромагнитных волн. Для организации беспроводного подключения узлов к сети требуется два

СПИСОК ТЕРМИНОВ И ОПРЕДЕЛЕНИЙ
  Алгоритм шифрования – различные способы преобразования текста. Аналоговые данные – физическая величина, которая может изменяться в непрерывном диапазоне значе

ТЕЛЕКОММУНИКАЦИОННЫЕ СИСТЕМЫ
  Учебное пособие   Редактор     Подписано в печать 15.10.2007. Формат 60х84 1/16 Уч.-изд.л. 20,0. Печ.л. 20,0. Ти

Хотите получать на электронную почту самые свежие новости?
Education Insider Sample
Подпишитесь на Нашу рассылку
Наша политика приватности обеспечивает 100% безопасность и анонимность Ваших E-Mail
Реклама
Соответствующий теме материал
  • Похожее
  • Популярное
  • Облако тегов
  • Здесь
  • Временно
  • Пусто
Теги