В чем состоит назначение систем программирования
Уроки 22 — 23
Понятие о программировании
Алгоритмы работы с величинами: константы, переменные, основные типы, присваивание, ввод и вывод данных
(§ 8. Что такое программирование)
Содержание урока
Что такое программирование
Что такое программирование
Кто такие программисты
Теперь вам предстоит ближе познакомиться еще с одним разделом информатики, который называется «Программирование».
Назначение программирования — разработка программ управления компьютером с целью решения различных информационных задач.
Специалисты, профессионально занимающиеся программированием, называются программистами. В первые годы существования ЭВМ для использования компьютера в любой области нужно было уметь программировать. В 1970-1980-х годах начинает развиваться прикладное программное обеспечение. Бурное распространение прикладного ПО произошло с появлением персональных компьютеров. Стало совсем не обязательным уметь программировать для того, чтобы воспользоваться компьютером. Люди, работающие на компьютерах, разделились на пользователей и программистов. В настоящее время пользователей гораздо больше, чем программистов.
Может возникнуть впечатление, что программисты теперь уже и не нужны! Но кто же тогда будет создавать все операционные системы, редакторы, графические пакеты, компьютерные игры и многое другое? Программисты, безусловно, нужны, причем задачи, которые им приходится решать, со временем становятся все сложнее.
Программирование принято разделять на системное и прикладное. Системные программисты занимаются разработкой системного программного обеспечения: операционных систем, утилит и пр., а также систем программирования. Прикладные программисты создают прикладные программы: редакторы, табличные процессоры, игры, обучающие программы и др. Спрос на высококвалифицированных программистов, как системных, так и прикладных, очень большой.
В данной главе вы познакомитесь с простейшими правилами и приемами программирования, заглянете в эту актуальную и престижную профессиональную область.
Что такое язык программирования
Для составления программ существуют разнообразные языки программирования.
Язык программирования — это фиксированная система обозначений для описания алгоритмов и структур данных.
За годы существования ЭВМ было создано много языков программирования. Наиболее известные среди них: Фортран, Паскаль, Бейсик, С (Си) и др.
Распространенными языками программирования сегодня являются С++, Java, Pascal, Basic, Python.
Что такое система программирования
Для создания и исполнения на компьютере программы, написанной на языке программирования, используются системы программирования.
Система программирования — это программное обеспе чение компьютера, предназначенное для разработки, от ладки и исполнения программ, записанных на определен ном языке программирования.
Существуют системы программирования на Паскале, Бейсике и других языках.
В данной главе речь будет идти о средствах и способах универсального программирования — не ориентированного на какую-то узкую прикладную область. Примером узкоспециализированного программирования является Web-программирование, ориентированное на создание Web-сайтов. Для этих целей, например, используется язык JavaScript. Языки Паскаль, Бейсик, Си относятся к числу универсальных языков программирования.
Разработка любой программы начинается с построения алгоритма решения задачи. Ниже мы обсудим особенности алгоритмов решения задач обработки информации на компьютере.
Коротко о главном
Программирование — область информатики, посвященная разработке программ управления компьютером с целью решения различных информационных задач.
Программирование бывает системным и прикладным.
Паскаль, Бейсик, Си, Фортран — это универсальные языки программирования.
Система программирования — это программное обеспечение компьютера, предназначенное для разработки, отладки и исполнения программ, записанных на определенном языке программирования.
Вопросы и задания
1. Что такое программирование?
2. Какие задачи решают системные и прикладные программисты?
3. Назовите наиболее распространенные языки программирования.
4. В чем состоит назначение систем программирования?
Следующая страница Компьютерный практикум ЦОР. Что такое программирование
Назначение систем программирования
Для удобной разработки программ существуют специальные средства их создания, — системы (среды) программирования, которые обеспечивают весь цикл работы с программой — от ее разработки до выполнения и получения необходимых результатов.
Система программирования — это комплекс программных средств, предназначенных для автоматизации процесса подготовки и выполнения программ пользователя.
Назначение и состав систем программирования
Рассмотрим основные составляющие системы программирования:
- Редактор текста
- Язык программирования
- Библиотека подпрограмм
- Редактор связей (компоновщик)
- Транслятор
- Отладчик
Для сознательного понимания назначения составляющих системы программирования опишем этапы процесса разработки программы, связанные с использованием компьютера.
Редактор исходного кода
Вводим текст разработанной программы, которую называют исходным кодом, в компьютер и храним в памяти. Для этого система программирования имеет редактор текста, который обеспечивает ввод и редактирование исходного кода.
Компиляция и интерпретация
После введения программы и исправления ошибок, которые могли произойти во время ввода, осуществляется преобразование программы с языка программирования высокого уровня в двоичный код.
Такое преобразование осуществляется с помощью транслятора программ.
Различают два типа трансляторов: компиляторы и интерпретаторы.
В процессе интерпретации исходных текстов программ каждая команда (инструкция) последовательно превращается в двоичный код и сразу выполняется — на экране высвечивается результат ее выполнения. После завершения одной команды выполняется следующая и так далее до последней команды. Но результат преобразования не сохраняется, и каждый запуск программы начинается сначала.
В процессе компиляции осуществляется преобразование всего текста программного кода в двоичный код. Полученную после компиляции программу называют объектным модулем. Такая программа еще не готова к выполнению.
Исходный код обычно содержит ссылки на другие модули (подпрограммы), которые содержатся в библиотеке подпрограмм (например, модуль вычисления квадратного корня). Таким образом, к программному модуля нужно добавить коды необходимых подпрограмм, чтобы подготовить программу для исполнения.
Компилируемая программы выполняются быстрее интерпретируемых. Режим интерпретации нуждается в дополнительной основной памяти, поскольку интерпретатор должен все время храниться вместе с кодом. Но интерпретация в работе удобнее. Особенно для программистов, которые только начинают работать с системами программирования, так контролируется результат каждой команды.
Компоновка
После компиляции компоновщик (редактор связей) «склеивает» отдельные двоичные модули в единую программу, которая называется исполняемой программой. Этот процесс представлены на схеме:
Исходный код программы -> компилятор -> объектный модуль -> библиотека подпрограмм -> редактор связей -> выполняемая программа
Для дальнейшего выполнения программного кода, компилятор не нужен. Итак, после компиляции программа представлена двоичными символами 1 и 0 и готова к исполнению на компьютере.
Отладка и тестирование
Полученная программа, даже если она выполняется, не гарантирует, что нет логических ошибок. Она может выполняться, но результат исполнения может быть неправильным. Поэтому нужно провести тестирование (испытания) программы на предмет выявления и устранения в ней логических ошибок.
Тестирование — достаточно ответственный этап. В крупных IT-компаниях над разработкой программ, которые называют проектами, работают десятки и даже сотни программистов разных направлений. Одни из них разрабатывают проекты, другие занимаются тестированием программ, экономическим обоснованием и тому подобное.
На этом этапе применяется отладчик программ, который позволяет пошагово анализировать программу. Отладчик позволяет выполнять трассировку программы, устанавливать и удалять контрольные точки в программах, условия приостановления выполнения программы и тому подобное.
Создание переносимых программ
Описанный выше процесс разработки программ является классическим для процедурных языков программирования. Для программ, разработанных языком ООП, есть отличия. Их сущность заключается в том, что после компиляции создается не машинный, а промежуточный код, так называемый байт-код. С помощью специального программного обеспечения он затем превращается в машинный.
Такой подход обусловлен тем, что в Интернете свободно перемещаются данные и программы (апплеты — небольшие программы, предназначенные для передачи через Интернет и выполнения в браузере, совместимом с языком программирования). Их нужно защитить от вирусов и других вредоносных программ, а также реализовать переносимость программ.
Под переносимостью понимают возможность загрузки и выполнения апплета на компьютерах с любым типом процессора, любой операционной системой и браузером, подключен к Интернету. Именно эти проблемы и позволяет решить байт-код.
Понятно, что использование любого промежуточного кода, в том числе и байт-кода, снижает скорость выполнения программ и требует дополнительных аппаратных средств. Впрочем, эти потери незначительны по сравнению с полученным выигрышем. Если бы ООП-программа сразу компилировалась в машинный код, то для каждого компьютера со своим типом процессора необходимо было бы иметь отдельную версию той самой программы, что экономически крайне невыгодно.
Иногда используются так называемые динамические компиляторы. Их сущность заключается в том, что байт-код компилируется в машинный код не весь сразу, а отдельными фрагментами, по мере необходимости. Другие части кода могут выполняться в режиме интерпретации. Тем самым достигается высокая эффективность работы с кодом.
Примеры систем программирования
Системы (среды) программирования часто именуются по названию языка, например среда Pascal, среда Delphi. Иногда название системы содержит префикс, указывающий на разработчика среды: название системы Turbo-C означает, что ее разработчиком является фирма Borland.
Сегодня все чаще используются интегрированные среды программирования, которые обеспечивают работу с несколькими языками. Такими системами являются, например, IntelliJ IDEA, Eclipse. Вариант Ultimate Edition системы IDEA обеспечивает работу с языками программирования Java, PHP, Python.
Некоторые системы программирования поддерживают как режим интерпретации, так и режим компиляции программ.
Далее, в процессе описания языка программирования Python, мы будем применять среду IDLE.
Назначение и состав системы программирования.
Система програмирования — это кмплект языковых и програмных средств, предназначенных для автоматизации, разработки и выполнения программ.
Современная система програмирования включает:
-Язык програмирования
-Текстовый редактор
-Транслятор
-Редактор связи
-Отладчик
-Библиотекарь стандарт (?)
Язык програмирования — формализованный язык для описания алгаритма решения задачи на компьютере.
Язык програмирования образует три составляющих: синтаксис, алфавит, семантика.
Алфавит — это фиксированный для данного языка набор основных символов, их которых можно составлять текст.
Синтаксис — правило построения фраз языка.
Семантика — определяет смысловое содержание языка.
Все языки програмирования по синтаксису образования конструкций языка классифицируются:
1. Машинные языки — языки програмирования, воспринимаемые аппаратной частью конструкции.
2. Машинно-ориентированные языки — языки програмирования, которые отражают определенную структуру ЭВМ.
Машинные и машинно-ориентированные — это языки низкого уровня, требующие указания мелких деталей процесса обработки данных.
Языки высокого уровня имитируют естественные языки и содержат примеры, допускающие описание задачи в наглядном виде.
Алгоритмические языки — предназначены для описания аглоритма, не зависят от архитектуры развития.
3. Процедурно-ориентированные языки — яязыки програмирования, в которых имеется возможность описания некоторой совокупности процедур.
4. Проблемно-ориентированные языки — языки програмирования для решения задач определенного класса.
5. Объективно-ориентированные, в основе которых лежит понятие, сочетующее данные и действия над ними.
Современная система програмирования включает в себя: специализированный текстовый редактордля создания текста программы.
Программа, подготовленная на языке програмирования проходит этап трансляции, когда происходит преобразование исходного кода программы в объективный код, который далее пригоден к обработке редакторных связей для получения модуля.
Транслятор— это программа-переводчик, которая переводит программу, написанную на языке програмирования, в программу, состоящую из машинных команд.
Трансляция может выполнятся при помощи трансляторов, которая реализуется в виде компиляторов, транслирующих всю программу, и операторов, осуществляющих операционную обработку и выполнение програмы.
Полученные в результате раздельной коппеляции объектные модули объединяются в загрузочный модуль с присоединенным при необходимости библиотечных программ, реализующих различные стандартные функции. Для этого используетсяредактор связи— специальная программа, с помощью которой обрабатываются объективные модули.
Загрузочный модуль — это законченная программа, которую можно запускать на любом компьютере, где установлена операционная система, для которой это программа создавалась.
Расширение: exe, cam
Отладчики— это специальные программы, предназначенные для облегчения програмистом выполнения отладки разрабатываемых программ.
Эти программы позволяют исследовать внутреннее поведение програмного модуля.
Дата добавления: 2015-01-30 ; просмотров: 11 | Нарушение авторских прав
Что такое система программирования
Для создания и исполнения на компьютере программы, написанной на языке программирования, используются системы программирования.
Система программирования — это программное обеспечение компьютера, предназначенное для разработки, отладки и исполнения программ, записанных на определенном языке программирования.
Существуют системы программирования на Паскале, Бейсике и других языках.
В данной главе речь будет идти о средствах и способах универсального программирования — не ориентированного на какую-то узкую прикладную область. Примером узкоспециализированного программирования является Web-программирование, ориентированное на создание Web-сайтов. Для этих целей, например, используются языки HTML, JavaScript. Языки Паскаль, Бейсик, Си относятся к числу универсальных языков программирования.
Разработка любой программы начинается с построения алгоритма решения задачи. Ниже мы обсудим особенности алгоритмов решения задач обработки информации на компьютере. Такие алгоритмы называют алгоритмами работы с величинами.
Вопросы и задания
1. Что такое программирование?
2. Какие задачи решают системные и прикладные программисты?
3. Назовите наиболее распространенные языки программирования.
4. В чем состоит назначение систем программирования?
то после выполнения команды оно станет следующим:
Прочерк в ячейке Z обозначает, что начальное число в ней может быть любым. Оно не имеет значения для результата данной команды.
Если слева от знака присваивания стоит числовая переменная, а справа — математическое выражение, то такую команду называют арифметической командой присваивания, а выражение — арифметическим.
В частном случае арифметическое выражение может быть представлено одной переменной или одной константой. Например:
Команда ввода
Значения переменных, являющихся исходными данными решаемой задачи, как правило, задаются вводом.
Команда ввода в описаниях алгоритмов будет выглядеть так:
На современных компьютерах ввод чаще всего выполняется в режиме диалога с пользователем. По команде ввода компьютер прерывает выполнение программы и ждет действий пользователя. Пользователь должен набрать на клавиатуре вводимые значения переменных и нажать клавишу . Введенные значения присвоятся соответствующим переменным из списка ввода, и выполнение программы продолжится.
Вот схема выполнения приведенной выше команды.
1. Память до выполнения команды:
2. Процессор компьютера получил команду ввод А, B, С, прервал свою работу и ждет действий пользователя.
3. Пользователь набирает на клавиатуре:
и нажимает клавишу ( ).
4. Память после выполнения команды:
5. Процессор переходит к выполнению следующей команды программы.
При выполнении пункта 3 вводимые числа должны быть отделены друг от друга какими-нибудь разделителями. Обычно это пробелы.
Из сказанного выше можно сделать вывод:
Переменные величины получают конкретные значения в результате выполнения команды присваивания или команды ввода.
Если переменной величине не присвоено никакого значения (или не введено), то она является неопределенной. Иначе говоря, ничего нельзя сказать, какое значение имеет эта переменная.
Команда вывода
Результаты решения задачи сообщаются компьютером пользователю путем выполнения команды вывода.
Команда вывода в алгоритмах будет записываться так:
По этой команде значения переменных X1 и Х2 будут вынесены на устройство вывода (чаще всего это экран).
О других командах, применяемых в вычислительных алгоритмах, вы узнаете позже.
Вопросы и задания
1. Что такое величина? Чем отличаются переменные и постоянные величины?
2. Чем определяется значение величины?
3. Какие существуют основные типы величин в программировании?
4. Как записывается команда присваивания?
5. Что такое ввод? Как записывается команда ввода?
6. Что такое вывод? Как записывается команда вывода?
7. В схематическом виде (как это сделано в параграфе) отразите изменения значений в ячейках, соответствующих переменным А и В, в ходе последовательного выполнения команд присваивания:
8. Вместо многоточия впишите в алгоритм несколько команд присваивания, в результате чего должен получиться алгоритм возведения в 4-ю степень введенного числа (дополнительные переменные, кроме А, не использовать):
Понятие системы программирования.
Системы программирования — это комплекс инструментальных программных средств, предназначенный для работы с программами на одном из языков программирования.
Системы программирования предоставляют сервисные возможности программистам для разработки их собственных компьютерных программ.
В настоящее время разработка любого системного и прикладного программного обеспечения осуществляется с помощью систем программирования, в состав которых в первую очередь входят:
· трансляторы с языков высокого уровня;
· средства редактирования, компоновки и загрузки программ;
· макроассемблеры (машинно-ориентированные языки);
· отладчики машинных программ.
Системы программирования, как правило, включают в себя:
· текстовый редактор (Edit), осуществляющий функции записи и редактирования исходного текста программы;
· загрузчик программ (Load), позволяющий выбрать из директория нужный текстовый файл программы;
· запускатель программ (Run), осуществляющий процесс выполнения программы;
· компилятор (Compile), предназначенный для компиляции или интерпретации исходного текста программы в машинный код с диагностикой синтаксических и семантических (логических) ошибок;
· отладчик (Debug), выполняющий сервисные функции по отладке и тестированию программы;
· диспетчер файлов (File), предоставляет возможность выполнять операции с файлами: сохранение, поиск, уничтожение и т.п.
Ядро системы программирования составляет язык. Существующие языки программирования можно разделить на две группы: процедурные и непроцедурные.
Процедурные (или алгоритмические) программы представляют из себя систему предписаний для решения конкретной задачи. Роль компьютера сводится к механическому выполнению этих предписаний.
Процедурные языки разделяют на языки низкого и высокого уровня.
Языки низкого уровня(машинно-ориентированные) позволяют создавать программы из машинных кодов, обычно в шестнадцатеричной форме. С ними трудно работать, но созданные с их помощью высококвалифицированным программистом программы занимают меньше места в памяти и работают быстрее. С помощью этих языков удобнее разрабатывать системные программы, драйверы (программы для управления устройствами компьютера), некоторые другие виды программ.
Программы на языках высокого уровня близки к естественному (английскому) языку и представляют набор заданных команд.
В общем случае язык – это заданный набор символов и правил, устанавливающих способы комбинации этих символов между собой для записи осмысленных текстов. Основой любого естественного или искусственного языка является алфавит, определяющий набор допустимых символов языка.
Алфавит – это счётное множество допустимых символов языка. Будем обозначать это множество символом V. Интересно, что согласно формальному определению, алфавит не обязательно должен быть конечным (перечислимым) множеством, но реально все существующие языки строятся на основе конечных алфавитов.
Цепочка символов α является цепочкой над алфавитом V; α(V), если в нее вводят только символы, принадлежащие множеству символов V. Для любого алфавита V пустая цепочка λ может как являться, так и не являться цепочкой λ(V). Это условие оговаривается дополнительно.
Если V – некоторый алфавит, то:
V+ – множество всех цепочек над алфавитом V без λ;
V* – множество всех цепочек над алфавитом V, включая λ.
Справедливо равенство: V* = V+<λ>.
Языком L над алфавитом V: L(V) называется некоторое счетное подмножество цепочек конечной длины из множества всех цепочек над алфавитом V. Из этого определения следуют два вывода: во-первых, множество цепочек языка не обязано быть конечным; во-вторых, хотя каждая цепочка символов, входящая в язык, должна иметь конечную длину; эта длина может быть сколь угодно большой и формально ничем не ограничена.
Все существующие языки подпадают под это определение. Большинство реальных естественных и искусственных языков содержат бесконечное множество цепочек. Также в большинстве языков длина цепочки ничем не ограничена (например, этот длинный текст – пример цепочки символов русского языка). Цепочку символов, принадлежащую заданному языку, часто называют предложением языка, а множество цепочек символов некоторого языка L(V) – множеством предложений этого языка.
Каждый язык – это множество цепочек символов над некоторым алфавитом. Но кроме алфавита язык предусматривает и задание правил построения допустимых цепочек, поскольку обычно далеко не все цепочки над заданным алфавитом принадлежат языку. Символы могут объединяться в слова или лексемы – элементарные конструкции языка. На их основе строятся предложения – более сложные конструкции. И те и другие, в общем виде, являются цепочками символов, но предусматривают некоторые правила построения. Таким образом, необходимо указать эти правила, или, строго говоря, задать язык.
Язык задать можно тремя способами:
– перечислением всех допустимых цепочек языка;
– указанием способа порождения цепочек языка (заданием грамматики языка);
– определением метода распознавания цепочек языка.
Первый из методов является чисто формальным и на практике не применяется (большинство языков содержат бесконечное число допустимых цепочек и перечислить их просто невозможно).
Второй метод предусматривает некоторое описание правил, с помощью которых строятся цепочки языка. Тогда любая цепочка, построенная с помощью этих правил из символов алфавита языка, будет принадлежать заданному языку. Например, правила построения цепочек символов русского языка (мы изучали их в средней школе).
Третий способ предусматривает построение некоторого логического устройства (распознавателя) – автомата, который на входе получает цепочку символов, а на выходе выдает ответ: принадлежит или нет эта цепочка заданному языку.
Синтаксис языка – это набор правил, определяющий допустимые конструкции языка. Синтаксис определяет «форму языка» – задает набор цепочек символов, которые принадлежат языку. Чаще всего синтаксис языка можно задать в виде строгого набора правил, но полностью это утверждение справедливо только для чисто формальных языков.
Семантика языка – это раздел языка, определяющий значение предложений языка. Слово «семантика» с греческого переводится как обозначающий. Семантика определяет «содержание языка» – задает значение для всех допустимых цепочек языка. Семантика для большинства языков определяет неформальными методами (отношения между знаками и тем, что они обозначают, и изучаются семиотикой). Чисто формальные языки лишены какого-либо смысла.
Лексика – это совокупность слов (словарный запас) языка. Слово или лексическая единица (лексема) языка – это конструкция, которая состоит из элементов алфавита языка и не содержит в себе других конструкций. Иначе говоря, лексическая единица может содержать только элементарные символы и не может содержать других лексических единиц.
Лексическими единицами (лексемами) русского языка являются слова русского языка, а знаки препинания и пробелы представляют собой разделители, не образующие лексем.
Языки программирования занимают некоторое промежуточное положение между формальными и естественными языками. С формальными языками их объединяют строгие синтаксические правила, на основе которых строятся предложения языка. От языков естественного общения в языки программирования перешли лексические единицы, представляющие основные ключевые слова. Кроме того, из алгебры языки программирования переняли основные обозначения математических операций, что также делает их более понятными человеку.
Для задания языка программирования необходимо решить три вопроса:
− определить множество допустимых символов языка;
− определить множество правильных программ языка;
− задать смысл для каждой правильной программы.
Только первые два вопроса полностью или частично удаётся решить с помощью лексики формальных языков.
Первый вопрос решается легко. Определяя алфавит языка, мы автоматически определяем множество допустимых символов. Для языков программирования алфавит − это чаще всего тот набор символов, которые можно ввести с клавиатуры. Основу его составляет младшая половина таблицы международной кодировки символов (таблицы ASCII), к которой добавляются символы национальных алфавитов.
Второй вопрос решается в теории формальных языков только частично. Для всех языков программирования существуют правила, определяющие синтаксис языка. Правда их недостаточно для того, чтобы строго определить все возможные синтаксические конструкции.
Третий вопрос в принципе не относится к теории формальных языков, поскольку, как уже было сказано, такие языки лишены какого-либо смысла. Для ответа на него нужно использовать другие подходы. В качестве таких подходов можно указать следующие:
− изложить смысл программы, написанной на языке программирования, на другом языке, более понятном тому, кому адресована программа;
− использовать для проверки смысла некоторую «идеальную машину», которая предназначена для выполнения программ, написанных на данном языке.
Грамматика − это описание способа построения предложений некоторого языка. Иными словами, грамматика − это математическая система, определяющая язык.
Фактически, определив грамматику языка, мы указываем правила порождения цепочек символов, принадлежащих этому языку. Таким образом, грамматика − это генератор цепочек языка. Она относится ко второму способу определения языков − порождению цепочек символов.
Грамматику языка можно описать различными способами. Например, грамматика русского языка описывается довольно сложным набором правил, которые изучают в начальной школе. Но для многих языков (и для синтаксической части языков программирования в том числе) допустимо использовать формальное описание грамматики, построенное на основе системы правил (или продукций).
Правило (или продукция) − это упорядоченная пара цепочек символов (α, β). В правилах очень важен порядок цепочек, поэтому их чаще записывают в виде α→β (или α: = β). Такая запись читается как «α порождает β» или «β по определению есть α».
Грамматика языка программирования содержит правила двух типов: первые (определяющие синтаксические конструкции языка) довольно легко поддаются формальному описанию; вторые (определяющие семантические ограничения языка) обычно излагаются в неформальной форме. Поэтому любое описание (или общепринятый стандарт) языка программирования обычно состоит из двух частей: вначале формально излагаются правила построения синтаксических конструкций, а потом на естественном языке дается описание семантических правил.
Язык, заданный грамматикой G, обозначается как L(G).
Две грамматики G и G’ называются эквивалентными, если они определяют один и тот же язык: L(G) = L(G’). Две грамматики G и G’ называются почти эквивалентными, если заданные ими языки различаются не более чем на пустую цепочку символов: L(G) <λ>= L(G’) <λ>.
Дата добавления: 2016-06-02 ; просмотров: 2036 ; ЗАКАЗАТЬ НАПИСАНИЕ РАБОТЫ