![]() |
|
|
Реферат: Программирование ориентированное на объектыBEGIN... D:=Включить;... D(C);... D:= Выключить;... D(C); . Операторы D(C) в этом фрагменте определяют самоинтерпретацию объекта D в отношении объекта С, а операторы присваивания - определение объекта D потенциально возможным действием. Образно говоря, операторы присваивания здесь "взводят курок" D, а когда D "выстрелит" и какой будет эффект от этого "выстрела" (включает он станок С или выключает) определяется в общем случае логикой программы. Использование в программе переменных класса Действие аналогично наличию множества взведенных курков, при этом отдельные "выстрелы" превращаются в треск автоматных очередей - самоинтерпpетаций. Учитывая, что любое действие, связанное с такой самоинтерпретацией, может переопределить объекты-действия, логика выполнения подобных программ становится весьма запутанной. Основное применение этого механизма - моделирование сложных систем. V. СОЗДАНИЕ / УНИЧТОЖЕНИЕ ОБЪЕКТОВ "Время жизни" объекта. - Классы памяти. - Управление динамической памятью. - Фрагментация. - Проблемы "висячих" ссылок и мусора. - Автоматическая память. - Локальная среда. - Активации объекта. Объекты, существующие в программе, делятся на две категории: статические и динамические. Эти категории определяются по-разному: на основе изменения состояния объектов модели и на основе "времени жизни" объектов. Первое определение предполагает, что любой объект, изменяющий свое состояние в процессе работы программы, является динамическим. В этом отношении, строго говоря, статическими объектами являются только константы, все объекты-переменные могут считаться динамическими. Второе определение предполагает возможность временного существования объектов, возможности создания и уничтожения объектов. В этом смысле объекты, время существования которых равно времени выполнения программы, расцениваются как постоянно существующие (статические), объекты же, время существования (жизни) которых меньше времени выполнения программы - как динамические. Второе определение касается объектов, которые идентифицируются только через указатели. Объекты, идентифицированные именем, в этом отношении всегда должны расцениваться как статические, поскольку их "создание" подготавливается транслятором и ассоциация между именем и элементом хранения объекта существует до окончания вpемени pаботы программы. Создание объекта следует интерпретировать как выделение памяти под его элемент хранения. Такая интерпретация подразумевает разделение всего рабочего пространства памяти ЭВМ на две категории, два класса - статическую память и динамическую. Первый класс памяти, как следует из этого контекста, полностью находится под упpавлением тpанслятоpа и pаспpеделяется под статические объекты, существующие в системе постоянно. Например, декларация VAR A: POINTER TO CARDINAL; B: CARDINAL; сообщает транслятору о необходимости "зарезервировать" в классе статической памяти два слова под элемент хранения объекта с именем А и одно слово под элемент хранения объекта с именем В. Динамическая память предназначается для создания временно существующих объектов. Этот класс памяти имеет две разновидности: собственно динамическую и автоматическую. Собственно динамическая память (в отличие от статической) полностью находится в распоряжении программиста: по его директивам происходит выделение элементов хранения (создание объектов) и возврат ранее выделенных элементов в "зону" свободной памяти (пул "свободных" элементов), что в этом смысле равносильно "уничтожению" объекта. Автоматическая память - особая разновидность динамической, которая также управляется директивами программиста, связанными с интерпретацией активных объектов (переменных пpоцедуpных типов). В этом смысле две разновидности динамической памяти делят этот класс памяти на два подкласса: память для интерпретации пассивных объектов (собственно динамическая) и память для интерпретации активных объектов (автоматическая). Несмотря на общность класса (динамическая память), распределение памяти в этих подклассах основано на разных принципах и реализуется совершенно разными алгоритмами. Управление динамической памятью для пасссивных объектов (в дальнейшем просто динамической памятью) реализуется на основе двух основных процедур (обычно импортируемых из системного модуля): PROCEDURE ALLOCATE (VAR A: ADDRESS; N: CARDINAL); PROCEDURE DEALLOCATE (VAR A: ADDRESS; N: CARDINAL); . Здесь А - свободный указатель, который укажет на выделенную область памяти (элемент хранения размером N байт) при вызове ALLOCATE и получит значение NIL (т.е. никуда не будет указывать) при освобождении этой области "из-под" А путем вызова DEALLOCATE. Использование ограниченных указателей делает во многих отношениях целесообразным использование специальных вызовов: NEW(P) и DISPOSE(P), где VAR P: POINTER TO <Объект>. (NEW и DISPOSE - псевдопроцедуры, их вызовы транслируются в вызовы ALLOCATE и DEALLOCATE соответственно). Использование NEW и DISPOSE позволяет избежать многих семантических ошибок, связанных с различными значениями N в последовательности вызовов ALLOCATE...DEALLOCATE, определяющей создание/уничтожение одного и того же объекта. В целом последовательность вызовов NEW...DISPOSE (или соответственно ALLOCATE...DEALLOCATE), в общем случае полностью определяемая логикой программиста, порождает ряд проблем, связанных с организацией и распределением свободного пространства динамической памяти. Одной из таких проблем является проблема фрагментации. Эффект фрагментации заключается в том, что рабочая область динамической памяти "дробится" на части - фрагменты различной длины. Какие-то из них "заняты" - используются программистом под элементы хранения его объектов, какие-то "свободны", причем характер чередования свободных и занятых фрагментов в общем случае может быть совершенно произвольным. Любой запрос программиста на создание нового объекта приводит к тому, что система управления динамической памятью "подбирает" ему фрагмент, подходящий по размерам. Правила такого подбора могут быть различны, но общая закономерность одна: такой фрагмент должен иметь размер, не меньший, чем запрашиваемый программистом. Если подходящий фрагмент имеет больший размер, чем требуется, в прикладную программу будет отдана его часть, котоpая тепеpь будет pассматpиваться системой как занятый фpагмент, а остаток останется в свободной зоне в качестве свободного фpагмента. При этом проблема фрагментации заключается в том, что эффект "дробления" может привести к тому, что в свободной зоне будет находиться множество "маленьких" разрозненных свободных фрагментов, в совокупности составляющих достаточный объем. Тем не менее, несмотря на такой объем, запрос программиста на новый элемент памяти может получить отказ по причине отсутствия целого подходящего элемента. Ниже приведен фрагмент программы и схема распределения динамической памяти, иллюстрирующие эффект фрагментации. При этом для простоты предполагается, что общий объем динамической памяти составляет 20 байт. TYPE Треугольник = POINTER TO Фигура_1 Фигура_1 = RECORD Сторона_1, Сторона_2, Сторона_3:CARDINAL END; Четырехугольник = POINTER TO Фигура_2; Фигура_2 = RECORD Сторона_1, Сторона_2, Сторона_3, Сторона_4: CARDINAL ЕND VAR T1, T2: Треугольник; М1, М2: Четырехугольник; BEGIN NEW(T1);... NEW(M1);... NEW(T2);... DISPOSE(T1);... DISPOSE(T2); NEW(M2);... ┌───────────────────┐ ─┐ │ WORD │ │ ├───────────────────┤ │ │ │ > Свободный фрагмент, ранее ├───────────────────┤ │ использованный под │ │ │ объект Т1^ ├───────────────────┤ ─┘─┐ │▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒│ │ ├───────────────────┤ │ │▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒│ │ ├───────────────────┤ > Фрагмент, занятый │▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒│ │ под объект М1^ ├───────────────────┤ │ │▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒│ │ ├───────────────────┤ ─┐─┘ │ │ │ ├───────────────────┤ │ │ │ > Свободный фрагмент, ранее ├───────────────────┤ │ использованный под │ │ │ объект Т2^ └───────────────────┘ ─┘ Иллюстрация построена для момента обработки запроса NEW(M2). В этот момент времени в динамической памяти имеются два свободных фрагмента общим объемом шесть слов, которых достаточно для выполнения запроса на выделение элемента хранения под объект М2^ (т.е. для объекта, на котоpый будет указывать M2), однако фрагментация не позволяет системе выделить память под объект М2^. Система управления динамической памятью ведет специальный список свободных фpагментов - пул памяти. При возвращении какого-либо элемента хранения, используемого в прикладной программе, в пул свободной памяти может быть реализовано "склеивание" соседних свободных фpагментов в один фpагмент большего объема. Например, если в предыдущей программе изменить последовательность обращений к динамической памяти на приведенную ниже, то описанного выше отказа по памяти не произойдет: BEGIN NEW(T1);...NEW(T2);...NEW(M1);... DISPOSE(T1);...DISPOSE(T2);... NEW(M2);... Здесь при обработке запроса NEW(M2) в пуле динамической памяти будет находиться один свободный фрагмент объема шесть слов, образованный "склеиванием" элементов Т1^ и T2^, выполненным при обработке запроса DISPOSE(T2). В общем случае вопросы эффективной реализации управления динамической памятью, обеспечивающей минимум отказов при ограниченном объеме, составляют отдельную проблему. Здесь мы только заметим, что с организацией выделения "первого подходящего" фрагмента памяти в программировании связывают такие термины как "хип" или "куча", относящиеся скорее к профессиональному жаргону, чем к научно-методической терминологии. Тем не менее эти термины довольно образно характеризуют принципы организации динамической памяти. Организация корректной последовательности запросов связана, кроме того, как минимум еще с двумя проблемами. На том же жаргоне их называют проблемы "висячих ссылок" и "мусора", а определяют они две стороны одной и той же ошибки, заключающейся в некорректной работе с указателями. Следующий фрагмент программы иллюстрирует возникновение таких ошибок (тип "Треугольник" описан выше). VAR T1, T2:Треугольник; BEGIN NEW(T1);...T2:=T1;... DISPOSE(T1); (* T2-"висячая ссылка" *) ............ NEW(T1);...NEW(T2);... T1:=T2; (* Остался "мусор" *) Из этого примера понятно, что "висячая ссылка" - это указатель прикладной программы, указывающий на свободный фрагмент динамической памяти. Поскольку этот фрагмент может быть выделен системой по какому-либо запросу другой прикладной программе, Т2 может открыть доступ к "чужим" данным и "разрешить" их интерпретацию как треугольника. Последствия такой интерпретации в общем случае непредсказуемы. Заметим, что "висячая" ссылка и "пустая" ссылка (имеющая значение NIL, см. pазд.III) являются совершенно разными понятиями. "Мусор" - это занятый фрагмент динамической памяти, к которому в прикладной программе потерян доступ. В приведенном примере мусором оказался старый треугольник Т1^, на который указывал Т1 до передвижки (установки на Т2). Этот мусор неустраним: программист не имеет к нему доступа, а система управления "считает" мусор занятым фрагментом памяти. Объединяет эти два вида ошибок одно общее обстоятельство: они не обнаруживаются исполнительной средой. Идентифицировать подобные ошибки можно только путем тщательной проверки и отладки программы. И, наконец, по своим возможным влияниям на работу программы мусор гораздо "безобиднее" висячей ссылки. Он фактически приводит только к увеличенному расходу памяти, в то время как висячая ссылка способна при определенных условиях полностью парализовать процесс выполнения программы. В сложных системах "цена" висячей ссылки может оказаться очень высокой. Использование автоматической памяти связано с созданием / уничтожением специальных элементов хранения, связанных с активными объектами - действиями или процедурами. Любая процедура тpебует для выполнения собственной индивидуальной локальной среды. Подобную среду образуют локальные переменные, объявленные в процедуре, формальные параметры, элемент хранения адреса возврата в процедуру, т.е. набор объектов, обеспечивающих выполнение действий, связанных с процедурой. Необходимость в локальной среде возникает только в момент вызова процедуры - момент интерпретации объекта процедурного типа. После завершения такой интерпретации необходимость в локальной среде исчезает. Таким образом, время жизни локальной среды ограничивается временем отработки программы, в которой она описана. Соответственно запрос на создание локальной среды связан с вызовом процедуры, а запрос на уничтожение - с окончанием фазы активности объекта (оператор RETURN или END в теле процедуры). Например: VAR W1, W2: PROC; PROCEDURE Работа_1; VAR A: INTEGER;... BEGIN... W2;... END Работа_1; PROCEDURE Работа_2; VAR A: INTEGER;... BEGIN... W2;... END Работа_2; BEGIN... W1:=Работа_1;... W2:=Работа_2;... W1;... В этом фрагменте описаны два активных объекта процедурного типа PROC = PROCEDURE(): W1 и W2 и две процедуры без параметров: Работа_1 и Работа_2, которые могут использоваться как константы типа PROC. Интерпретация (активизация) W1 приведет к вызову Работы_1 и созданию локальной среды (содержащей переменную А). В процессе выполнения Работы_1 производится активизация объекта W2 и соответственно создание локальной среды для Работы_2. В любой текущий момент времени в системе могут быть активны несколько объектов. (В этом примере активизация W1 приводит к активизации W2, затем они оба остаются в активном состоянии и затем теряют свою активность в обратной последовательности: сначала пассивируется W2, затем W1). Последовательность активации и пассивации связана с вложенностью вызовов процедур, соответственно управление автоматической памятью основывается на использовании стека - структуры, поддерживающей такую вложенность. Ниже для этого фрагмента приведена иллюстрация распределения автоматической памяти, существующего в течение совместной активности объектов W1 и W2. ┌─ ┌───────────────────┐ ─┐ │ │ Переменная А │ │ │ ├───────────────────┤ > Локальная среда │ │ Адрес возврата │ │ для W1 Занятое прост- < ├───────────────────┤ ─┤ ранство │ │ Переменная А │ │ │ ├───────────────────┤ > Локальная среда │ │ Адрес возврата │ │ для W2 Вершина ──> └─ │───────────────────┤ ─┤ стека │ │ │ автоматической │ │ │ памяти │ │ │ Свободное │ │ > пространство Пассивация │ │ │ памяти │ ^ │ │ │ │ │ │ │ │ │ │ │ │ │ v │ └───────────────────┘ ─┘ Активация При активации каждого нового объекта вершина стека "опускается вниз" на величину, определяемую размерами локальной среды этого объекта,- при его пассивации вершина стека "поднимается вверх". С использованием автоматической памяти связаны две основные проблемы: рекурсии и множественности ассоциаций. Рекурсия - механизм, позволяющий объекту совершать самоактивац-ию. Например, по схеме: W1-->W1 (прямая рекурсия) или W1-->W2 ...-->W1 (косвенная рекурсия). Прямая рекурсия связана с непосредственной повторной (вложенной) активацией, а косвенная - с опосредованной (причем число посредников в схеме W1-->...-->W1 может быть произвольным). Использование рекурсии напрямую связано с размерами рабочего пространства автоматической памяти. Использование рекурсивных активаций объектов, с одной стороны, позволяет иметь очень лаконичные и емкие по содержанию программы, с другой стороны, в рекурсивных схемах (особенно в косвенной рекурсии) возрастает вероятность появления трудно идентифицируемых ошибок. Множественность ассоциаций заключается в том, что в классе автоматической памяти могут быть одновременно размещены несколько одноименных объектов, имеющих в общем случае различные значения и относящиеся к разным активностям одного и того же или опять-таки разных объектов. В приведенном примере существуют два одноименных объекта: переменная А, связанная (ассоциированная) с активностью W1, и переменная А, ассоциированная с активностью объекта W2. В соответствии с принципом стека система упpавления автоматической памятью всегда pассматpивает в качестве активной последнюю созданную ассоциацию (самую "ближнюю" к вершине стека автоматической памяти). Возникновение множественности ассоциаций обусловлено только использованием в прикладных программах одноименных переменных с различной областью действия (областью видимости). Если уж использование таких переменных и является необходимым (в чем всегда стоит усомниться), то при их интерпретации следует помнить о множественности ассоциаций. ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄А___Б___v_Г___ Д___q_U___ Г___m_╜___ ╛___h_╤___ ¤___e_└___ ╟___b_е__ ┬________ ____Z___________________@___
____@____@_________ -___x_о___ ├___s_ч___ ■___n_Ф___ й___i_з__ │__d_└__ ╨____w"__ Ы"__Z_B#__ __________________________________B#__C#__t_j#__ k#__m_r#__ s#__f_а#__ б#____Ў#__ ў#__X_∙#__ ·#__Q_Н%__ w"__ Ы"_______Ї______Ї______Ї______Ї______Ї______Ї __ c __s_F___ H__o_║M__m_▀M__h_сM__f_уM__a_ыM__^_?N__ ╪P__\_ЄP__Y_СQ__ _S__W_ь(__7____7____6____7_6____7_6____6____7 __u_E__u_.___u_╥___u_═___u_______________________________________________________‑_______Ё_C_?_I ═___М___y_╬___w_O___u_п___u_Б___u_7"__c_F$__a_з%__a___________________________________________________C_C ‑_______Ё_______C_?_C_з%__╫%__y__&__y_T&__y_f&__y_Я&__y_▐&__y_р&__y__(__y_∙*__y_ -__y_____________________________________________________________?_C -__?-__y_╢.__y_ф0__y_Н5__y_к9__y_▀:__y__;__w_у;__u_х;__u_________________________________________________________________C_?_C х;___?__y_щ@__y_&A__y_УA__y_·B__y_лD__y_УG__y_▓H__y_хH__y__I__y_____________________________________________________________?_C _I__ I__y__N__y_ЇS__y_╘U__y_·U__y_+V__y_[V__y_wV__y_+W__y_TW__y_____________________________________________________________?_C TW__ ╫]__ ^__y_=^__y_?^__y_&___y_Q___y_S___y__a__y_7d__y_mg__y_Bh__y_____________________________________________________________?_C Bh__sh__y_uh__y_Hi__y_k__y_кk__y_мk__y_1l__y_Nl__y_}l__y_┤l__y_____________________________________________________________?_C ┤l__ъl__y_лm__y_╥m__y_╧n__y_·n__y_Зo__y_╕o__y_Gp__y_[q__y___________________________________________________________________?_C [q__]q__y_Йq__y_├q__y_ q__y_+r__y_Xr__y_█s__w_Уt__w_░t__u_________________________________________________________________?_C_G ░t__Вu__y_Дu__y_v__y_Jw__y_qw__y_Єy__y_╨z__y_Їz__y_({__y_A{__y_____________________________________________________________C_C A{__e__y_Ь__y_d~__y_Я~__y_б~__y_┼__y_____________________________________________________________C_C ┼__tА__y_А__y_╖А__y_┼А__y_№А__y__Б__y_#Б__y_)Б__y_хБ__y_уГ__y_____________________________________________________________C_C уГ__хГ__y_ _Ж___Ж__y_Ж__y_еИ__w_ўК__w_ Л__w_{О__w_ХП__w_уП__w__Р__w___________________________________________________________________C_G _Р___Р__y_┘Р__y_ ┤У__╞У__y_шФ__w_2Ч__u_4Ч__u_oЧ__s_qЧ__s_бЧ__s_═Ч__s__Ш__s_______________________________________________________________G_C_I_C _Ш__6Ш__y_gШ__y_МШ__y_░Ш__y_уШ__y_#Щ__y__Щ__y_НЩ__y_═Щ__y__Ъ__y_____________________________________________________________I_G _Ъ__4Ъ__y_`Ъ__y_bЪ__y_vЫ__w_ЫЬ__w_┐Ь__w_ьЬ__w_*Э__w_LЭ__w___________________________________________________________________C_G LЭ__╒Э__y_╫Э__y_'Ю__w_рЮ__w__Я__w_ZЯ__w_ЧЯ__w_╘Я__w__а__w___________________________________________________________________G_C _а__Jа__y_Га__y_Еа__y_╖а__w_╣а__w_Kв__w_7д__w_tд__w_░д__w___________________________________________________________________C_G ░д__щд__y_е__y_ле__y_█е__y_ж__y_<з__y_Bи__y_Уи__y_си__y_%й__y_____________________________________________________________C_C %й__[й__y_│й__w_єй__u_bм__s_dм__q_Жм__q_╜м__q_╒м__q__н__q_____________________________________________________________C_I_C_I_C _н__Hн__y_|н__y_Йн__y_Лн__y_&п__y_Є░__y_ ~┴__Ж├__y_И├__y_н├__y_р├__y_ў├__y_z╟__y_P╩__y_┤╩__y_й╦__y_▄╦__y_____________________________________________________________?_C ▄╦___╠__y_\╠__y_Ф╠__y_╠╠__y__═__y_<═__y_1╬__y_ю╬__y_Є╧__y_в╤__y_____________________________________________________________?_C в╤__┤╤__y_╤╤__y_▐╤__y__╥__y_%╘__y_S╘__y_v╘__y_П╘__y_н╘__y_╦╘__y_____________________________________________________________?_C ╦╘__∙╘__y__╒__y__╒__y_,╒__y_F╒__y_d╒__y_В╒__y_▓╒__y_╛╒__y_└╒__y_____________________________________________________________?_C └╒__п╓__y_▒╓__y_╩╓__y_ф╓__y__╫__y_'╫__y_d╫__y_М╫__y_Ы╫__y_и╫__y_____________________________________________________________?_C и╫__╛╪__y_-┘__y_e┘__y_╓┘__w__┌__u_#▌__s_6▐__q_O▐__q_|▐__q_____________________________________________________________C_I_C_I_C |▐__Я▐__y_▄▐__y__▀__y__▀__y_
▀__y_╒▀__y_ нц__╪ч__y_2ъ__y_hъ__y_Ўы__y_°ы__y_Vь__w_Бь__w_дь__w_ Ўю___я__y_ я__y__я__y__я__w_╫я__w_∙я__w_+Ё__w_PЁ__w_∙Ё__w___________________________________________________________________C_G ∙Ё__{Є__y_}Є__y_Є__y_БЄ__y__є__y_7є__y_\є__y_~є__y_Ює__y_ї__y_____________________________________________________________C_C ї__@ї__y_╡ї__y__ў__y_ў°__y__∙__y_.∙__y_[∙__y_Б∙__y_д∙__y_╟∙__y_____________________________________________________________C_C ╟∙__у∙__y_√∙__y_0·__y_e·__y_Ъ·__y_╧·__y_╤■__y_Ї___y_2___y_Z___y_____________________________________________________________C_C Z___Й___y_о___y_░___y_^___y_Ъ___y_┘___y_┤ __y_+ └ o*__В*__y_╖*__y_╪*__y__+__y_U+__y_i+__y_д+__y_┘+__y_$,__y___________________________________________________________________I_C $,__&,__y_(,__y_*,__y_P,__y_v,__y_Ы,__y_▄,__y__-__y_R-__y_y-__y_____________________________________________________________I_G y-__а-__y_╟-__y_ю-__y_).__y_b.__y_Й.__y_░.__y_╫.__y_№.__y_!/__y_____________________________________________________________I_G !/__c/__y_г/__y_▄/__y__0__y__0__w_Й1__w_x3__w_и3__w_с3__w___________________________________________________________________C_G с3__у3__y_╓6__y_c8__y_e8__y_Ж8__y_л8__y_щ8__y__9__y_+9__y_e9__y_____________________________________________________________C_C e9__g9__y_ю<__y_#?__y__C__y_8C__y_XC__y_МC__y_жC__y_╞C__y_·C__y_____________________________________________________________C_C ·C___D__y_RD__y_TD__y_кH__y_мH__y_▌H__w_ ┐K__ЎK__y_-L__y_dL__y_ЫL__y_нL__y_уM__w_?N__w_iN__w_аN__w___________________________________________________________________C_G аN__вN__y_╪P__y_█T__y_▄T__ ▌T__ __________________________________________________________________________________________C_C__╥_═;L, __C6К_Л$____▒:_╥_═;L, __C6К_Л$____╨7▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄7_ _____=___ж___C__ _*___ __ ___ __!_░___ __"_%___ __#_q___ __$_╡___ __%_ ___ __&_____ __'_Б___ __(_ ___ __)_P___ __*_о___ __+_0___ __,_н___ __-_M___ __._└___ __/_,___ __0_?___ __1_9___ __2_!___ __3_x___ __4_____ __5_6___ __6_├___ __7___▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄________________=_______\T____________________╢_▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄____=______Б__\T_____Б__]T__ ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄______________ _(_______01/01/9412/03/93\T__▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ |
![]() |
||
НОВОСТИ | ![]() |
![]() |
||
ВХОД | ![]() |
|
Рефераты бесплатно, реферат бесплатно, курсовые работы, реферат, доклады, рефераты, рефераты скачать, рефераты на тему, сочинения, курсовые, дипломы, научные работы и многое другое. |
||
При использовании материалов - ссылка на сайт обязательна. |