суббота, 31 января 2009 г.

Два языка, два мира главных героинь в повести А. Грина «Алые паруса»

Предметом исследования стала женская речь главных героинь повести «Алые паруса» – Ассоль и Лилиан Грей. Это обусловлено тем обстоятельством, что существует бросающаяся в глаза разница в развернутости ав-торской характеристики коммуникативных качеств и речевых умений женских и мужских персонажей.
Отказ автора от оценки коммуникативных качеств речи Ассоль и Лилиан Грей обусловлен, как нам кажет-ся, его желанием зафиксировать внимание читателя не на том, что сказано, а на том, что не сказано. А. Грин пишет о своих героинях: «…многие подозревали, хотя дико и смутно, что ей дано больше прочих – лишь на другом языке» (1, с. 47), или: «…грусть, любовь и стеснение наполняли ее, когда она прижимала мальчика к груди, где сердце говорило другое, чем язык, привычно отражающий условные формы отношений и помышле-ний» (1, с. 26). Грин отмечает, что и для Лилиан Грей, и для Ассоль в коммуникации важно то, что невыразимо в речи, то, что не передашь на бумаге. Язык является не только недостаточным коммуникативным средством, которое не может в полной мере передать необходимую информацию, но становится барьером между внутрен-ним и внешним миром. Возникает необходимость другого, нового языка ощущений и чувств.
Язык, «привычно отражающий условные формы отношений и помышлений», становится помехой в ком-муникативном акте для обеих героинь, он не способен выразить все эмоциональное богатство и содержание их напряженной духовной жизни. Грин пишет, что Ассоль совершала «…на каждом шагу множество эфир-но тонких открытий, невыразимых, но важных, как чистота и тепло». И далее: «Иногда – и это продолжалось ряд дней – она даже перерождалась; физическое противостояние жизни проваливалось, как тишина в ударе смычка…» (1, с. 46). Перерождение как процесс сложных эмоциональных, интеллектуальных и духовных про-цессов осознания себя и мира свойственен для Лилиан Грей: «Она похудела: в надменности ее тонкого лица светилось новое выражение, подобное возвращенной юности» (1, с. 32). Способность к «перерождению» и уме-ние использовать «другой» язык, «язык сердца» объединяет Ассоль и Лилиан Грей, несмотря на разность их социального положения.
Грин отражает ситуацию своеобразного женского двуязычия («…сердце говорило другое, чем язык...»). Для героинь Грина характерны два способа коммуникации. Один словесный, поэтому Ассоль «говорит как большая» и способна «толково объяснить», а Лилиан успешно общается с доктором, портнихами и дворецким. Другой – несловесный, именно поэтому партнерами Ассоль по общению становятся еж, черная пушистая соба-ка, деревья, куст, цветы, Бог; у Лилиан – Богоматерь и уехавший сын. При этом партнеры по общению, тре-бующие и не требующие обязательного внешнего оформления речи, входят в одно коммуникативное поле.
Под коммуникативным полем будем понимать совокупность всех актов коммуникации персонажа с дру-гими действующими лицами, учитывая и однократные реплики, обращенные к случайным партнерам. Поле общения Ассоль – это поле с подвижным ядром и нежесткой границей между ним и периферией. Это означает, что партнеры по общению могут перемещаться от центра, ядра поля к его периферии и наоборот. Сначала центр ее коммуникативного поля занимает Лонгрен. Отец «перемещается» на периферию, когда повзрослев-шую дочь стало тяготить «вынужденное одиночество вдвоем» (1, 46). Опустевший центр коммуникативного поля временно, до появления Артура Грея, занимают деревья, куст, колокольчик, ирис. В конце повести цен-тром ее коммуникативного поля стал капитан Грей. Периферию поля занимали угольщик Филипп, сказочник Эгль, приказчик, хозяин лавки игрушек, одинокий пешеход, которые были заинтересованы в Ассоль как парт-нере по коммуникации.
Круг общения Лилиан Грей составили ее сын, Богоматерь, портнихи, доктор, дворецкий. Интересно отме-тить, что для Лилиан общение желательно только с ее ребенком. Сын – центр коммуникативного поля на про-тяжении всей повести, это единственный партнер по общению, который важен сам по себе. Все остальные вы-нужденные, даже Богоматерь. Общение с ними реализуется на периферии коммуникативного поля Лилиан и только в связи с информацией, которую можно получить от них или донести до них. Таким образом, коммуни-кативное поле Лилиан Грей можно обозначить как поле с жесткой границей между ядром и периферией, ядро неподвижно и сжато до точки. Этой точкой является Артур Грей.
Периферия коммуникативных полей соотносится с «внешним» миром, и для жизни в нем обеим героиням необходим «привычный» язык. Ядро соотносится с «внутренним» миром, где язык не обязателен. Не случайно писатель создает впечатление отчужденности текста, произносимого Лилиан, от нее самой. В повести она чаще молчит, чем говорит. (2, с. 27). Качество внешне проявленной речи Ассоль автор передает при помощи слова лепетать в значении «говорить неправильно, неясно, несвязно» и мурлыкать в значении «напевать или гово-рить тихим мягким голосом» (3). Внутренний мир Ассоль и Лилиан – это мир тишины и сосредоточенности. Для «духовного слуха» героинь А. Грина человеческая речь слишком груба, а обычный язык «прост и скучен». Когда жители Каперны видят корабль с алыми парусами, они воспринимают его как опровержение «привычно-го бытия». «Алые паруса» – это явленный знак невыразимого в слове. Люди, которые «перекликались», «вопи-ли», «говорили», «змеиным шипением всхлипывали», «трещали», смолкли. Наступила тишина.

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

вторник, 27 января 2009 г.

О процессоре баз данных среды программирования Delphi

Блогун - монетизируем блогиПотоки информации, циркулирующие в мире, который нас окружает, огромны. Во времени они имеют тенденцию к увеличению. Поэтому в любой организации, как большой, так и маленькой, возникает проблема такой организации управления данными, которая обеспечила бы наиболее эффективную работу.
С появлением ЭВМ и использованием их для обработки информации появилась возможность автоматизировать решение многих информационно - справочных и расчетных задач. Эти идеи нашли свое воплощение в системах управления базами данных (СУБД).
Роль СУБД как единого средства хранения, обработки и доступа к большим объемам информации постоянно возрастает. При этом существенным является постоянное повышение объемов информации, хранимой в БД, что влечет за собой требование увеличения производительности таких систем.
На сегодняшний день практически все языки программирования имеют расширения для работы с базами данных наиболее распространённых форматов.
На рынке программных средств появляются всё более сложные и совершенные разработки, которые имеют универсальное применение. Реклама производителей зачастую представляет предлагаемые новшества как наилучший вариант решения проблем. Но только является ли этот вариант на самом деле наилучшим? Перед программистом встаёт сложный вопрос выбора средства разработки.
Одним из таких средств является среда программирования Delphi.
Среда программирования Delphi предоставляет все необходимые инструменты для создания приложений работающих с базой данных.
Одним из достоинств программирования баз данных в Delphi является использование открытой архитектуры доступа к данным. Процессор баз данных Borland Database Engine (BDE), в основу которого положена технология интегрированной базы данных (Integrated DataBase API (IDAPI)), предоставляет возможность унифицированного подключения, как к локальным, так и к удаленным базам данных
Особенность архитектуры BDE обеспечивает ряд существенных преимуществ:
1. Реальное разделение программного кода и механизм доступа к данным. Причем сам доступ также осуществляется на нескольких уровнях-BDE, драйвера, сервера БД. Приложение Delphi для работы с БД можно настроить на использования с любой СУБД, для которой имеется соответствующий драйвер, буквально за несколько минут. При этом перекомпиляция самой программы не требуется. Плата за такую великолепную переносимость - скорость обмена данными через BDE и драйверы несколько меньше чем напрямую между приложением и СУБД.
2. Разделение драйверов и выделение в специальную группу драйверов для серверов SQL позволило гораздо полнее использовать функциональные возможности серверов БД, а применение единого API сняло остроту проблемы интерпретации процесса выполнения транзакций разными серверами.
3. BDE идеально подходит для создания приложений для архитектуры клиент/сервер, так как обеспечивает следующие функции:
-обработка запросов в диалоговом режиме
-представление через BDE вызовов операционной системы;
-модифицируемые запросы;
-поддержка хранимых процедур
-управление регистрацией пользователя
4. Все инструментальные средства баз данных Borland - Paradox, dBase, Database Desktop - используют BDE. Все особенности, имеющиеся в Paradox или dBase, “наследуются” BDE, и поэтому этими же особенностями обладает и Delphi.
5. Библиотека объектов содержит набор визуальных компонент, значительно упрощающих разработку приложений для СУБД с архитектурой клиент-сервер. Объекты инкапсулируют в себя нижний уровень - Borland Database Engine.
6. Предусмотрены специальные наборы компонент, отвечающих за доступ к данным, и компонент, отображающих данные. Компоненты доступа к данным позволяют осуществлять соединения с БД, производить выборку, копирование данных, и т.п. Компоненты визуализации данных позволяют отображать данные в виде таблиц, полей, списков. Отображаемые данные могут быть текстового, графического или произвольного формата.
7. Таблицы сохраняются в базе данных. Некоторые СУБД сохраняют базу данных в виде нескольких отдельных файлов, представляющих собой таблицы (в основном, все локальные СУБД), в то время как другие состоят из одного файла, который содержит в себе все таблицы и индексы (InterBase). Например, таблицы dBase и Paradox всегда сохраняются в отдельных файлах на диске. Директорий, содержащий dBase .DBF файлы или Paradox .DB файлы, рассматривается как база данных. Другими словами, любой директорий, содержащий файлы в формате Paradox или dBase, рассматривается Delphi как единая база данных. Для переключения на другую базу данных нужно просто переключиться на другой директорий. InterBase сохраняет все таблицы в одном файле, имеющем расширение .GDB, поэтому этот файл и есть база данных InterBase. \
Доступ к данным
TDataSet

TDBDataSet

TTable TQuery
Рис. 1Основой архитектуры доступа к наборам данных (рис.1) является базовый класс TDataSet, который содержит абстрактное представление записей и полей набора данных, инкапсулирующий управление, навигацию и манипулирование набором данных. Некоторые методы класса TDataSet могут быть переопределены с целью создания компонента, подключаемого к определенному физическому формату данных. Исходя из этого, класс TBDEDataSet определен как производный от класса TDataSet и является основным классом источников данных, он вводит такие концепции как BDE-базы данных и сеансы.
Класс TTable представляет структуру и данные, содержащиеся в таблице базы данных, знает, как обрабатывать индексы и применять специальные приемы, связанные с поддержкой отношений двух таблиц типа один-ко-многим. Класс TQuery – набор данных, содержащий информацию, возвращенную в результате выполнения SQL-запроса.
При помощи свойств и методов компонент, работающих с БД, осуществляется большинство механизмов доступа к данным, управление данными, их редактирование, выполняются различные манипуляции, и осуществляется интерфейс.
Используя самое простое приложение, работающее с базой данных, проведем эксперимент. Исследуем возможности и временя работы автономной базы данных, на основе BDE (Borland Database Engine), с использованием запросов.
Для экспериментального исследования возможностей работы БД будем использовать БД «Книги». Данная БД является реляционной, локальной, основана на BDE, состоит из четырех таблиц. Количество записей в БД генерируется автоматически.

Эффективность работы БД будем определять временем работы запроса с разным количеством записей.
Исследуем два различных типа запросов:
1. Запрос на выборку данных из БД. «Выбрать из базы данных все книги Уоррена и писателей, которые родились после 1900 года»
2. Запрос с использованием объединения таблиц. «Объединить таблицы и выбрать сказки Пушкина напечатанные в издательстве «Дрофа» »
Постепенно будем увеличивать количество записей в таблицах, и подсчитывать время работы запроса соответственно.
Количество записей в таблицах
10000
60000
110000
210000
300000
500000
1000000
1500000
Время работы запроса на выборку данных (сек)
0,18
1,35
2,6
5,3
11,8
22,11
90,11
177,52
Время работы запроса на объединение данных (сек)
0,52

2,37
4,74
9,6
24
56,3
135,14
Запрос не выполняется

При увеличении количества записей время выполнения запроса увеличивается. Кроме того, запрос с использованием объединения таблиц прекращает работу при количестве записей равных 1500000, и система выводит сообщение об ошибке. Система также выводит сообщение об ошибке «table is full (таблица заполнена)» при попытке заполнения таблиц более чем 1500000 записей. Полученные данные отражены на следующем графике.
При полученных результатах можно сделать следующие выводы:
1. Время выполнения запроса зависит от количества записей в БД и от сложности запроса. Чем больше записей в таблице и чем сложнее запрос, тем требуется больше времени на его выполнение;
2. Требуется достаточно большое количество времени на обработку запроса, что не эффективно в работе.
3. Таблицы имеют ограничение. В работе может использоваться не более чем 1500000 записей.
Т.о. при больших масштабах работы, в производственной сфере реляционная БД на основе BDE работает не эффективно, т. к требуется большое количество времени на обработку данных, и существует ограничение в количественном наборе данных.

понедельник, 26 января 2009 г.

Метод карацубы, или соревнование с обычным способом умножения «в столбик»

Часто эффективный алгоритм значит гораздо больше, чем вычислительные возможности компьютера. Пересматриваются и совершенствуются способы решения многих задач, и даже такой, казалось бы, элементарной как умножение многозначных чисел.
Обычный способ «в столбик», известный многие столетия, выглядит для нас самым быстрым. Наверное, мы просто не представляем, что числа можно перемножать как‑то иначе.
Но, оказывается, существуют и другие методы умножения, и куда более эффективные!
В этой статье мы обсудим один из таких методов, обнаруженный в 1962 году московским математиком Анатолием Александровичем Карацубой (тогда 25‑летним молодым ассистентом, а сейчас он профессор МГУ). Сначала теоретически, «на листе бумаги» оценим привычный способ умножения и новый метод, а затем экспериментально, написав программы, проверим теорию на практике.

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

Здесь мы совершили 4*4=36 элементарных умножений (каждая цифра одного числа провзаимодействовала с каждой цифрой другого числа) и некоторое количество сдвигов и сложений.
Вообще, если мы перемножаем столбиком n‑значные числа, то нужно произвести n2 элементарных умножений, а сдвигов и сложений заведомо не больше по порядку n2, то есть основную нагрузку несут именно элементарные умножения. Поэтому можно указать такую константу C1, отражающую количество сложений и сдвигов, что сложность алгоритма T(n)£C1n2 для любого n.
Точной зависимости T(n) мы не нашли, но указали её оценку. Так обычно и поступают для конкретного алгоритма или программы, ведь нахождение точной зависимости – задача непростая. А хорошая оценка даёт достаточное представление о сложности алгоритма.

2. Открываем алгоритм Карацубы
В основе нового метода лежит такой фундаментальный принцип, как «разделяй и властвуй» ("divide and conquer"), на котором построены сотни различных быстрых алгоритмов (вспомним хотя бы сортировки или динамическое программирование). Задачу разбивают на части, находят их решение, а затем получают решение всей задачи. Этот приём часто эффективен, особенно если его применять рекурсивно.
Итак, «разделяем». Заметим, чтобы стандартно перемножить два 2n‑значных числа, нужно сделать 4 умножения n‑значных чисел плюс сдвиги и сложения.
Пусть x и y – 2n‑значные числа. Мы можем представить их, как x = a × 10n + b и y = c × 10n + d, где a, b, c, d – n‑значные числа (например, 9036=90*102+36), и тогда произведение
(S)
Действительно, 4 умножения: a × c, a × d, b × c и b × d. И формула (S) – это всё тот же школьный способ умножения столбиком, только в системе счисления с основанием 10n.
«Властвуем». Но сделаем ещё один шаг в преобразованиях, который и приведёт к методу Карацубы. Простой приём – используем произведения, которые уже вычислили. Для этого заменяем число a × d + b × c на равное ему (a + b) × (c + d) – a × c – b × d . В результате
(K)
И у нас уже только 3 умножения: a × c, b × d и (a + b) × (c + d)! Хотя на три операции сложения‑вычитания больше.
Вот здесь мы и выигрываем соревнование с обычным способом – за счет замены «трудоемкой» операции умножения фиксированным числом операций сложения‑вычитания. Ведь, начиная с достаточно больших n, умножение n‑значных чисел требует всё больше времени, чем любое фиксированное число n‑разрядных сложений или вычитаний, разница во времени становится настолько значительной, что мы практически экономим операцию умножения.
Казалось бы, при уменьшении числа произведений n‑значных чисел с четырех до трех выигрыш во времени – в лучшем случае всего 25%.
Но естественно продолжить гонку, то есть полученные три произведения найти таким же образом, свести их вычисление к девяти произведениям, снова сэкономить 25% времени, и т. д. В результате выигрыши на каждом шаге объединяются и дают асимптотическое улучшение временной сложности. Таким образом, мы получаем рекурсивный метод умножения больших целых чисел.
3. Приводим пример и учитываем некоторые особенности алгоритма
Наглядно процесс умножения по Карацубе представляется в виде дерева рекурсивных вызовов. На входе в рекурсию произведение двух «длинных» чисел порождает вычисление трех произведений «коротких» чисел, каждое из которых – ещё по три произведения, и так до произведений однозначных чисел. «Последние» произведения вычисляются обычным способом, а затем на выходе из рекурсии по формуле (K) «собираются» произведения более высоких уровней до искомого произведения в вершине.
Перемножим, например, числа 9036 и 9744. Конечно, на таких небольших числах мы не почувствуем эффективность нового метода, но ещё раз разберёмся с его логикой и выделим некоторые особенности.
Строим дерево рекурсивных вызовов:
(график)
И здесь могут возникнуть две проблемы, объединённые общим вопросом «а как же дальше продолжить использование метода?»
1. Длины перемножаемых чисел оказались нечетными. Тогда длины «левых» частей (a и c) берём на единицу больше. Очевидно, формула (K) по прежнему верна, и в качестве n будет общая длина «правых» частей (b и d).
Пример: 126*141 = 12*14*102+((12+6)*(14+1) – 12*14 – 6*1)*101+6*1
= 12*14*102+(18*15 – 12*14 – 6*1)*101+6*1
2. В произведении (a + b)*(c + d) суммы имеют различную длину (а максимально они могут отличаться на 1). Тогда уравниваем их, дополняя «короткую» нулём и, конечно, после вычисления произведения избавляемся от лишнего нуля. Этот же способ применяем и в случае, когда различны длины исходных чисел.
Пример: 9*16=(90*16)/10 = (9*1*102+((9+0)(1+6) – 9*1 – 0*6) *101+0*6)/10
= 1440/10=144
Вычислив «элементарные» произведения, поднимаемся по дереву и «собираем» произведения:
9*16 = (90*16)/10=(9*102+(63 – 9 – 0)*101+0)/10 = 144
90*97=81*102+(144 – 81 – 0)*101+0 = 8730
12*14=1*102+(15 – 1 – 8)*101+8 = 168
18*15=1*102+(54 – 1 – 40)*101+40 = 270
126*141=168*102+(270 – 168 – 6)*101+6 = 17766
36*44=12*102+(72 – 12 – 24)*101+24 = 1584
9036*9744=8730*104+(17766 – 8730 – 1584)*102+1584 = 88046784
4. Оцениваем сложность
Если перемножаемые числа имеют длину n = 2k, то на последнем шаге входа в рекурсию, мы выполняем не более 3k+1 элементарных умножений. Так как с каждым шагом количество произведений «коротких» чисел увеличивается в три раза, а совершается не более k + 1 шагов (ровно k, если не учитывать возможное увеличение разрядности в суммах a + b и c + d). А затем мы выходим из рекурсии, собирая произведения «длинных» чисел из произведений «коротких» с помощью сдвигов, сложений и вычитаний, количество которых не превосходит по порядку количества элементарных умножений.
Тогда сложность такого метода для любого n = 2k T(n) £ C × 3k+1, где константа C отражает количество сдвигов, сложений и вычитаний метода.
Если же n – любое натуральное число, то существует натуральное k такое, что 2k–1<> C1) «стирается», и временные сложности определяются степенями n1,6 и n2.
5. Формулируем усовершенствованный алгоритм Карацубы
Заметим, что процесс деления «длинных» чисел на «короткие» мы можем остановить на любом из шагов метода, далее полученные произведения найти обычным способом. Назовём точкой стандартного умножения – то значение длины чисел, на котором мы переходим к их обычному умножению.
Когда же выгоднее это сделать, продолжать ли процесс до однозначных чисел?
Среди точек стандартного умножения есть особенная – обменная точка N, начиная с которой описанная выше замена произведения «нетрудоёмкими» операциями (или один шаг метода) становится выигрышной. Это отнюдь не происходит сразу, сокращение числа произведений выполняется ценой дополнительных сложений‑вычитаний, разбиения числа на части. Вообще обменная точка во многом зависит от программной реализации алгоритма, её оптимальности или неоптимальности: непродуманная программа может значительно увеличить эту цену.
Но тогда разумно взять в качестве точки стандартного умножения именно обменную точку. Так мы максимально ускорим метод. Ведь перемножать по Карацубе числа, длиной меньшие N, уже не эффективно, а перемножать стандартно числа, длиной большие N, значит упускать возможность ускорить умножение.
Обменную точку несложно определить для конкретной программной реализации алгоритма, что мы и сделаем, написав программу (как?– вопрос на понимание метода, проверьте себя).
Итак, формулируем окончательный вариант алгоритма Карацубы. Пусть необходимо найти произведение двух целых чисел x × y с равными длинами.
Шаг 1. Если длина x и y меньше N – длины обменной точки (или точки стандартного умножения, если N пока неизвестно), то перемножаем их классическим способом.
Шаг 2. Иначе разбиваем каждое из сомножителей на две части: x = a × 10n + b и y = c × 10n + d, где n– длина «правых» частей, которая либо равна длине «левых» частей для чётной длины чисел x и y, либо на единицу меньше в противном случае.
Шаг 3. Вычисляем частичные произведения a × c, b × d и (a + b) × (c + d), рекурсивно обращаясь к данному алгоритму, уравнивая при необходимости длины перемножаемых сумм.
Шаг 4. Получаем произведение x × y, собирая частичные произведения с помощью операций сложения, вычитания и сдвига по формуле ???. Конец алгоритма.
6. Программно реализуем алгоритм Карацубы
Остаётся аккуратно записать код этой несложной рекурсивной логики.
Числа занесём в списки от младшего разряда к старшему, «задом‑наперёд», так как такая запись удобна при выполнении арифметических операций:
type TNumber=^TDigit;
TDigit=record
data:byte;
next:TNumber;
end;
var num1, num2, answer:TNumber;
И приведём основную функцию метода Карацубы, построенную на нескольких вспомогательных процедурах и функциях, реализацию которых мы оставляем за читателем (см. книгу [5], где описаны основные операции над «длинными» числами).
Отметим только, что эти процедуры и функции необходимо максимально освободить от лишних операций. Например, сложение в стандартном умножении выполнять не по окончанию, а по ходу его, то есть, перемножив очередные цифры, сразу же добавлять результирующую цифру в нужный разряд и формировать перенос в следующий разряд. Иначе многократно повторяясь для больших чисел, эти на первый взгляд «безобидные» лишние операции (в примере запись и чтение промежуточных результатов) очень замедлят программу.
function Multiply(x, y:TNumber; N:integer):TNumber;
var a, b, c, d, p1, p2, p3, sum1, sum2:TNumber;
N1, N2, Dl1, Dl2:integer;
begin
if NStolbikPoint). Перемножаем достаточно большие фиксированные числа (например, длиной n=30000), увеличивая с некоторым шагом значение точки стандартного умножения. При этом время работы алгоритма вначале убывает (исключаются проигрыши нового метода) – мы приближаемся к обменной точке, затем возрастает (упускаются возможности выгодно применить новый метод) – мы проскочили обменную точку и удаляемся от неё. Очевидно, точка стандартного умножения, на которой произошла смена убывания на возрастание, и будет обменной точкой.
Таблица 1
Эксперимент второй
Сравниваем время вычислений по обычному способу и методу Карацубы, ускоренному с помощью определённой в первом эксперименте обменной точки. Построенные таблица и график не нуждаются в каких‑либо комментариях, это результат всей проделанной выше работы.
Таблица 2

Как говорится, что и требовалось доказать.
8. В заключение несколько вопросов и упражнений
1. (В качестве разминки) Часто понятие рекурсии объясняется на примерах, где она вовсе необязательна. Так обычное «циклическое» вычисление факториала не только значительно экономит память, но и почти в два раза быстрее рекурсивного варианта, хотя в нем программа и выглядит «компактнее». Оправдана ли рекурсия в методе Карацубы и возможно ли принципиально (не моделируя стек вызовов программно) заменить её циклом?
2. (В качестве разминки) Будем увеличивать с некоторым шагом длину перемножаемых чисел, при этом скорость «чистого» метода Карацубы (где процесс деления «длинных» чисел на «короткие» продолжается до однозначных чисел) возрастает по сравнению со скоростью обычного способа, и, начиная с некоторого значения, становится больше последней. Является ли это значение обменной точкой?
3. (для математиков) Временная сложность алгоритма Карацубы удовлетворяет рекуррентному неравенству ??? (задача умножения 2n‑значных чисел сводится к двум умножениям n‑значных чисел, одному умножению не более (n+1)‑значных чисел, и простым операциям сложения, вычитания и сдвига, сложность которых пропорциональна n). Решите это неравенство, получив на более строгом уровне, чем это было сделано ранее, оценку временной сложности алгоритма.
4. (Для математиков) Известно, что многие свойства чисел и многочленов очень похожи. Арифметические операции с многочленами выполняются практически аналогично (разница только в отсутствии переноса разрядов). Опишите алгоритм Карацубы для умножения многочленов.
5*. (Для математиков) Поддержание равновесия, или балансировка – один из основных принципов при разработке хорошего алгоритма. Разбивая задачу на неравные части, мы можем получить неэффективный алгоритм. В случае алгоритма Карацубы факт максимальной результативности при разбиении чисел на равные части имеет несложное математическое доказательство. Попытайтесь найти это доказательство. Немного подскажем: весь фокус метода Карацубы – в избавлении от одного, как оказалось, лишнего произведения, и чем «весомее» это произведение, тем лучше.
6. (Для программистов) В качестве основной формулы метода Карацубы можно взять и такую:
???, (K/)
несколько отличную от формулы (K). Укажите рекуррентное неравенство и продумайте программу для этой модификации метода (здесь возникают некоторые свои особенности, например, при реализации арифметических операций необходимо учитывать знак чисел).
7. (Для программистов) Приведённая выше процедура перемножает числа равной длины. Если же числа имеют различные длины, то предварительно необходимо их уравнять, например, приписав к «короткому» числу незначащие нули в его начало. При этом эти нули далее используются наравне с собственными цифрами чисел, то есть происходит увеличение размерности задачи. Иной подход состоит в следующем. Числа x и y длинами lx и ly соответственно снова представляем, как x = a × 10n + b и y = c × 10n + d, где n = max(lx, ly)div 2 и a, b, c, d – не более чем n‑значные числа, и применяем ту же формулу– (K) или (K/). Программно реализуйте описанный метод.
Замечательный своей неожиданностью алгоритм, обнаруженный А. А. Карацубой, становится первым из серии быстрых алгоритмов умножения больших чисел. Обычный способ «в столбик» – уже не самый эффективный, и открывается дорога для дальнейшего исследования. И позже найдены ещё более совершенные методы, использующие идею интерполяции, быстрое преобразование Фурье, модулярную арифметику, понимание которых требует несколько больших познаний в математике. Это алгоритмы Тоома–Кука, Шенхаге, Шенхаге–Штрассена [1, 2, 4].

Для вас статьи на разнообразные темы: интересно и доступно

суббота, 24 января 2009 г.

«Вечерний звон» И. И. Козлова: опыт филологического анализа

Одним из самых значительных произведений Козлова, получившим непосредственные отклики в творчестве Е. П. Ростопчиной, Д. В. Давыдова, А. А. Фета, Я. П. Полонского, А. А. Блока, В. Я. Брюсова, А. А. Ахматовой и др., является романс «Вечерний звон», написанный, по‑видимому, в 1827 г. [1], впервые опубликованный в альманахе «Северные цветы» на 1828 г. и представляющий собой перевод стихотворения Томаса Мура «Those evening Bells» из первого сборника «National Airs», выпущенного издателем В.Пауэром в Лондоне и в Дублине в 1818 г. [2]
Первый выпуск «Избранных известных национальных песен» («Selection of Popular National Airs») представлял собой музыкальное издание, в котором нотная публикация мелодий Стивенсона, предназначенных для широкого исполнения, сопровождалась поэтическими текстами Мура, приспособленными к конкретной музыке. Последующие выпуски серии, последний из которых – шестой – увидел свет в 1827 г., были подготовлены в творческом содружестве Т. Мура и Г. Бишопа, в них использовался испанский, португальский, итальянский, венгерский и другой музыкальный материал. Произведения, представленные в сборниках «National Airs», были во многом близки зарождавшейся культуре русского классического романса, что, в частности, и обусловило популярность осуществленного Козловым перевода входившей в цикл «Русских песен» («Russian Airs») и имевшей подзаголовок «Air: The bells of St.Petersburg», означавший исполнение текста на голос мелодии «колоколов Санкт‑Петербурга», песни Томаса Мура «Those evening Bells» [3]. Вместе с тем два других произведения, которым Мур стремился придать русский колорит – «Russian Air» из первого выпуска «National Airs», начинающаяся словами: «Hark! The vesper humn is stealing // O’er the waters, soft and clear» (p. 261), и вошедшая в позднейший цикл «Unpublished songs» песня «The Russian Lover», где упомянуты путник в санях, морозная ночь, северные звезды, – не получили в России сколько‑нибудь очевидного признания.
Подзаголовок «Air: The bells of St.Petersburg», сопровождавший многие, в том числе и ранние публикации «Those evening Bells» [4], означал только то, что мелодия, к которой был приспособлен текст Мура, имела русские истоки в виде некоей «арии» о «колоколах Петербурга». При встрече с А. И. Тургеневым в Бовуде Томас Мур, получая в дар сборник «Стихотворений» Козлова, оставил своему собеседнику на память собственноручную запись «Those evening Bells» [5], из чего можно заключить, что А. И. Тургенев расспрашивал английского поэта о стихотворении «Those evening Bells», его возможных русских истоках, однако подробности этого разговора неизвестны.
Публикуя «Вечерний звон», Козлов не обозначал это стихотворение как перевод, в то время как пять других переводных текстов неизменно сопровождались подзаголовками «Из Мура» и «Подражание Муру». Вместе с тем текст «Вечернего звона» традиционно печатается с посвящением Козлова Т. С. Вдмрв‑ой – Татьяне Семеновне Вейдемейер. Указанные обстоятельства позволяют предполагать, что Козлов считал «Вечерний звон» вполне оригинальным авторским произведением, выросшим из рецепции и художественного преломления творческих находок Томаса Мура.
«Вечерний звон» обрел популярность на рубеже 1820–1830‑х гг. во многом благодаря музыке, написанной А. А. Алябьевым в самом начале тобольской ссылки, вскоре после появления стихотворения Козлова в печати. Выдержав в 1829–1830 гг. две публикации (в Москве и Санкт‑Петербурге), распространившись в светских салонах, «мелодия» Алябьева уже в 1831 г. вошла в фортепьянную фантазию Л. Лангера, фортепьянное переложение неизвестного автора в «Музыкальном альбоме» на 1831 г., а затем неоднократно аранжировалась композиторами, в числе которых А. И. Дюбюк, К. П. Вильбоа (на два голоса) и др. [6].
На «Вечернем звоне», равно как и на других лучших произведениях Козлова, формировались эстетические вкусы нескольких поколений читателей, ценивших языковое чутье поэта, разнообразие используемых им изобразительно‑вырази­тель­ных средств. В частности, Ф. И. Буслаев, зачитываясь в юности произведениями Козлова, видел в «Вечернем звоне» «отличный образец звукоподражательной поэзии» («Читая его наизусть, я не просто выговаривал слова, а как бы звонил ими, воображая себя сидящим на колокольне») [7]. «Вечерний звон» продолжал привлекать и внимание композиторов, в том числе таких известных, как С. Монюшко, А. Т. Гречанинов [8].
Наряду с «Доброй ночью» – осуществленным Козловым переводом «Прощания Чайльд‑Гарольда» из первой песни поэмы Байрона «Паломничество Чайльд‑Гарольда» [9] – «Вечерний звон» постепенно утратил в массовом сознании имя своего создателя, прочно вошел в народный песенный репертуар. Вместе с тем далеко не всегда можно однозначно говорить, что именно перевод Козлова, а не английский оригинал Мура влиял на сознание российского общества. Так, созданное на английском языке в 1830‑е гг. стихотворение С. Ф. Толстой «Вечерний звон» было опубликовано в 1839 г., вскоре после смерти писательницы, в русском переводе, выполненном М. Н. Лихониным («Вечерний звон! О, как много говорят эти звуки для чувствующего сердца о днях давно прошедших, о минувшей радости, о каждой слезе, о каждом вздохе, обо всем, что дорого нашему сердцу: как красноречив этот вечерний звон!» [10]), при этом никаких указаний ни на Мура, ни на Козлова не содержалось; в биографическом очерке, которым открывалось то же издание 1839 г., Томас Мур был назван в числе английских поэтов, питавших «поэтическую, пламенную душу, восторженную фантазию» [11] С. Ф. Толстой, из чего можно сделать предположение о непосредственном влиянии на русскую писательницу «Those evening Bells».
Заслугой Козлова как переводчика «Those evening Bells» было усиление в произведении лирико‑драматических акцентов, чему способствовало пристальное внимание к изобразительно‑выразительным средствам языка, подчеркивавшим элегичность содержания. Изменение строфического построения – вместо четверостиший Козлов избрал шестистишия – также помогало усилению возвышенного минорного описания как результата размышлений о бренности земной жизни, о безвременном уходе друзей, по которым звонит колокол; в этом можно убедиться, сравнив оригинал и его русский перевод: «Those joyons hours are past away; // And many a heart, that then was gay, // Withen the tomb now darkly dwells, // And hears no more those evening bells» (T. Moore; p. 216) – «Уже не зреть мне светлых дней // Весны обманчивой моей! // И сколько нет теперь в живых // Теперь веселых, молодых! // И крепок их могильный сон; // Не слышен им вечерний звон» (И. И. Козлов; с. 143).
Отсутствие в публикациях «Вечернего звона» отсылок на Томаса Мура привело к курьезному событию: в журнале «Телескоп» увидела свет анонимная статья «Перевод стихотворения Козлова на английский язык Томасом Муром», автор которой воспринимал «Those evening Bells» в качестве английского перевода «Вечернего звона», стихотворения, которое «дышит тихой горестью слепца‑ясновидящего». «Для нас, русских, – решительно утверждал анонимный автор, – лестно такое внимание – и чье же? – поэта, знаменитого во всех просвещенных странах света; и это тем приятнее, что мы видим двух поэтов, взаимно усваивающих своим родинам произведения друг друга» [12].
Наивные суждения анонимного автора «Телескопа», воспринимавшего Мура как переводчика «Вечернего звона» Козлова, были вскоре забыты, однако в конце XIX в. сразу несколько исследователей высказали и попытались аргументировать предположение о единых грузинских истоках стихотворений Томаса Мура «Those evening Bells» и Козлова «Вечерний звон». В 1885 г. в книге «Где правда? История Афонского монастыря» А. Калиновский указал, что «Вечерний звон» – перевод церковной песни грузинского писателя XI в. Георгия Мтацминдели (Георгия Святоносца), рукопись которого якобы сохранилась в Гелатском монастыре близ г. Кутаиси [13]. Ту же мысль, но уже без ссылки на рукопись, повторил в 1898 г. А. С. Хаханов [14]. Ц. С. Вольпе, следуя за предшественниками, утверждал в 1936 г., что стихи Мтацминдели «Mtsuhrissa Zair», написанные по‑гречески в Иверском монастыре на Афоне, где автор служил игуменом, распространились по России и, видимо, через какие‑то русские источники стали известны Томасу Муру [15]. М. П. Алексеев, стремясь в 1960‑е гг. доказать суждения А. Калиновского, провел большую работу по поиску фактического материала, однако поиски не дали никаких позитивных результатов и лишь привели ученого к выводу, что «мы имеем дело с легендой, устойчиво держащейся долгое время в грузинской литературе, но лишенной фактических оснований» [16].

понедельник, 19 января 2009 г.

Образ адресата в сборнике стихов А. А. Ахматовой «Вечер»

Диалогичность как основная текстовая категория исследуется многими учеными (М. М. Бахтин, М. Н. Кожина, Т. В. Матвеева, Л. Р. Дускаева и др.). В коммуникативной стилистике текста диалогичность рассматривается как реализующаяся в субкатегориях субъектности и адресованности, с которыми связаны образы автора и адресата. Их изучение в разных сферах общения не потеряло своей актуальности в связи с разработкой коммуникативно когнитивного направления в современной лингвистике. Данная статья посвящена анализу образа адресата на уровне внутритекстовой коммуникации в раннем сборнике А.А. Ахматовой «Вечер», в котором представлена любовная лирика поэта.
Коммуникативный подход к поэтическому тексту предполагает конкретизацию субъекта речи и адресата. Известно, что и адресат, и субъект речи в художественной литературе многолики и их эксплицированные в тексте образы обусловлены эстетически. Важно выявить, кто является адресатом; как художественно конкретизируется адресат; какова его роль в структуре текста.
I. Конкретизируя образ адресата, можно выделить такие виды, как условный адресат и реальный. Под «условным» субъектом речи и адресатом понимается формально выраженный в тексте субъект речи (повествователь) и адресат как художественные образы, порождение авторской фантазии. Под реальным адресатом понимается как формально выраженный в тексте адресат – реальная личность, к которой обращается автор и которой он посвящает свое творение, так и реальные читатели, на которых ориентируется создатель текста.
Несомненно, что условные субъект речи и адресат, эксплицированные в тексте, являются художественными образами, порожденными авторским мироощущением и творческим замыслом. Именно этим определяется их многоликость, за которой ощущается авторская индивидуальность, его художественная картина мира (ср. известную концепцию образа автора В. В. Виноградова, далее развитую М. П. Брандес, Е. А. Гончаровой и др.).
Как показывает анализ, возможны 4 варианта и связанных с ними типа адресата: 1) адресат формально не выражен и не конкретизирован; 2) адресат формально выражен, но не конкретизирован; 3) адресат формально выражен и конкретизирован; 4) реальный адресат выражен и конкретизирован в посвящении автора. В сборнике «Вечер» А. А. Ахматовой последнее отмечается в стихотворении «Туманом легким парк наполнился…», посвященном Вере Ивановне Шварсалон.
В основном же в сборнике «Вечер» преобладают стихи, в которых условный адресат формально выражен и конкретизирован. В роли адресата чаще всего выступает «он» (любимый или любовник) (ср.: «Рыбак», «Сладок запах синих виноградин…», «Белой ночью», «Муж хлестал меня…», «Обман.IV», «Два стихотворения», «Читая Гамлета»», «Мне больше ног моих не надо…», «Мне с тобою пьяным весело…», «Над водой», «Я сошла с ума, о мальчик странный…», «Я и плакала, и каялась…», «Память о солнце в сердце слабеет» и др.).
Образ адресата дается, как правило, отдельными штрихами, намеками. Так, в стихотворении «Над водой» это «стройный мальчик пастушок», в стихотворении «Я сошла с ума, о мальчик странный…» дважды актуализирована «странность» адресата (ср., помимо начала стихотворения, заключительную строфу: О тебе ль заплачу, странном, / Улыбнется ль мне твое лицо?…), в стихотворении «Я и плакала, и каялась…» адресат – «нелюбимый», «тихий», а дом его – «нежилой» (ср.: Сердце темное измаялось / В нежилом дому твоем…; Страшно, страшно к нелюбимому, / Страшно к тихому войти). Исключением является стихотворение «Рыбак», где адресат назван в заглавии, а сам текст включает его развернутое описание (ср. I строфу стихотворения: Руки голы выше локтя, / А глаза синей, чем лед. / Едкий, душный запах дегтя / Как загар, тебе идет…).
В отличие от рассмотренных текстов, стихотворение «Подражание Анненскому» написано от лица мужчины и адресовано женщине, его «первой причуде», образ которой лишь слегка намечен. Реже стихи имеют других адресатов, сам выбор которых можно рассматривать как художественный прием. В некоторых произведениях адресат актуализирован в названиях (ср.: «Музе», «Хорони, хорони меня, ветер…»). Помимо определенно личных предложений, включающих указания на определенного адресата, хотя и без его дополнительной художественно образной конкретизации, адресат может эксплицироваться прямой речью неизвестного лица, предваряющей и определяющей последующее повествование, построенное в форме диалога (ср. стихотворение «Отчего ты сегодня бледна?» (стихотворение «Сжала руки под темной вуалью»).
Чаще всего условный или (единично) реальный адресат в поэтических текстах сборника «Вечер» формально выражен (в 38 стихотворениях) и образно конкретизирован (в 25 случаях).
II. Как осуществляется художественно образная конкретизация адресата? Как правило, сжато, лаконично, в основном на уровне намеков и психологических деталей. При этом велика роль эпитетов, фиксирующих отдельные признаки физического состояния, внешнего облика, оценки описываемых субъектов – адресатов (на их особую роль в поэзии А. Ахматовой указывал В. В. Виноградов): 1) Мне с тобою пьяным весело («Мне с тобою пьяным весело»); 2) Я сошла с ума, о мальчик странный («Я сошла с ума, о мальчик странный…»); 3) О, ты не напрасно смеялась, / Моя непрощенная ложь! («Три раза пытать приходила…»); 4) Стройный мальчик пастушок, / Видишь, я в бреду («Над водой»); 5) О, пленительный город загадок («В Царском Селе. I»); Тот же голос, тот же взгляд, / Те же волосы льняные… («Два стихотворения. II»).
Иногда адресат дополнительно эксплицируется конструкцией с прямой речью: 1) И с тобой, моей первой причудой, / Я простился. Восток голубел. / Просто молвила: «Я не забуду». / Я не сразу поверил тебе. («Подражание И. Ф. Анненскому»);
2) А ты, мой дальний, неужели /Стал бледен и печально нем?/Что слышу? Целых три недели /Все шепчешь: «Бедная, зачем?» («Мне больше ног моих не надо»);
3) «Отчего ты сегодня бледна?» («Сжала руки под темной вуалью»);
4) Ты сказал мне: «Ну что ж, иди в монастырь / Или замуж за дурака…» («Читая Гамлета».
Примечательно, что в большинстве стихотворений (в 20 ти) с формально выраженным адресатом его актуализация происходит главным образом за счет глагольных форм или местоимения «ты»: 1) И с тобой, моей первой причудой…, …Я не сразу поверил тебе; Никогда не пойму, ты близка мне…Или только любила меня; 2) Повсюду тебе казалось, / Что вольный ты и на воле… Был светел ты, взятый ею и пивший ее отравы…Иногда наблюдается многократная актуализация адресата: 1) Не знаешь ли, где светлей? / Она бредила, знаешь, больная… («Похороны»); 2) Тот же голос, тот же взгляд, / Те же волосы льняные…/ И слова твои простые («Два стихотворения. II»).
Актуализация адресата может иметь комплексный характер при участии разных языковых средств. Сравним: 1) Если хочешь – уходи; / Не целуй меня усталую…; Отчего же, отчего же ты / Лучше, чем избранник мой? («Сердце к сердцу не приковано…»); 2) Смотри, как глубоко ныряю. / …А ты, мой дальний, неужели / Стал бледен и печально нем? / Что слышу? Целых три недели / Все шепчешь: «Бедная, зачем?» («Мне больше ног моих не надо»); 3) Стройный мальчик пастушок, / Видишь, я в бреду («Над водой»).
Чаще всего экспликация адресата осуществляется в форме обращения, а также благодаря личным местоимениям («ты» и «вы») и притяжательным местоимениям («твой», «ваш»). В роли условного адресата, который эксплицируется обращениями, в сборнике «Вечер» часто выступают реалии психологической сферы и персонифицированные явления природы и окружающей действительности: 1) Ты сказки давней горестных заметок, / Душа моя, не тронь и не ищи… («Вечерняя комната»); 2) Хорони, хорони меня, ветер («Хорони, хорони меня, ветер…»); 3) Слава тебе, безысходная боль! («Сероглазый король»); 4) О, пленительный город загадок!/ Я печальна, тебя полюбив («В Царском Селе»); 5) О, ты не напрасно смеялась, / Моя непрощенная ложь! («Три раза пытать приходила»).
III. Какова роль адресата в повествовательной структуре текста? Как показывают наблюдения, экспликация адресата в начале, в конце, в середине стихотворения обусловлена эстетически. Так, информация об адресате в начале текста может служить либо организации повествования, либо последующему смысловому развертыванию текста, либо созданию эмоциональной установки на последующее повествование.
Например, неизвестный адресат, эксплицированный вопросом «Отчего ты сегодня бледна?» в стихотворении «Сжала руки под темной вуалью…» задает тон последующему диалогическому повествованию – ответу лирической героини. Вопрос «Хочешь знать, как все это было?» является интригующим началом и поводом к последующему сообщению. В этих случаях введение адресата является эффектным художественным приемом, оживляющим повествование.
Чаще адресат, эксплицированный в начале стихотворения, важен для последующего смыслового развертывания текста. Так, тема смерти, одиночества и свободы, отраженная в названии и первой строке стихотворения «Хорони, хорони меня, ветер…», раскрываемая далее в тексте, ассоциативно задана как обращением к необычному адресату (ветру), так и семантикой предикатов.
В другом случае первая строка, содержащая указание на адресата и его особенности, создает ассоциативно смысловой фон не только для последующих строк, но и для последующих строф: Мне с тобою пьяным весело – / Смысла нет в твоих рассказах. / Осень ранняя развесила / Флаги желтые на вязах. // Оба мы в страну обманную / Забрели и горько каемся, / Но зачем улыбкой странною / И застывшей улыбаемся? // Мы хотели муки жалящей / Вместо счастья безмятежного… / Не покину я товарища / И беспутного, и нежного.
Сравним ассоциативный ряд, реализующий цепочечную связь текстовых ассоциатов, связывающих весь текст: пьяный – смысла нет в твоих рассказах – обманный – странный – застывший – мука жалящая – беспутный.
Еще один пример. Высказывание, эксплицирующее адресата, содержащее актуализацию семантического признака «свет» (Не знаешь ли, где светлей?), получает дальнейшее развертывание во II и III строфах как фон, характеризующий лирическую героиню: А она привыкла к покою / И любит солнечный свет. / Я келью над ней построю, / Как дом наш на много лет. // Между окнами будет дверца, / Лампадку внутри зажжем, / Как будто темное сердце / Алым горит огнем…
Экспликация адресата в начале текста важна и для создания эмоциональной установки на последующее восприятие. Так, строка Слава тебе, безысходная боль! в стихотворении «Сероглазый король» эмоционально подготавливает читателя к последующему повествованию. Это же можно сказать и о начальной строке стихотворения «Надпись на неоконченном портрете» (О, не вздыхайте обо мне…). За формально выраженным глагольной формой в тексте условным адресатом в данном случае чувствуется ориентация автора на реального читателя адресата.
Актуализация адресата в конце стихотворения, как правило, важна, во первых, для объяснения причины того, о чем говорится в предыдущем повествовании (ср. роль последней строки – обращения Здравствуй!, объясняющей волнение в ожидании встречи: Подушка уже горяча / с обеих сторон. / Вот и вторая свеча / Гаснет, и крик ворон / Становится все слышней. / Я эту ночь не спала, / Поздно думать о сне…/ как нестерпимо бела / Штора на белом окне. / Здравствуй! («Два стихотворения. I »)).
Во вторых, экспликация адресата и его характер (обращение к каждому, любому или риторический вопрос себе) значимы для подведения итога, вывода из того, о чем говорилось ранее. Сравним: Знаешь, долю такую / Лишь врагу / Пожелать я могу («Я живу, как кукушка в часах…»). То же можно сказать и о заключительных строчках стихотворения «Сердце к сердцу не приковано…»: Отчего же, отчего же ты / Лучше, чем избранник мой?, а также о стихотворении «В Царском Селе. II», в котором описание мраморного двойника венчается обращением к нему: Холодный, белый, подожди, / Я тоже мраморною стану и т.д.
Реже адресат представлен в середине стихотворений (ср.: «Вечерняя комната», «Я и плакала, и каялась…», «Дверь полуоткрыта…», «Сладок запах диких виноградин…»). При этом экспликации адресата предшествует пейзажная зарисовка, описание интерьера или эмоциональный всплеск, создающие психологический фон для последующего изложения. Так, в стихотворении «Дверь полуоткрыта…» обращению Отчего ушел ты? / Я не понимаю… предпослано описание ряда деталей, создающих эффект бывшего присутствия: Дверь полуоткрыта, / Веют липы сладко…/ На столе забыты / Хлыстик и перчатка. // Круг от лампы желтый… / Шорохам внимаю. / Отчего ушел ты? / Я не понимаю.
Все последующее объясняется действием лирического героя адресата и определяется его уходом: Радостно и ясно / Завтра будет утро. / Эта жизнь прекрасна, / Сердце, будь же мудро. // Ты совсем устало, / Бьешься тише, глуше…/ Знаешь, я читала, / Что бессмертны души. Обращение к сердцу (условному адресату) позволяет образно конкретизировать эмоциональное состояние лирической героини.
Еще один пример. В стихотворении «Сладок запах синих виноградин…» адресат косвенно конкретизирован в 3 й строке (Голос твой и глух, и безотраден). Этому предшествуют психологические детали: Сладок запах синих виноградин… / Дразнит опьяняющая даль. Весь последующий пейзаж эмоционально созвучен характеристике адресата, ассоциативно окрашен «безотрадностью»: Голос твой и глух, и безотраден. / Никого мне, никого не жаль.// Между ягод сети паутинки, / Гибких лоз стволы еще тонки, / Облака плывут, как льдинки, льдинки / В ярких водах голубой реки. // Солнце в небе. Солнце ярко светит. / Уходи к волне про боль шептать. / О, она, наверное, ответит, / А быть может, будет целовать.
Таким образом, для художественного осмысления текста важны не только образ адресата и формы его экспликации, но и степень его актуализации и место в повествовательной структуре текста.
IV. Наконец, остановимся на текстах, в которых адресат формально не выражен. На их долю приходится около трети всех стихотворений в сборнике А. А. Ахматовой «Вечер». По нашим наблюдениям, отсутствие условного адресата в них связано, во первых, с субъективным, личным характером описываемого, когда поэтический текст предстает как самовыражение субъекта, его лирический монолог. Сравним стихи: «Молюсь оконному лучу»; «Обман I, II, III»; «Меня покинул в новолунье»; «Сегодня мне письма не принесли…»: Сегодня мне письма не принесли, / Забыл он написать или уехал; / Весна как трель серебряного смеха, / Сегодня мне письма не принесли.
Во вторых, условный адресат отсутствует в текстах с обобщенным смыслом, адресованным всем и каждому (ср. стихотворение «Любовь»).
В третьих, необходимость в условном адресате отпадает из за выбора намеренно объективного, отстраненного повествования, при котором происходящее вынесено на суд реальных адресатов – читателей (ср., например: «Маскарад в парке», «Он любил…». В качестве примера приведем стихотворение «Он любил…»: Он любил три вещи на свете: / За вечерней пенье, белых павлинов / И стертые карты Америки. / Не любил, когда плачут дети, / Не любил чая с малиной / И женской истерики. / …А я была его женой.
Таким образом, адресат в стихах А. А. Ахматовой из сборника «Вечер» многолик, репрезентируется главным образом личными и притяжательными местоимениями и глагольными формами, а также обращениями, нередко осложненными эпитетами и прямой речью. Наряду с реальным адресатом, маркированным в тексте, гораздо чаще встречается условный адресат. Нередко в его роли выступают персонифицированные реалии психологической сферы, природы и окружающей действительности. Отсутствие вербализованного в тексте условного адресата обусловлено авторским замыслом и связано с особыми коммуникативными стратегиями обобщения, намеренной объективации повествования или, напротив, выражения его подчеркнуто личностного характера, ориентированного на прием автокоммуникации.

вторник, 13 января 2009 г.

ОСОБЕННОСТИ КОМПЬЮТЕРНОГО УРОКА ИНФОРМАТИКИ

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

Повышение уровня самостоятельности
и творческой активности в работе учащихся.

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

2. Использование справочных материалов
Самостоятельный выбор и освоение средств деятельности предполагает активное использование справочного материала. Компьютерный урок информатики дает большие возможности приучения ребенка к пользованию справкой. Не секрет – большинство из нас (детей и взрослых) предпочитает устное «человеческое» объяснение «здесь и сейчас» самостоятельному поиску нужных сведений. Однако учитель информатики не должен спешит с подсказкой. Налицо потребность ученика в информации, значит надо предложить ему возможность ее найти. Для этого требуется:
1) предоставить ему инструкцию – сначала адаптированную к его возможностям восприятия, а затем все более краткую, с использованием терминологии и языка, принятого в подобной литературе;
2) постоянно в ходе работы с новым материалом привлекать внимание учащихся к справке и учить ею пользоваться;
3) учить работе с компьютерным HELPом, обращая внимание на его отличие от печатных справочных материалов;
4) прививать отношение к записям в тетради как к своеобразной справке: воспитывать осознание ценности записей, учить вести записи так, чтобы они были удобны в использовании – полные, структурированные, ясно оформленные и всегда под рукой.
Справочный дидактический материал, предоставляемый учителем, может содержать не только инструкции о способах действий, но и программу деятельности, вначале подробную, затем все более краткую, с пропуском некоторых этапов, которые должны заполнять ученики – так формируется умение самостоятельно определять содержание, предмет деятельности.

3. Творчество и исследовательская деятельность учеников
На компьютерном уроке информатики создаются благоприятные условия для развития творчества и исследовательской деятельности учеников.
Учителю не обязательно сообщать все факты и закономерности в процессе изучения нового материала. Часть фактического материала ученики могут почерпнуть из справки, а закономерности выявить в ходе экспериментальной работы с компьютером. Цель и содержание эксперимента, как правило, определяет учитель, но постепенно эта функция становится доступной и ученикам. Если на каждом уроке учителем предусмотрен мини‑эксперимент, ученики достаточно быстро приобретают вкус к исследовательской работе и умение ее выполнять.
Кроме того, на компьютерном уроке информатики ученики создают нечто новое: компьютерную программу или продукт, разработанный посредством информационных технологий общего назначения. Это может быть небольшая разработка в рамках изучаемой темы или большой проект – итог освоения целого раздела или курса. В любом случае это результат творческой деятельности ученика, ценность которой для развития личности ребенка трудно переоценить, и учителю следует всемерно использовать предоставляющиеся возможности.


Общение, коллективная деятельность и эмоциональное состояние
на компьютерном уроке информатики.

1. Эмоциональное состояние учеников на уроке информатики
Занятия в компьютерном классе, особенно вначале, проходят при повышенном эмоциональном фоне. Как правило, первых уроков информатики ребята ждут с большим интересом. С одной стороны, это естественный интерес к новому предмету, но с другой – ожидание работы с компьютером новым инструментом, который воспринимается как некая игрушка, призванная скрасить обыденность учебы. Однако подобные завышенные ожидания влекут неприятные последствия. Практика показывает, что разочарование приходит к ученикам вместе с пониманием, что на уроке информатики, как и на других уроках, надо работать, прилагать усилия, а справиться с компьютером далеко не просто, особенно если ты не играешь, не рисуешь, не выискиваешь что‑то веселое в Сети.
Сверхвысокий поначалу интерес резко падает до минимальных значений и лишь постепенно, в результате усилий, прилагаемых учителем, начинает расти. У большинства школьников интерес вскорости стабилизируется на некотором уровне, и этот уровень зависит от многих факторов, главными из которых являются профессионализм учителя, а также индивидуальные особенности учеников, как каждого в отдельности, так и класса в целом.
Однако в классе обычно есть небольшая группа детей, интерес которых к предмету остается на очень низком уровне. Причины могут быть самые разные: не нравится, т.к. не получается; этот вид деятельности не подходит психологически; и вообще – «зачем мне это надо». Усилия учителя должны быть направлены на сокращения численности данной группы. Следует иметь в виду, что разный уровень подготовленности, разные «стартовые возможности» играют здесь значительную роль. Пятнадцать лет назад, когда подавляющее большинство детей первый раз видели компьютер только в школе, психологически им было легче, ибо все были примерно в равных условиях. Сейчас компьютер есть у многих, тем тяжелее детям которые по‑прежнему имеют к нему доступ только в классе – у них меньше возможностей для освоения предмета, к тому же, некоторые переносят возникшее отрицательное эмоциональное восприятие ситуации на компьютер и на предмет в целом. Учет этого фактора в организации занятий весьма важен.
Среди учеников будет и группа детей, также немногочисленная, чей интерес к предмету небыстро, но постоянно растет, они также требуют особого внимания учителя, который поддерживает этот интерес, предлагая новые задания, новое поле деятельности, новые горизонты.

2. Свобода общения на уроке информатики
Для компьютерного урока информатики характерна значительно большая свобода в поведении учеников, в их общении с учителем и между собой.
Компьютер для ученика – субъект, с которым он общается в ходе учебной деятельности, причем общается свободно, не боясь негативных оценок. Эту свободу в общении ребенок переносит и на других у частников учебного процесса – учителя и других учеников. Свободное выражение эмоций, высказывание мыслей, отсутствие страха перед неловкостью, осуждением, насмешкой – необходимое условие для создания атмосферы творчества и исследования, для свободного интеллектуального развития. Учителю следует всячески поддерживать стиль общения, который изначально идет от, казалось бы, «бессловесной машины», двигаясь от авторитаризма к сотрудничеству.
Сотрудничество учителя и ученика особенно ярко проявляется, когда они вдвоем пытаются «противостоять» компьютеру, который «не желает» выдавать нужный результат. Совместный поиск ошибки перемещает учителя с позиции «противной стороны» (эта роль естественным образом принадлежит ему как субъекту, дающему задания и проверяющему их исполнение) на позицию соратника и помощника. Роль же «инквизитора» принимает на себя компьютер. Совместная деятельность помогает ученику преодолеть чувство страха и неуверенности, психологический барьер, который возникает по отношению к компьютеру. Учитель психологически воспринимается как человек старший, но равный, работа рядом с которым позволяет чувствовать себя уверенно, ожидать в нужный момент поддержки и помощи. В этой ситуации реализуется подход к обучению как к общению, в ходе которого передается знание или, лучше сказать, возникает знание, ибо учитель не сообщает что‑либо ученику, а создает условия, чтобы тот сам пришел к пониманию изучаемого материала.
Однако стоит учитывать и другую крайность: ученик должен чувствовать дистанцию и помнить, что помощью злоупотреблять нельзя. Свобода в поведении заканчивается там, где заканчивается активная познавательная работа. Шум может быть любым, если это рабочий шум. Но если школьники перестали работать, учитель твердо призывает их к порядку и дисциплине. Следует также помнить о безопасных условиях работы в компьютерном классе.

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


Индивидуализация обучения

1. Индивидуализация через общение
Общение учителя и ученика на компьютерном уроке информатики – тот инструмент, который позволит реализовать индивидуальный подход к обучению непосредственно в рамках обычного урока.
Самостоятельность в работе учащихся высвобождает время и силы учителя, которые можно использовать для оказания индивидуальной (и дозированной!) помощи, формулирования индивидуальных вопросов и заданий, точечных воздействий в целях интеллектуального воспитания детей, качественной оценки достигнутых результатов – поощрения, порицания, определения правильности выбранного направления поиска. Для компьютерного урока информатики обычной является ситуация, когда учителя не видно в классе – он сидит рядом с учеником, переходя от одного к другому. В доброжелательной атмосфере совместного труда и личного общения создаются оптимальные условия для интеллектуального воспитания школьников и выработке общественно‑значимых качеств личности, которые помогут ребенку найти свое место в будущем.

2. Параллельная структура урока информатики
Как правило, ученики приходят к началу изучения информатики в школе с разными «стартовыми возможностями» – часть из них уже имеет некоторый опыт общения с компьютером, кто‑то достиг уже определенных успехов, но есть и такие, кто впервые получил доступ к компьютеру – их не так уж и мало. По мере снижения возрастной границы начала обучения информатике эти различия сглаживаются. Однако остаются и заметно проявляются другие различия между учениками: общий интеллектуальный потенциал личности, наличие способностей именно к данной области деятельности, уровень подготовленности и материальная возможность упражняться дома (наличие домашнего компьютера). Учитель поставлен перед жесткой необходимостью учитывать эти различия. Фактически в рамках одного занятия параллельно идет несколько уроков для различных групп учащихся. Такое распараллеливание также работает на индивидуализацию обучения.

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

3.4. «Помощники учителя» на уроке информатики
Ученики, для которых характерно постоянное повышение интереса к информатике по мере ее изучения также требуют особого внимания. Часто они работают по индивидуальному плану и уходят вперед в освоении материала. Бывает целесообразно привлекать таких детей в качестве помощников учителя в общении с другими детьми, в оказании им помощи. Например, предложить успешному ученику курировать группу из нескольких человек – помогать в решении задач, проводить диагностику усвоенного. От такой организации работы выигрывают обе стороны. Ведомая группа разговаривает со своим куратором на общем для них языке и быстрее находит путь к пониманию сути, тому помогает отсутствие дистанции, обязательной в общении с учителем. Для куратора такой режим работы еще полезнее: он учится говорить, объяснять, выражать мысли; объясняя другим, сам глубже проникает в материал; приобретает ценный опыт общения, когда не все сказанное тобой адекватно воспринимается и понимается другими; получает новый, более высокий статус «руководителя».

Прокачка профессий в WoW, ПВП и ПВП, тактика и стратегия - решайтесь!

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

Свадьба Вашей мечты

Свадьба Вашей мечты


Грезы и мечты. Любовь. Объявление руки или сердца. … или есть все открыт перед Вами! Каким образом организовать самый незабываемый день нашей своей бизнесе, на сегодняшний день не имеет зависимости специально из-за Вас! Утверждать нежное и тихое «да», согласится изготавливаться вместе на территории радости или проблем, ответить ласковым поцелуем, соединить два уважающих сердца – насколько поможет выглядеть прекраснее, а не свадьба за границей! В наши дни еще не в салонах доступны границ для дополнительной незабываемой свадебной церемонии, нежного романтического путешествия, сладкого и слепящего медового месяца.

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

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

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

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

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

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

воскресенье, 11 января 2009 г.

Лексико грамматическая интерференция при речевой коммуникации под влиянием родного языка

Спонсор реферата: World of Warcraft, блог опытного игрока в WoW . Тактики, советы, гайды

Изучение языковой интерференции, возникающей в результате взаимодействия систем родного и неродного языков в лингвистическом сознании и речи говорящего стало предметом многих экспериментально‑лингвистических исследований еще в конце прошлого века [ср. Москалюк 2002]. Поскольку явление массового двуязычия и многоязычия становится скорее нормой, чем исключением, в современном мире, то на первый план в жизни любого многонационального общества выходит «межкультурная коммуникация», в которой проблемам речевого общения, лежащего в основе взаимопонимания, отводится особая роль.
В этой связи огромное значение приобретает изучение особенностей становления и развития билингвизма и полилингвизма в условиях иноязычной среды и влияния языковой интерференции при взаимодействии контактирующих языков (особенно ярко проявляющейся в иноязычном акценте) на взаимопонимание при общении многоязычных и одноязычных представителей той или иной страны.
Для исследования коммуникативного эффекта акцентной речи одинаково важным является изучение интерферирующего влияния как со стороны системы родного языка на последующий, так и воздействие обратного порядка, поскольку как показывают результаты лингвистического исследования русской речи немецкоязычных информантов‑дикторов, на определенном уровне сформированности системы нового языка у билингва отдельные ее элементы и признаки могут проявляться в речи билингва на родном языке [ср. Москалюк 2002].
В данной статье предпринята попытка проанализировать лексико‑грамматическую интерференцию, возникающую в русской речи российских немцев Кировской области.
Методом слухового анализа нами было выявлено, что влияние родного немецкого языка на неродной русский язык информантов ярко прослеживается на лексическом уровне, что выражается в заимствованиях из немецкого языка слов, использующихся в качестве части (компонента) русского слова. Наблюдаются постоянные немецкие «вкрапления» в русскую речь, частый неосознанный переход с русского языка на немецкий и наоборот, как следствие того, что российские немцы изучаемого региона являются билингвами, для которых выражение мыслей на русском и немецком языках является одинаково доступным.
Путем слухового и аудиторского анализа лексико‑грамматической интерференции как результата взаимодействия двух языковых систем нами были обнаружены следующие особенности в области лексики:
1) русские лексемы употребляются в говорах с артиклем: di˙ trudarmija, di˙ banja, der savod; с предлогами: fon dem savod, in di0 banja;
2) маркировка множественного числа русских лексем зачастую происходит по законам немецких диалектов: kalosche – галоши, pomadore – пoмидоры;
3) заимствованные прилагательные получают соответствующий немецкий суффикс – e: kasennes Haus – казенный дом;
4) заимствованные инфинитивы получают суффикс немецкого инфинитива – je(n): rasreschaje – разрешать, pospeje – поспеть; sobiraje – собирать;
5) добавление возвратной частицы sich к заимствованному возвратному инфинитиву: sich katatze – кататься;
6) оформление причастия с помощью дентального суффикса: hat gemutschet – замучил;
7) использование заимствованных из немецкого языка слов в качестве части (компонента) русского слова: [janu]вар – январь; [tomаten]суп – помидорный суп;
8) постоянные, характерные для речи этнических немцев данного региона немецкие «вкрапления» в их русскую речь: «…Ну, у нас там была целая ну ведь Gruppe (группа)…»; «…И нас домой. Мы schon (‑уже) Нахои были…»;
9) употребление отдельных фраз на немецком языке в русской речи: например, информант‑диктор цитирует указ о выселении российских немцев на немецком языке, на котором он был опубликован в газете для российских немцев: «…Я давал… где‑то эта газета сохранилась в связи с тем, что обнаружены тыщи (=тысячи) tausend und tausende Spionen, Diversanten…»; в следующем примере информант‑диктор, вспоминая свое детство в Германии, также цитирует на немецком языке хозяйку, у которой жила их семья: «… Она ско(ль)ко раз говорила. Не один раз: “Frau Schlei, sitzen Sie hier! Bleiben Sie hier! Euch fahre(n) sie nicht zu Haus. Euch fahre(n) sie nach Sibiria”…»;
Можно предположить, что данные переходы с одного языка на другой, скорее всего, связаны с эмоциональным возбуждением, с переживаниями представленных ниформантов‑дикторов.
На грамматическом уровне влияние родного немецкого языка на неродной русский язык информантов проявляется в изменении систем склонения, спряжения, временных форм глагола, порядка слов и др.
Нами обнаружены следующие явления в области грамматики:
1. Перенос грамматической категории рода, соответствующей немецкому языку, на русский язык: «…Фронт везде шла…» – в представленном случае женский род немецкого существительного «die Front» перенесён на русское слово мужского рода «фронт»; «…оно из одного пальто она бы, это, сшила большой да и поменьше…» – в данном примере мужской род существительного «der Mantel» (пальто) перенесён на русское слово среднего рода «пальто»; «…Мать каждый лето приезжает, она как четыре года как уехала…» – в данном случае мужской род немецкого существительного «der Sommer» (лето) перенесён на русское существительное среднего рода «лето».
2. Перенос управления глаголов немецкого языка на глаголы русского языка: «…он мне так начал ведь обучать русский язык…» – в представленном примере можно наблюдать, что немецкий глагол «unterrichten» (обучать) требует управление винительного падежа без предлога «Russisch unterrichten» в отличие от русского языка, который требует дательного падежа «обучать русскому языку».
3. Перенос немецкого грамматического явления на русскую речь информанта‑диктора. По аналогии с немецким языком, в котором в зависимости от падежа меняется предлог и артикль в дат. и вин. падежах, к существительному же окончание не прибавляется: «nach Lalsk» (в Лальск), «in Lalsk» (в Лальске): «…что надо мне в Лальск, в Лальск, ви(ди)шь, папа‑то в Лальск…» .
4. Употребление имен существительных с различными предлогами в именительном падеже, то есть наблюдается отсутствие окончаний, характеризующих тот или иной падеж русского языка: «…Мы же ведь, ведь, работали‑то ведь в Россия…» ; «…Мне надо ведь учиться, мне надо ведь записывать все в смена, что я должна смена сдать…»; «…Вот сразу нас перебросили станция Нахои…» ; «…Я не обижаюсь здесь на наши люди…»; «…Я уже был в трудармия…», «…Он заслуга получает…». Можно предположить, что данное явление также исходит от влияния родного немецкого языка на неродной русский, поскольку в немецком языке смысловую функцию часто выполняют не падежные окончания имен существительных, а артикль, таким образом, существительные остаются без изменений: die Front – фронт, der Front – фронта, der Front – фронту и т. д.
В целом, наблюдения над речевым поведением жителей немецкой национальности нашего региона показывают, что русская речь русско‑немецких билингвов, проживающих в Кировской области, неоднородна и варьирует от «практически безакцентной» до «неестественной» для слуха русских монолингвов, то есть лексико‑грамматическая интерференция проявляется далеко не у всех двуязычных информантов‑дикторов. В области лексики и грамматики наблюдаются особенности, проявляющиеся в заимствованиях из немецкого языка слов, которые используются в качестве части (компонента) русского слова, постоянные немецкие «вкрапления» в русскую речь этнических немцев, частый неосознанный переход с русского языка на немецкий и наоборот, а также изменения в системах склонения, спряжения, временных форм глагола, порядка слов и др.

пятница, 9 января 2009 г.

Методика изучения понятия «рекурсия»

В статье рассмотрена методика изучения «рекурсия» в среде Microsoft Visual Studio .Net и с использованием компилятора Microsoft Visual C++ 7.0. Изложение материала построено в виде диалога с обучаемым.

Что такое рекурсия? В информатике в это понятие вкладывается следующий смысл: рекурсия – это прием программирования, при котором программа (подпрограмма, процедура, функция) вызывает саму себя либо непосредственно, либо косвенно. Принцип действия рекурсии интуитивно понятен, но перед тем как начать более глубокое изучение рекурсии, рассмотрим общий механизм реализации рекурсии:
1. Функция F выполняет рекурсивный вызов.
2. Запоминается текущее состояние программы, необходимое для продолжения вычислений, когда управление снова вернется к ней.
3. F начинает выполняться заново, с новыми значениями всех локальных переменных и параметров.
4. Все повторяется до тех пор, пока очередной вызов F не приведет к какому‑либо тривиальному случаю, разрешаемому без рекурсии.
5. Происходит возврат управления в порядке, обратному тому, в котором запоминались вызовы; очистка памяти на каждом шаге.
Это универсальная схема, при реализации которой необходимо убедиться, что количество рекурсивных вызовов конечно и достаточно мало, так как каждый новый рекурсивный вызов требует процессорного времени и выделения дополнительной памяти для сохранения локальных переменных и дополнительной информации.
Несмотря на все свои преимущества, рекурсия используется далеко не всеми программистами. Зачастую это упущение связано с неполным пониманием рекурсии и устоявшимися негативными мнениями, связанными с накладными расходами на ее использование. Приведем некоторые из таких доводов:
1. Рекурсия требует большое количество памяти.
2. При рекурсивном алгоритме тратятся значительные ресурсы процессора.
3. Сложно реализовать рекурсивную процедуру и еще сложнее ее отлаживать.
Первые два пункта имеют под собой основания, но не надо забывать, что вычислительная техника совершенствуется год от года. Так что эти проблемы были актуальны лет 10 назад, сегодня же увеличившаяся производительность процессоров (примерно в 100 раз) и возросшие объемы памяти (от нескольких Кбайт до нескольких Гбайт) сводят их почти на нет. Третий пункт связан, скорее всего, с недостаточным пониманием рекурсии, так как замена рекурсии на циклы с пред‑ или постусловием не облегчит задачу и ее отладку.
Использование рекурсии достаточно просто, но что происходит на самом деле и достижение понимания механизмов её реализации не очевидно. Чтобы избежать возможных ошибок при работе с рекурсией, следует изучить процессы, происходящие при компиляции программы и ее запуске.
Нахождение факториала числа хоть и является «плохой» задачей для демонстрации рекурсии, но остановим наш выбор именно на этой задаче. Этому есть несколько причин:
1. Функция проста в реализации и содержит минимум операторов. Этого вполне достаточно, чтобы пронаблюдать за рекурсией.
2. Решается вполне реальная задача, результаты которой могут быть легко проверены.
В качестве языка программирования и среды для тестирования была выбрана Microsoft Visual Studio .Net и Microsoft Visual С++ 7.0. Нам понадобится создать новый пустой проект, добавить в него файл Fact.cpp и поместить в него код программы:
int Fact(int N)
{
if (N < 1) return 0;
else if (N == 1) return 1;
else return N * Fact(N‑1);
}
int main(void)
{
int F3;
F3 = Fact(3);
return 0;
}

Теперь можно запустить приложение в пошаговом режиме (для этого воспользоваться клавишей F11) и открыть все необходимые окна (в меню Debug – Windows):
Registers – для просмотра содержимого регистров процессора;
Memory – для исследования содержимого оперативной памяти;
Disassembly – для просмотра выполняемых инструкций процессора;
Call Stack – для доступа к содержимому стека вызовов функций.
Вот что находится в этих окнах в текущий момент (некоторые несущественные для рассмотрения детали, вроде содержимого не интересующих нас регистров, пропущены):
Окно Registers:
EAX = 003215A8 EBX = 7FFDE000 ECX = 00321530
EDX = 00000001 ESI = 00000040 EDI = 7C915B4F
EIP = 00411AA0 ESP = 0012FEE0 EBP = 0012FFC0
EFL = 00000246

CS = 001B DS = 0023 ES = 0023 SS = 0023 FS = 003B
GS = 0000

OV = 0 UP = 0 EI = 1 PL = 0 ZR = 1 AC = 0 PE = 1 CY = 0 Окно Disassembly:
int Fact(int N)
{
00411A20 push ebp
00411A21 mov ebp,esp
00411A23 sub esp,0C0h
00411A29 push ebx
00411A2A push esi
00411A2B push edi
00411A2C lea edi,[ebp‑0C0h]
00411A32 mov ecx,30h
00411A37 mov eax,0CCCCCCCCh
00411A3C rep stos dword ptr [edi]
if (N < 1) return 0;
00411A3E cmp dword ptr [N],1
00411A42 jge Fact+28h (411A48h)
00411A44 xor eax,eax
00411A46 jmp Fact+48h (411A68h)
else if (N == 1) return 1;
00411A48 cmp dword ptr [N],1
00411A4C jne Fact+35h (411A55h)
00411A4E mov eax,1
00411A53 jmp Fact+48h (411A68h)
else return N * Fact(N‑1);
00411A55 mov eax,dword ptr [N]
00411A58 sub eax,1
00411A5B push eax
00411A5C call Fact (41126Ch)
00411A61 add esp,4
00411A64 imul eax,dword ptr [N]
}
00411A68 pop edi
00411A69 pop esi
00411A6A pop ebx
00411A6B add esp,0C0h
00411A71 cmp ebp,esp
00411A73 call @ILT+935(__RTC_CheckEsp) (4113ACh)
00411A78 mov esp,ebp
00411A7A pop ebp
00411A7B ret

int main(void)
{
00411AA0 push ebp
00411AA1 mov ebp,esp
00411AA3 sub esp,0CCh
00411AA9 push ebx
00411AAA push esi
00411AAB push edi
00411AAC lea edi,[ebp‑0CCh]
00411AB2 mov ecx,33h
00411AB7 mov eax,0CCCCCCCCh
00411ABC rep stos dword ptr [edi]
int F3;
F3 = Fact(3);
00411ABE push 3
00411AC0 call Fact (41126Ch)
00411AC5 add esp,4
00411AC8 mov dword ptr [F3],eax
return 0;
00411ACB xor eax,eax
}
00411ACD pop edi
00411ACE pop esi
00411ACF pop ebx
00411AD0 add esp,0CCh
00411AD6 cmp ebp,esp
00411AD8 call @ILT+935(__RTC_CheckEsp) (4113ACh)
00411ADD mov esp,ebp
00411ADF pop ebp
00411AE0 ret
Окно Call Stack:
Factor.exe!main() Line 9 C++
Factor.exe!mainCRTStartup() Line 259 + 0x19 C
kernel32.dll!7c816d4f()
ntdll.dll!7c915b4f()
kernel32.dll!7c8399f3()
Как видно из окна Disassembly, будут выполнены следующие действия: сначала в стек будет отложена константа 3 (фактический аргумент вызываемой функции Fact), а затем вызвана сама функция. Чтобы разобраться в причинах такого поведения, необходимо ознакомиться с механизмом передачи параметров в функции в C++. Мы не будем останавливаться на этом вопросе, так как он выходит за рамки данной темы, отметим лишь, что в С++ по умолчанию используется метод __cdecl для передачи параметров. Этот метод обеспечивает передачу параметров через стек, при этом параметры берутся в порядке справа налево.
Первый вызов
Итак, после запуска проекта желтая стрелка в окне Disassembly указывает на текущую строчку, которая должна выполниться. Поскольку мы еще не успели продвинуться по нашему примеру, мы видим самое начало функции main:
00411ABE push 3
00411AC0 call Fact (41126Ch)

Инструкция call – это команда процессора, посредством которой реализуются вызовы подпрограмм. По этой команде выполнение потока инструкций временно прекращается и переходит к инструкциям, составляющим код подпрограммы (по адресу, который является аргументом инструкции). В конце подпрограммы находится инструкция ret, по которой поток инструкций возвращается обратно в код, вызвавший подпрограмму, и продолжается со следующей за call инструкции.
Команда push заносит значение (аргумент инструкции) в стек.
Команда pop считывает значение из стека и заносит его аргумент инструкции.
Первая из этих инструкций заносит константу 3 на верхушку стека, а вторая вызывает функцию Fact. Совместно они реализуют вызов Fact(3).
Разумеется, для возвращения необходимо сохранить адрес возврата, причем по возможности таким образом, чтобы вызываемая функция в свою очередь тоже могла вызывать другие функции, т.е. поддерживалась вложенность вызовов. Наилучшим образом для хранения адреса возврата, как и аргументов функций, подходит стек.
Физически стек – это специально выделенная область оперативной памяти. Стек растет в обратном направлении, т.е. от старших адресов к младшим. Таким образом, дно стека – это ячейка с максимальным адресом в области стека. На вершину стека указывает специальный регистр процессора ESP. Стек работает со словами размером 32 бита, или 4 байта. В случае, если реальные данные требуют для хранения меньше места, свободный остаток не используется. Это может показаться расточительным, но, во‑первых, обмен словами между процессором и оперативной памятью наиболее эффективен, во‑вторых, меньше вероятность нарушить структуру стека, скажем, положив туда длинное целое, а потом забрав один байт.
При занесении слова в стек командой push сначала содержимое регистра ESP уменьшается на 4, а затем слово заносится в оперативную память по адресу, который хранится в ESP. При извлечении слова из стека командой pop с верхушки стека, то есть из ячейки оперативной памяти с адресом, хранящемся в ESP, считывается значение, а потом содержимое ESP увеличивается на 4.
На вершину стека указывает специальный регистр процессора – ESP, его содержимое можно увидеть в окне Registers. Для просмотра содержимого стека воспользуемся окном Memory, которое мы до сих пор никак не использовали. Для этого:
находим ESP среди регистров процессора в окне Registers;
двойным щелчком левой кнопки мыши выделяем его содержимое (возможное значение регистра 0012FE04);
копируем его в буфер;
в окне Memory выделяем поле ввода Address и вставляем туда содержимое указателя стека;
для большего удобства переключаем окно Memory на показ содержимого памяти в виде 32‑разрядных слов (так как стек все равно работает именно с ними); сделать это можно, щелкнув правой кнопкой мыши в окне и выбрав «4‑byte Integer» и «Hexadecimal Display» в контекстном меню.
Теперь мы можем наблюдать за изменениями, происходящими в стеке, а именно там и будет происходить все самое важное.
Нажмем клавишу F11 2 раза (каждое нажатие – это команда отладчику выполнить очередную инструкцию процессора в пошаговом режиме). Сразу обратим внимание на содержимое стека:
0x0012FDFC 00411ac5
0x0012FE00 00000003
0x0012FE04 7c915b4f
Мы видим, что значение формального параметра – 3 – оказалось в стеке. А на вершине стека теперь лежит 00411ac5 – адрес инструкции (его можно найти в окне Disassembly), следующей за вызовом функции Fact. Кроме того, изменился регистр ESP – уменьшился на 8, т.е. на два 32‑разрядных слова.

Вход в функцию Fact
Если все предыдущие действия проделаны аккуратно, то программа должна в первый раз войти в функцию Fact, и указатель текущей инструкции (желтая стрелка) находится перед первой ее инструкцией.
Посмотрим, что делается в стеке вызовов функций (окно CallStack):
Factor.exe!Fact(int N=3) Line 2 C++
Factor.exe!main() Line 11 + 0x7 C++
Factor.exe!mainCRTStartup() Line 259 + 0x19 C
kernel32.dll!7c816d4f()
ntdll.dll!7c915b4f()
kernel32.dll!7c8399f3()

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

Первая инструкция функции:
00411A20 push ebp
00411A21 mov ebp,esp
00411A23 sub esp,0C0h
00411A29 push ebx
00411A2A push esi
00411A2B push edi
00411A2C lea edi,[ebp‑0C0h]
00411A32 mov ecx,30h
00411A37 mov eax,0CCCCCCCCh
00411A3C rep stos dword ptr [edi]

Команда push заносит в стек свой операнд, в данном случае – содержимое регистров EBP, EBX, ESI. Очевидно, компилятор планировал использовать этот регистр для своих нужд, поэтому позаботился о предварительном сохранении его содержимого в стеке (при выходе из функции данные стека будут восстановлены в этих регистрах).
Выполним все команды до строчки «if (N < 1) return 0;» и проверим состояние стека. Обратите внимание, что изменилось значение ESP и содержимое стека.
Итак, для следующего сравнения функция должна сравнить аргумент с 1 и возвратить в случае равенства значение 0. Столь нехитрая конструкция, тем не менее, не может быть выполнена в коде процессора за один шаг.
00411A3E cmp dword ptr [N],1
Инструкция cmp выполняется аналогично вычитанию, однако при этом ни один из операндов не меняется. Зато флаги в регистре состояния устанавливаются в соответствии с результатом и могут быть использованы для условного перехода.
Обычно инструкция cmp используется в паре с последующим условным переходом. Именно так обстоит дело и в нашем случае:
00411A42 jge Fact+28h (411A48h)

В случае, если значение аргумента (N) больше или равно 1, выполнение продолжается с ветки else. В нашем случае так и есть (3 > 1).
Следом должно выполниться сравнение аргумента с 1 на равенство:
else if (N == 1) return 1;

Это делается при помощи следующих инструкций:
00411A48 cmp dword ptr [N],1
00411A4C jne Fact+35h (411A55h)
00411A4E mov eax,1
00411A53 jmp Fact+48h (411A68h)

В нашем случае условие (3 == 1) не выполняется, поэтому выполнение функции продолжается.
А теперь – самое интересное: рекурсивный вызов:
else return N * Fact(N‑1);

Должен быть произведен вызов функции Fact(N‑1). Для этого, как мы уже знаем, сначала следует положить на вершину стека значение (N‑1). Это делается тремя инструкциями: сначала помещаем N в регистр EAX, затем вычитаем из него единицу и только потом заносим значение N‑1 в стек при помощи команды push:
00411A55 mov eax,dword ptr [N]
00411A58 sub eax,1
00411A5B push eax

Как всегда, не забываем заглянуть в стек:
ESP = 0012FD28
0x0012FD28 00000002

Значение (N‑1), то есть 2, теперь находится на вершине стека. Остается произвести рекурсивный вызов:
00411A5C call Fact (41126Ch)
Выполняем его при помощи кнопки F11.

Первый рекурсивный вход в Fact
На первый взгляд, мы снова оказались в том же месте, что и в предыдущем разделе. Указатель текущей инструкции находится все на той же первой инструкции функции Fact. Но это только на первый взгляд.
Во‑первых, на вершине стека у нас находится 2, а не 3, как в прошлый раз.
Во‑вторых, посмотрим в окно Call Stack:
Factor.exe!Fact(int N=2) Line 2 C++
Factor.exe!Fact(int N=3) Line 5 + 0xc C++
Factor.exe!main() Line 11 + 0x7 C++
Factor.exe!mainCRTStartup() Line 259 + 0x19 C
kernel32.dll!7c816d4f()
ntdll.dll!7c915b4f()
kernel32.dll!7c8399f3()

На вершине стека вызовов появился новый вызов Fact(2).
Продолжаем пошагово выполнять функцию до инструкции call по адресу 00411A5C. Все происходит почти так же, как и в прошлый раз, за исключением того, что в этот раз на вершине стека находится значение 1.

Второй (и последний) рекурсивный вход в функцию Fact
В первую очередь, как обычно, проверяем стек вызовов:
Factor.exe!Fact(int N=1) Line 2 + 0x1 C++
Factor.exe!Fact(int N=3) Line 5 + 0xc C++
Factor.exe!main() Line 11 + 0x7 C++
Factor.exe!mainCRTStartup() Line 259 + 0x19 C
kernel32.dll!7c816d4f()
ntdll.dll!7c915b4f()
kernel32.dll!7c8399f3()

Пошагово выполняем функцию до инструкции cmp по адресу 00411A48. В этот раз сравниваемые значения у нас равны. Выполнив эту команду в окне Registers можно заметить, что значение флага ZR=1, что указывает на равенство операндов инструкции. Значит мы должны вернуть 1 и закончить выполнение функции, за это отвечают 2 инструкции:
00411A4E mov eax,1
00411A53 jmp Fact+48h (411A68h)

Далее выполняется восстановление сохраненных в стеке значений:
00411A68 pop edi
00411A69 pop esi
00411A6A pop ebx
00411A6B add esp,0C0h
00411A71 cmp ebp,esp
00411A73 call @ILT+935(__RTC_CheckEsp) (4113ACh)
00411A78 mov esp,ebp
00411A7A pop ebp

Наконец‑то мы достигли инструкции ret, которая осуществляет возврат из подпрограммы:
00411A7B ret
С этого момента начинается обратная раскрутка стека вызовов.

Стек вызовов: обратная раскрутка
Выполнив инструкцию ret, мы возвращаемся обратно в первый рекурсивный вызов функции:
Обратим внимание на окно Call Stack:
Factor.exe!Fact(int N=2) Line 5 + 0xc C++
Factor.exe!Fact(int N=3) Line 5 + 0xc C++
Factor.exe!main() Line 11 + 0x7 C++
Factor.exe!mainCRTStartup() Line 259 + 0x19 C
kernel32.dll!7c816d4f()
ntdll.dll!7c915b4f()
kernel32.dll!7c8399f3()
Остаток кода функции, который будет выполняться далее, имеет вид:
00411A61 add esp,4
00411A64 imul eax,dword ptr [N]

Инструкция imul выполняет целочисленное умножение. В данном случае будет вычислено произведение EAX*N, и результат будет занесен в регистр EAX.
В регистр EAX мы вроде бы ничего подходящего не заносили. Зачем мы используем его в инструкции умножения? При выходе из функции возвращаемое значение находится в регистре EAX. Таким образом, вызов Fact(1) завершился, вернув результат 1 в регистре EAX, который теперь и используется в инструкции умножения. В результате выполнения инструкции
EAX = 00000002
Однако, не совсем ясным остается использование инструкции add с регистром ESP:
00411A61 add esp,4
Данная команда очищает стек от параметров функции, мы уже упоминали тот факт, что параметры в функцию передаются посредством стека, соответственно, при завершении функции стек необходимо почистить – для этого просто смещаем указатель на вершину стека ESP.
Выполним оставшиеся инструкции в функции. Последняя инструкция ret завершает очередной вызов Fact(2), что можно заметить в окне Call Stack:
Factor.exe!Fact(int N=3) Line 5 + 0xc C++
Factor.exe!main() Line 11 + 0x7 C++
Factor.exe!mainCRTStartup() Line 259 + 0x19 C
kernel32.dll!7c816d4f()
ntdll.dll!7c915b4f()
kernel32.dll!7c8399f3()

Теперь мы вернулись в первый, нерекурсивный вызов Fact(3). Указатель текущей инструкции вновь находится на строках:
00411A61 add esp,4
00411A64 imul eax,dword ptr [N]
но в этот раз уже
EAX = 00000002
N = 3

Пошагово выполняем остаток инструкций функции и возврат в вызывающую функцию main(). Теперь у нас:
EAX = 00000006

Осталось рассмотреть теперь совсем немного. Инструкция
00411AC5 add esp,4
как мы уже знаем, очищает верхушку стека от аргумента предыдущего вызова (константы 3). Следующая инструкция:
00411AC8 mov dword ptr [F3],eax
заносит ответ (значение из EAX) в переменную F3.
Для выполнения «return 0;» следующая инструкция:
00411ACB xor eax,eax
заносит 0 в регистр EAX, который снова будет использован в качестве возвращаемого функцией main() значения (c точки зрения исполняющей системы main() – такая же функция, как и любая другая, за исключением того, что с нее начинается выполнение программы, и она так же точно может возвращать значение, которое используется системой в качестве кода завершения; обычно 0 – нормальное завершение).
Наконец, инструкции
00411ACD pop edi
00411ACE pop esi
00411ACF pop ebx
00411AD0 add esp,0CCh
00411AD6 cmp ebp,esp
00411AD8 call @ILT+935(__RTC_CheckEsp) (4113ACh)
00411ADD mov esp,ebp
00411ADF pop ebp
00411AE0 ret
0040102B C3 ret
осуществляет восстановление регистров в их состояние до запуска программы и возврат в исполняющую систему, которая выполнит код, необходимый для корректного завершения программы.

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

Заработок золота, прокачка профессий, тактики, пвп: Блог по WoW. Интересные и нужные статьи, помогающие игроку!