51467

Средства разработки приложений в Visual Studio.NET

Лекция

Информатика, кибернетика и программирование

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

Русский

2014-02-11

307.06 KB

27 чел.

Тема 5.В. Средства разработки приложений
в Visual Studio .NET

5.В.1. Современные системы и средства разработки программного обеспечения

5.В.1.1. О средствах разработки

5.В.1.2. Основные средства разработки программ

5.В.1.3. Понятие интегрированной среды разработки

5.В.1.4. Интегрированная среда разработки  Visual Studio .NET

5.В.1.5. Архитектура   Framework  .NET

5. В.1.6. Framework  .NET – единый каркас среды разработки

5.В.2. Среда исполнения программного кода

5.B.2.1. Введение

5.В.2.1. Процессор

5.В.2.2. Оперативная память

5.В.2.3. Долговременное хранение информации

5.В.2.4. Классификация программных средств

5.В.2.5. Операционные системы

5.В.3. Парадигма и технологии программирования

5.В.3.1. Основные определения
5.В.3.2.
Императивное программирование
5.В.3.3.
Процедурное  программирование
5.В.3.4. Структурное  программирование
5.В.3.5.
Объектно-ориентированное программирование
5.В.3.6.
Функциональное программирование
5.В.3.7.
Логическое программирование
5.В.3.8.
Декларативное программирование
5.В.3.9.
Cобытийно-управляемое   программирование

5.B.4. Тестовые  задания по теме  «Средства разработки приложений

          в Visual Studio .NET

5.В.1. Современные системы и средства разработки
программного обеспечения

5.В.1.1. О средствах разработки

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

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

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

А где писать текст программы?  А как превратить текст программы в нечто, что можно выполнить? Здесь ответ уже далеко не тривиален.

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

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

Далее рассмотрим, какие именно средства помогают программистам в решении их профессиональных задач.

5.В.1.2. Основные средства разработки программ

Прежде всего, поговорим о тех средствах создания программ, без которых этот процесс вообще невозможен.

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

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

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

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

А как объяснить что-либо машине? Для того чтобы что-то объяснить компьютеру, люди создали специальные языки. Необходимо отметить, что процесс написания программ за последние 50 лет прошел путь от программирования в инструкциях процессора (программирование в машинных кодах) через программирование на низкоуровневых языках (ассемблер) до программирования на языках высокого уровня. Вот на них и остановимся чуть подробнее.

Что такое язык программирования высокого уровня? Чем он отличается от естественного языка?

С формальной точки зрения – это:

Язык программирования  =  Синтаксис + Семантика.

Для естественного языка расшифровать понятия синтаксиса и семантики можно следующим образом:

  1.  cинтаксис – раздел грамматики, изучающий внутреннюю структуру и общие свойства предложения;
  2.  cемантика – раздел языкознания, изучающий значения единиц языка.

Для языков программирования справедливы следующие определения:

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

Семантика определяет смысловое значение предложений алгоритмического языка.

Заметим, что определения достаточно похожи по своему смыслу. Действительно, язык программирования – искусственный (формальный) язык, предназначенный для записи алгоритмов. Язык программирования задается своим описанием и реализуется в виде специальной программы: компилятора или интерпретатора.

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

Что же означает словосочетание высокого уровня, чем языки программирования высокого уровня отличаются от языков низкого уровня?

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

К настоящему времени создано большое число разных языков программирования высокого уровня, однако реально используются лишь некоторые из них. К числу активно применяемых языков относятся C и C++,  C#, Pascal, Java, Visual Basic.  

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

Заметим, что трансляторы языков высокого уровня, таких как Pascal, C, и других, обычно называют компиляторами (compiler). Этим подчёркивается общепринятый для промышленных языков режим трансляции, при котором вначале осуществляется перевод программы в двоичное представление, а лишь затем программа передаётся на исполнение. Другой способ трансляции, называемый интерпретация, состоит в совмещении перевода и исполнения программы (в этом случае объектный модуль не сохраняется и его, соответственно, нельзя повторно использовать).

К числу основных достоинств компилируемых языков по сравнению с интерпретируемыми языками относятся:

  1.  в компилируемых языках процесс построения (создания) исполняемого модуля выполняется один раз, а не при каждом запуске, что экономит время.
  2.  в компилируемых языках обнаружение синтаксических ошибок происходит до запуска программы на выполнение, а не в его процессе.

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

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

 

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

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

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

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

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

Но как все-таки определить, есть в программе ошибка или нет? Кажется, что самый простой способ можно сформулировать так: «сейчас запустим и проверим!». К сожалению, этот принцип применим лишь для очень ограниченного спектра задач. В реальных программистских компаниях существует целый штат сотрудников, которые занимаются этими проблемами (контролеры качества). Более того, теория в данной области не стоит на месте. Разработано несколько разных подходов к решению рассмотренных проблем.

 

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

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

Редактор кода – это программная система, обеспечивающая первоначальную подготовку исходного текста программы и его исправление в процессе разработки. В отличие от универсальных текстовых процессоров (самым известным из них является MS Word), редакторы кода специализированы для работы именно с исходными текстами программ, поэтому они не имеют массы функций обычных редакторов (вроде работы с таблицами и рисунками), зато предоставляют другие специальные функции,  не менее полезные. Существует довольно большое количество различных редакторов кода, начиная от простого набора текста, комбинирования отдельных фрагментов, поиска по образцу, выделения цветом различных элементов программы и заканчивая автоматическим форматированием в соответствии с устоявшимися правилами оформления кода для того или иного языка программирования (эти правила часто называют стилем).

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

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

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

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

 

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

Хорошая инструкция – это не то, что может понять только автор инструкции. Это не книга в 2000 страниц, глядя на которую будущему пользователю хочется быстрее забыть про программный продукт. Хорошая инструкция – это то, при помощи чего можно быстро и самостоятельно научиться пользоваться приобретенной продукцией (в том числе и программным обеспечением). Как обстоит дело с написанием этих инструкций? Как правило, программисты любят писать программы, но не любят писать инструкции. Представьте себе, что один из программистов уволился, а на его место был вынужденно принят на работу новый сотрудник. Как теперь он сможет разобраться, как устроено то, что ему надлежит доделывать и, возможно, в чем-то переделывать? Без наличия документации попытка разобраться в чужой программе во многом равносильна ее переписыванию с нуля.

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

5.В.1.3. Понятие интегрированной среды разработки

 

Интегрированная среда разработки (IDE  Integrated Development Environment) – специальная программа, предоставляющая возможность удобной совместной работы с различными компонентами системы программирования.

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

Теперь представьте себе, как можно по очереди запускать все эти программы с огромным количеством разных параметров. То есть, сначала запускается редактор кода  и пишется в нем программа. После этого подготовленная программа сохраняется, а затем закрывается редактор. Далее запускается компилятор, указав ему в качестве параметра файл с текстом программы и все необходимые настройки. Например, компилятор отработал и нашел 4 ошибки. Снова запускается текстовый редактор и в результате титанических усилий находятся эти строки и ошибки в них. После этого снова сохраняется программа, закрывается редактор и опять запускается компилятор. В результате компилятор создает объектный код, на этот раз без синтаксических ошибок. Теперь запускается сборщик, указывая ему кучу параметров и тот самый объектный файл. Если ошибок нет, то наконец, получится исполняемый файл, запускаете его и программа запустилась и «повисла». Или не повисла, но сказала, что уравнение не имеет корней, хотя точно известно, что решение есть. Это значит, что с семантикой что-то не то, иначе говоря, программа работает неправильно и ее необходимо отлаживать, искать ошибки. Для этого у нас есть отладчик.  И т.д. и т.п.

Для устранения неудобств и повышения эффективности процесса разработки создатели систем программирования стали строить их в виде так называемых Интегрированных сред разработки. Термин «интегрированная» в названии среды означает, что она включает в себя в качестве элементов все необходимые инструменты для выполнения полного цикла работ над программой: написания, компиляции, построения исполняемого модуля, запуска, отладки. Кроме того, интегрированные среды позволяют выполнять следующие операции:

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

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

Одно из последних достижений в области разработки программного обеспечения – визуальные среды программирования (самые известные – Borland® Delphi™ с базовым языком Object Pascal и многоязыковая среда Microsoft® Visual Studio.NET). Их появление связано с двумя важными факторами. Во-первых, это стремление человека максимально автоматизировать собственный труд.  Второй фактор связан с тем, что современный пользователь в большинстве своем не станет работать с программой, которая не удовлетворяет его «чувство прекрасного». Говоря серьезно, сейчас при создании программ их внешнему виду уделяется не меньшее значение, чем внутреннему содержанию. Визуальные среды и тут приходят на помощь.

5.В.1.4. Интегрированная среда разработки  
Visual Studio .NET

Microsoft предлагает Visual Studio .NET 2008 в пяти изданиях: Express, Standard, Professional, Team System и для Microsoft Office, которые покрывают потребности всех категорий разработчиков – от начинающих до профессионалов высшего класса.

Express представляет собой набор идентичных по составу продуктов, но с поддержкой только одного из языков – VB, VC# или VC++. Это упрощенные варианты средства для создания только Windows-приложений. Кроме того, имеется инструмент для создания динамических Web-сайтов и Web-сервисов – Visual Web Developer 2008 Express Edition (с возможностью программирования на VB и VC#). В состав всех этих продуктов входит SQL Server 2005 Express Edition. В целом они и предназначены в первую очередь для начинающих программистов, любителей или для использования в учебных целях.

Разница между изданиями Standard и Professional для многих целей разработки представляется минимальной, серьезные различия видны, только если речь идет о создании достаточно сложных решений. Оба варианта позволяют разрабатывать Windows- и Web-приложения и программное обеспечение (ПО) для мобильных устройств. В Professional Edition имеются все возможности Standard плюс средства удаленной отладки, генератор отчетов Crystal Reports, SQL Server Developer Edition, SQL Server Integration и расширенные инструменты для развертывания ПО.

Visual Studio 2008 Team System – это высокопроизводительный, интегрированный, расширяемый набор средств поддержки полного жизненного цикла командной разработки и приложений корпоративного уровня.

Кроме того, в линейку Visual Studio входит инструмент Visual Studio 2008 Tools for the Microsoft Office System – эффективное средство профессиональной разработки решений на базе приложений Office System 2008 (Excel, Word, Outlook и InfoPath). Программирование выполняется на VB и VC#. 

В состав VS 2008 входят компиляторы трех языков – VB,  VC# и  VC++.  И все же именно первые два фактически олицетворяют собой этот. Ведь VC++, несмотря на появление в нем расширений для создания управляемого кода, все же ориентирован на разработку программ в классической архитектуре Win API, и его роль в создании прикладных решений заметно снижается.

Поддержка рефакторинга – одно из наиболее существенных новшеств VS IDE. Это позволяет автоматизировать процедуры переименования, перемещения и изменения типизированных элементов кода, исправления порядка описания параметров, имплементации программного интерфейса и ряд других операций. Все это выполняется с помощью нового инструмента Class Designer, который позволяет визуально представить структуру классов приложения или создать приложение путем визуального определения классов. Если щелкнуть правой кнопкой мыши диаграмму классов, то далее в меню можно выбрать вид операции рефакторинга. Далее выполняются необходимые изменения в диаграмме классов, которые также автоматически корректируют исходный код программы.

Class Designer может рассматриваться как некий базовый инструмент создания приложений, который сводит к минимуму процесс кодирования, используя вместо этого методы визуального проектирования. Так, переместив новый класс с панели инструментов Toolbox на форму конструктора, можно затем визуально добавлять методы, определять взаимосвязи между классами, формировать интерфейсы, создавать структуры и т. п.

 

5.B.1.5.  Архитектура Framework .NET

Платформа .NET Framework состоит из четырех групп программных продуктов:

  1.  набор базовых языков, куда входят С#, С++ и Visual Basic .NET; набор инструментальных средств разработки, в том числе Visual Studio .NET; обширная библиотека классов для построения Web-служб и приложений, работающих в Windows и в Интернете; а также среда выполнения программ CLR (Common Language Runtime, общеязыковая среда выполнения), в которой выполняются объекты, построенные на этой платформе;
  2.  набор серверов .NET Enterprise Servers, которые предоставляют специализированные функциональные возможности для обращения к реляционным базам данных, использования электронной почты, оказания коммерческих услуг и т. д.;
  3.  богатый выбор Web-служб, называемых .Net My Services. За умеренную плату разработчики могут пользоваться этими службами при построении приложений, требующих идентификации личности пользователя и других данных;
  4.  новые некомпьютерные устройства, поддерживающие средства .NET, от сотовых телефонов до игровых приставок.

Microsoft .NET поддерживает не только языковую независимость, но и языковую интеграцию. Это означает, что разработчик может наследовать от классов, обрабатывать исключения и использовать преимущества полиморфизма при одновременной работе с несколькими языками. Платформа .NET Framework предоставляет такую возможность с помощью спецификации Common Type System (CTS, общая система типов), которая полностью описывает все типы данных, поддерживаемые средой выполнения, определяет, как одни типы данных могут взаимодействовать с другими и как они будут представлены в формате .NET. Например, в .NET любая сущность является объектом какого-нибудь класса, производного от корневого класса System.Object. Спецификация CTS поддерживает такие общие понятия, как классы, делегаты, ссылочные и размерные типы.

Важно понимать, что не во всех языках программирования .NET обязательно должны поддерживаться все типы данных, которые определены в CTS. Спецификация Common Language Specification (CLS, общая языковая спецификация) – устанавливает основные правила, определяющие законы, которым должны следовать все языки, такие как ключевые слова, типы, примитивные типы, перегрузки методов и т.п. Спецификация CLS определяет минимальные требования, предъявляемые к языку платформы .NET. Компиляторы, удовлетворяющие этой спецификации, создают объекты, способные взаимодействовать друг с другом. Любой язык, соответствующий требованиям CLS, может использовать все возможности библиотеки FCL (Framework Class Library, библиотека классов платформы). CLS позволяет и разработчикам, и поставщикам, и производителям ПО не выходить за пределы общего набора правил для языков, компиляторов и типов данных.

Платформа .NET Framework является надстройкой над операционной системой, в качестве которой может быть Windows. Платформа .NET Framework включает в себя:

  1.  три официальных языка: С#, VB.NET, VC++ ;
  2.  объектно-ориентированную среду CLR (Common Language Runtime), совместно используемую этими языками для создания приложений под Windows и для Internet;
  3.  ряд связанных между собой библиотек классов под общим именем FCL (Framework Class Library).

Архитектурные компоненты платформы .NET Framework представлены на
рис. 5.
B.1-1.

Рис. 5.B.1-1. Архитектура .NET Framework.

Самым важным компонентом платформы .NET Framework является CLR(Common Language Runtime), предоставляющая среду, в которой выполняются программы. Главная ее роль заключается в том, чтобы обнаруживать и загружать типы .NET и производить управление ими в соответствии с полученными командами. На верхнем уровне среда активизирует объекты, производит проверку безопасности, размещает объекты в памяти, выполняет их, а также запускает сборщик мусора.

Под сборкой мусора понимается освобождение памяти, занятой объектами, которые стали бесполезными и не используются в дальнейшей работе приложения. В ряде языков программирования (например, C++) память освобождает сам программист, в явной форме отдавая команды, как на создание, так и на удаление объекта. Однако в CLR задача сборки мусора (и другие вопросы, связанные с использованием памяти) решается в нужное время и в нужном месте исполнительной средой, ответственной за выполнение вычислений.

На рис. 5.B.2-1над уровнем CLR находится набор базовых классов платформы, а над ним расположены слой классов данных и XML, а также слой классов для создания Web-служб (Web Services), Web- и Windows-приложений (Web Forms и Windows Forms). Собранные воедино, эти классы известны под общим именем FCL (Framework Class Library). Это одна из самых больших библиотек классов в истории программирования. Она окрывает доступ к системным функциям, также к прикладным функциям для Web-разработки (ASP.NET), для доступа к данным (ADO.NET), обеспечения безопасности и удаленного управления. Имея в своем составе более 4000 классов, библиотека FCL способствует быстрой разработке настольных, клиент-серверных и других приложений и
Web-служб.

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

Над этим уровнем находится уровень классов, которые расширяют базовые классы с целью обеспечения управления данными и XML. Классы данных позволяют реализовать управление информацией, хранящейся в серверных базах данных. В число этих классов входят классы SQL (Structured Query Language, язык структурированных запросов), дающие возможность обращаться к долговременным хранилищам данных через стандартный интерфейс запросов SQL. Кроме того, набор классов, называемый ADO.NET, позволяет оперировать постоянными данными. Платформа .NET Framework поддерживает также целый ряд классов, позволяющих манипулировать XML-данными и выполнять поиск и преобразования XML.

Базовые классы, классы данных и XML расширяются классами, предназначенными для построения приложений на основе трех различных технологий: Web Services (Web-службы), Web Forms (Web-формы) и Windows Forms (Windows-формы). Поскольку Web-службы применяют в качестве базовых протоколов связи стандартные протоколы HTTP и SOAP, эти компоненты поддерживают в киберпространстве подход «Plug-and-Play». Напомним, что Plug and Play, дословно переводится как «включил и играй (работай)»  – технология, предназначенная для быстрого определения и конфигурирования устройств в компьютере.

Инструментальные средства Web Forms и Windows Forms позволяют применять технику Rapid Application Development (RAD, быстрая разработка приложений) для построения  Web - и Windows-приложений. Эта техника сводится к перетаскиванию элементов управления с панели инструментов на форму, двойному щелчку по элементу и написанию кода, обрабатывающего события, связанные с этим элементом.

.NET-приложения исполняются иначе, чем традиционные Windows-приложения. Такие программы компилируются фактически в два этапа. На первом этапе исходный код компилируется во время построения проекта и вместо исполняемого файла с машинными кодами получается сборка (assembly), содержащая команды промежуточного языка Microsoft Intermediate Language – (MS IL, промежуточный язык Microsoft). Код IL сохраняется в файле на диске. При этом, файлы IL, генерируемые компилятором, например, VB, идентичны IL-файлам, генерируемым компиляторами с других языков .NET. В этом смысле платформа остается в неведении относительно языка. Самой важной характеристикой среды CLR является то, что она общая; одна среда выполняет как программы, написанные на С#, так и программы на языке VB.NET.

Напомним, что сборка (assembly) – это коллекция файлов, которая предстает перед программистом в виде единой библиотеки динамической компоновки (DLL) или исполняемого файла (EXE); в технологии .NET сборка является базовой единицей для повторного использования, контроля версий, защиты и развертывания. Среда CLR представляет программисту ряд классов, позволяющих манипулировать сборками.

Второй этап компиляции наступает непосредственно перед фактическим выполнением страницы. На этом этапе CLR транслирует промежуточный код IL в низкоуровневый собственный машинный код, выполняемый процессором. Процесс происходит следующим образом: при выполнении .NET-программы системы CLR активизирует JIT-компилятор, который затем превращает MS IL во внутренний код процессора. Этот этап известен как оперативная компиляция «точно к нужному моменту» (Just-In-Time) или JIT-компиляция (JIT'ing) и он проходит одинаково для всех приложений .NET (включая, например, приложения Windows). При исполнении программы CLR берет на себя управление памятью, контроль типов и решает за приложение ряд других задач. На
рис. 5.
B.2-2 показан этот двухэтапный процесс компиляции.

Рис. 5.В.2-2. Схема компиляции .NET-приложения.

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

Спецификация CLS подразумевает, что все языки платформы .NET генерируют очень похожий IL-код. Кроме того, при компилировании программы в дополнение к MS IL формируется еще один компонент – метаданные, которые описывают данные, используемые программой, что позволяет коду взаимодействовать с другим кодом. В результате объекты, созданные на одном языке, доступны и могут наследоваться на другом. То есть, можно создать базовый класс на языке VB.NET, а производный от него класс – на языке С#.

В целом, при написании приложения создается так называемый управляемый код (managed code), который выполняется под контролем не зависящей от языка среды исполнения CLR приложения. Поскольку приложение запускается под контролем CLR, управляемый код должен соответствовать определенным требованиям. То есть. компилятор должен создать MS IL-файл, предназначенный для CLR, а также использовать библиотеки .Net Framework, при выполнении которых он получает множество преимуществ, включая современное управление памятью, способность совмещать языки, высокий уровень безопасности передачи данных, поддержку контроля версии и понятный способ взаимодействия компонентов программного обеспечения. Библиотека классов .NET открывает доступ ко всем возможностям CLR. Классы, составляющие эту библиотеку, организованы при помощи пространств имен. Причем каждое пространство имен заключает в себе классы, выполняющие близкие функции.

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

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

5.B.1.6. Framework .Net – единый каркас среды разработки

Открытость. Среда разработки программных проектов является открытой языковой средой. Это означает, что наряду с языками программирования, включенными в среду фирмой Microsoft – Visual C++ .Net (с управляемыми расширениями), Visual C# .Net , Visual Basic .Net, – в среду могут добавляться любые языки программирования, компиляторы которых создаются другими фирмами.

Таких расширений среды Visual Studio сделано уже достаточно много, практически они существуют для всех известных языков программирования.

Открытость среды не означает полной свободы. Все разработчики компиляторов при включении нового языка в среду разработки должны следовать определенным ограничениям. Главное ограничение, которое можно считать и главным достоинством, состоит в том, что все языки, включаемые в среду разработки Visual Studio .Net должны использовать единый каркас – Framework .Net. Благодаря этому достигаются многие желательные свойства: легкость использования компонентов, разработанных на различных языках; возможность разработки нескольких частей одного приложения на разных языках; возможность бесшовной отладки такого приложения; возможность написать класс на одном языке, а его потомков – на других языках. Единый каркас приводит к сближению языков программирования, позволяя вместе с тем сохранять их индивидуальность и имеющиеся у них достоинства. Преодоление языкового барьера – одна из важнейших задач современного мира. Visual Studio .Net, благодаря единому каркасу, в определенной мере решает эту задачу в мире программистов.

В каркасе Framework .Net можно выделить два основных компонента:

статический – FCL  – библиотеку классов каркаса;

  1. динамический – CLR  – общеязыковую среду  исполнения.

Библиотека классов FCL – статический компонент каркаса. Понятие каркаса приложений – Framework Applications появилось достаточно давно, оно широко использовалось еще в четвертой версии Visual Studio.

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

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

Встроенные примитивные типы. Важной частью библиотеки FCL стали классы, задающие примитивные типы, те типы, которые считаются встроенными в язык программирования. Типы каркаса покрывают основное множество встроенных типов, встречающихся в языках программирования. Типы языка программирования проецируются на соответствующие типы каркаса. Тип, называемый в языке Visual Basic – Integer, а в языках С++ и C# - int, проецируется на один и тот же тип каркаса System.Int32. В языке программирования, наряду с "родными" для языка названиями типов, разрешается пользоваться именами типов, принятыми в каркасе. Поэтому, по сути, все языки среды разработки могут пользоваться единой системой встроенных типов, что, конечно, способствует облегчению взаимодействия компонентов, написанных на разных языках.

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

Архитектура приложений. Существенно расширился набор возможных архитектурных типов построения приложений. Помимо традиционных Windows- и консольных приложений, появилась возможность построения Web-приложений. Большое внимание уделяется возможности создания повторно используемых компонентов – разрешается строить библиотеки классов, библиотеки элементов управления и библиотеки Web-элементов управления.

Модульность. Число классов библиотеки FCL велико (несколько тысяч). Поэтому понадобился способ их структуризации. Логически классы с близкой функциональностью объединяются в группы, называемые Пространством имен (Namespace). Основным пространством имен библиотеки FCL является пространство System, содержащее как классы, так и другие вложенные пространства имен. Так, уже упоминавшийся примитивный тип Int32 непосредственно вложен в пространство имен System и его полное имя, включающее имя пространства – System.Int32.

В пространство System вложен целый ряд других пространств имен. Например, в пространстве System.Collections находятся классы и интерфейсы, поддерживающие работу с коллекциями объектов – списками, очередями, словарями. В пространство System.Collections, в свою очередь, вложено пространство имен Specialized, содержащие классы со специализацией, например, коллекции, элементами которых являются только строки. Пространство System.Windows.Forms содержит классы, используемые при создании Windows-приложений. Класс Form из этого пространства задает форму – окно, заполняемое элементами управления, графикой, обеспечивающее интерактивное взаимодействие с пользователем.

Общеязыковая исполнительная среда CLR – динамический компонент каркаса. Важным шагом в развитии каркаса Framework .Net стало введение динамического компонента каркаса - исполнительной среды CLR. С появлением CLR процесс выполнения приложений стал принципиально другим.

Двухэтапная компиляция. Управляемый модуль и управляемый код. Компиляторы языков программирования, включенные в Visual Studio .Net, создают код на промежуточном языке IL (Intermediate Language) – ассемблерном языке.  В результате компиляции проекта, содержащего несколько файлов, создается так называемый управляемый модуль – переносимый исполняемый файл (Portable Executable или PE-файл). Этот файл содержит код на IL и метаданные – всю информацию, необходимую для CLR, чтобы под ее управлением PE-файл мог быть исполнен. Метаданные доступны и конечным пользователям. Классы, входящие в пространство имен Reflection, позволяют извлекать метаинформацию о классах, используемых в проекте. Этот процесс называется отражением. Об атрибутах классов, отображаемых в метаданные PE-файла, еще будем говорить неоднократно. В зависимости от выбранного типа проекта, PE-файл может иметь разные уточнения - exe, dll, mod или mdl.

Необходимо отметить, что PE-файл, имеющий уточнение exe, хотя и является exe-файлом, но это не обычный исполняемый Windows файл. При его запуске он распознается как PE-файл и передается CLR для обработки. Исполнительная среда начинает работать с кодом, в котором специфика исходного языка программирования исчезла. Код на IL начинает выполняться под управлением CLR (по этой причине код называется управляемым). Исполнительную среду следует рассматривать как виртуальную IL-машину. Эта машина транслирует «на лету» требуемые для исполнения участки кода в команды реального процессора, который в действительности и выполняет код.

Виртуальная машина. Отделение каркаса от студии явилось естественным шагом. Каркас Framework .Net перестал быть частью студии, а стал надстройкой над операционной системой. Теперь компиляция и создание PE модулей на IL отделено от выполнения, и эти процессы могут быть реализованы на разных платформах.

  1.  В состав CLR входят трансляторы JIT (Just In Time Compiler), которые и выполняют трансляцию IL в командный код той машины, где установлена и функционирует исполнительная среда CLR. Microsoft реализовала CLR и FCL для различных версий Windows, включая Windows 98/Me/NT 4/2000, 32 и 64-разрядные версии Windows XP , Windows Vista, Windows 7  и семейство .Net Server.
  2.  Framework .Net развивается параллельно с развитием языков программирования, среды разработки программных проектов и операционных языков. Версиb языков C# 2.0 и VB 2005 использовалb версию Framework .Net  2.0. Операционная система Windows Vista включила в качестве надстройки Framework .Net 3.0. Языки VB 2008, C# 3.0 и Visual Studio 2008 включают версию Framework .Net 3.5.

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

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

Метаданные. Переносимый исполняемый PE-файл является самодокументируемым файлом и, как уже говорилось, содержит программный код и метаданные, описывающие код. Файл начинается с манифеста и включает в себя описание всех классов, хранимых в PE-файле, их свойств, методов, всех аргументов этих методов – всю необходимую CLR информацию. Поэтому помимо PE-файла не требуется никаких дополнительных файлов, записей в реестр, вся нужная информация извлекается из самого файла. Среди классов библиотеки FCL имеется класс Reflection, методы которого позволяют извлекать необходимую информацию. Введение метаданных не только важная техническая часть CLR, но это также часть новой идеологии разработки программных продуктов. Мы увидим, что и на уровне языков VB и  C# самодокументированию уделяется большое внимание.

Сборщик мусора (Garbage Collector) и управление памятью. Еще одной важной особенностью построения CLR является то, что исполнительная среда берет на себя часть функций, традиционно входящих в ведение разработчиков трансляторов, и  облегчает тем самым их работу. Один из таких наиболее значимых компонентов CLR –  сборщик мусора (Garbage Collector). Под сборкой мусора понимается освобождение памяти, занятой объектами, которые стали бесполезными и не используются в дальнейшей работе приложения. В ряде языков программирования (классическим примером является язык C/C++) память освобождает сам программист, в явной форме отдавая команды, как на создание, так и на удаление объекта. В этом есть своя логика – я тебя породил, я тебя и убью. Однако можно и нужно освободить человека от этой работы. Неизбежные ошибки программиста при работе с памятью тяжелы по последствиям, и их крайне тяжело обнаружить. Как правило, объект удаляется в одном модуле, а необходимость в нем обнаруживается в другом далеком модуле. Обоснование того, что программист не должен заниматься удалением объектов, а сборка мусора должна стать частью исполнительной среды, дано достаточно давно.

В CLR эта идея реализована в полной мере. Задача сборки мусора снята не только с программистов, но и с разработчиков трансляторов; она решается в нужное время и в нужном месте – исполнительной средой, ответственной за выполнение вычислений. Здесь же решаются и многие другие вопросы, связанные с использованием памяти, в частности, проверяется и не допускается использование "чужой" памяти, не допускаются и другие нарушения.  Данные, удовлетворяющие требованиям CLR и допускающие сборку мусора, называются управляемыми данными.

Но, как быть с языком C++ и другими языками, где есть нетипизированные указатели, адресная арифметика, возможности удаления объектов программистом? Ответ следующий – CLR позволяет работать как с управляемыми, так и с неуправляемыми данными. Однако использование неуправляемых данных регламентируется и не поощряется. Так, в C# модуль, использующий неуправляемые данные (указатели, адресную арифметику), должен быть помечен как небезопасный (unsafe),  и эти данные должны быть четко зафиксированы. Исполнительная среда, не ограничивая возможности языка и программистов, вводит определенную дисциплину в применении потенциально опасных средств языков программирования.

Исключительные ситуации. Что происходит, когда при вызове некоторой функции (процедуры) обнаруживается, что она не может нормальным образом выполнить свою работу? Возможны разные варианты обработки такой ситуации. Функция может возвращать код ошибки или специальное значение, может выбрасывать исключение, тип которого характеризует возникшую ошибку. В CLR принято во всех таких ситуациях выбрасывать исключение. Косвенно это влияет и на язык программирования. Выбрасывание исключений наилучшим образом согласуется с исполнительной средой. В языках VB и C# выбрасывание исключений, их дальнейший перехват и обработка – основной рекомендуемый способ обработки исключительных ситуаций.

События. У CLR есть свое видение того, что представляет собой тип. Есть формальное описание общей системы типов CTS. В соответствии с этим описанием, каждый тип, помимо полей, методов и свойств, может содержать и события. При возникновении событий в процессе работы с тем или иным объектом данного типа посылаются сообщения, которые могут получать другие объекты. Механизм обмена сообщениями основан на делегатах – функциональном типе. Надо ли говорить, что в язык C# встроен механизм событий, полностью согласованный с возможностями CLR. 

Исполнительная среда CLR обладает мощными динамическими механизмами – сборки мусора, динамического связывания, обработки исключительных ситуаций и событий. Все эти механизмы и их реализация в CLR созданы на основании практики существующих языков программирования. Но уже созданная исполнительная среда в свою очередь влияет на языки, ориентированные на использование CLR. Поскольку языки VB и C#  создавался одновременно с созданием CLR, то, естественно, они стали языками, наиболее согласованным с исполнительной средой, и средства этих языков напрямую отображаются в средства исполнительной среды.

Общие спецификации и совместимые модули. Уже говорилось, что каркас Framework .Net облегчает межъязыковое взаимодействие. Для того чтобы классы, разработанные на разных языках, мирно уживались в рамках одного приложения, для их бесшовной отладки и возможности построения разноязычных потомков, они должны удовлетворять некоторым ограничениям. Эти ограничения задаются набором общеязыковых спецификаций – CLS. Класс, удовлетворяющий спецификациям CLS, называется CLS-совместимым. Он доступен для использования в других языках, классы которых могут быть клиентами или наследниками совместимого класса.

5.В.2. Среда исполнения программ

5.B.2.1. Введение

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

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

Что нужно для того, чтобы программа, которая есть выраженный на языке программирования алгоритм, могла быть выполнена? Вроде бы ответ очевиден – нужен тот, кто способен шаг за шагом (инструкцию за инструкцией) выполнять сформулированные в алгоритме действия. Поскольку действий много, нам потребуется место для их хранения и последующего считывания. Кроме того, любая программа оперирует данными (входными и результирующими) – их тоже необходимо хранить. Наконец, входные данные для программы обычно поставляет человек, он же «забирает» результаты, а, значит, требуются средства ввода/вывода (обмена информацией).

Здесь, стоит упомянуть о глобальном противоречии, которое до сих пор определяет развитие всей программной индустрии – удобные способы представления информации у человека и у компьютера  различны. Человек свободно оперирует образами: это тигр, а это кот, хотя те же «усы, лапы и хвост»; вот эта конструкция о четырех ногах, вон та на колесиках и даже та, что с одной вычурно изукрашенной подставкой – все это стол. Для компьютера же информация, а еще точнее данные, есть всего лишь последовательность (короткая или длинная) нулей и единиц. В самом начале компьютерной эры мощности ЭВМ едва хватало на то, ради чего их создавали – помочь человеку в выполнении численных расчетов, к которым, так или иначе, сводится большинство реальных задач. Естественно ЭВМ освобождали от всех побочных дел, вроде перевода информации из вида, удобного человеку, в вид, понятный машине – на их долю оставались чистые вычисления. Однако, подобно тому, как на подрастающих детей родители начинают перекладывать обязанности по уходу сначала за собой, а потом и за семьей в целом, так и на долю компьютеров с ростом их мощности падало все больше и больше задач, не связанных напрямую с выполнением расчетов. И если когда-то программирование велось в машинном коде, потом на ассемблере, затем на языках высокого уровня, то сейчас компьютер пытаются научить “понимать” обычную человеческую речь. Вполне возможно, что в будущем основным занятием программиста будет не «стучать по клавишам» а с не меньшей скоростью «молоть языком».

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

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

5.В.2.2. Процессор

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

Процессор, он же центральный процессор, он же ЦП, он же Central Processing Unit, он же CPU – основной элемент любой вычислительной системы. В силу внутреннего устройства он понимает только двоичную логику.

 

Человечеству известны натуральные, целые, рациональные, иррациональные, вещественные (они же действительные), комплексные числа. Из всего перечисленного в компьютере с его двоичной системой счисления достаточно просто могут быть представлены лишь натуральные числа. Чуть сложнее с целыми отрицательными.  А с вещественными числами совсем плохо (про комплексные числа и вовсе умолчим: работа с ними – это уже высшая математика, ни в одном из известных процессоров работа с комплексными числами «в железе» не реализована). Из математического анализа известно, что количество вещественных чисел бесконечно не только «в длину» (вправо и влево по координатной оси), но и «в глубину», то есть на любом сколь угодно малом отрезке [a;b] вещественных чисел также бесконечно много. Таким образом, если целые числа «растут» только в одну сторону, слева от десятичной точки, то вещественные еще и вправо от нее. В результате для представления вещественных чисел используется специальный формат, получивший название «число с плавающей точкой».

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

 

Теперь вторая задача процессора – управление. Каждая программа содержит набор команд (инструкций), указывающих процессору, что он должен сделать, откуда взять исходные данные, куда поместить результат. Понятно, что каждая такая команда должна быть процессору известна, то есть содержаться в его системе команд. Общее их количество относительно невелико (в последних процессорах компании  Intel – пара сотен). Условно все команды можно разделить на два типа: вычислительные и управляющие (системные). С вычислительными командами вроде все ясно. Представим, что имеется горячее желание заставить процессор сложить два числа. Находим в списке команд ту, которая отвечает за сложение (не забывая, что для целых чисел команда будет одна, а для вещественных совсем другая), и… Возникает законный вопрос: как же объяснить процессору, какие именно числа складывать? Следующий вопрос: куда их положить, чтобы процессор сумел их «достать»? Для этого  в самом процессоре существует блок регистров – часть процессора, специально предназначенная для хранения данных. Регистров этих немного, да и размер их невелик. Итак, прежде чем мы сможем выполнить команду сложения двух чисел, их необходимо загрузить в регистры, вот для этого, в частности, нам и понадобятся системные инструкции. Естественно, есть множество других ситуаций, в которых процессор должен выполнять не вычисления, а функции управляющего, «говоря» остальным устройствам компьютера: «пойди туда», «сделай то», «подай это» и т.д.

Следующий важный момент – поступление данных в процессор. Взаимодействие с внешним миром процессор производит через шину данных – набор соединений, по которым данные в двоичной системе передаются в виде электрических сигналов. Чем больше соединений, тем большими порциями может передаваться информация. Размер «порции» называется разрядностью шины. Например, в процессоре Intel® Pentium® 4 шина данных 64-разрядна, то есть за единицу времени этот процессор может воспринять (или передать) блок из шестидесяти четырех нулей и единиц.

Процессор – устройство с дискретным «восприятием» времени. Моменты времени для него следуют друг за другом в виде тактов, в каждый такой такт «помещается» одно элементарное действие. Чем мельче такт, тем быстрее «живет» процессор, а значит, тем выше его быстродействие. Такт современных процессоров составляет менее одной миллиардной секунды. Такие числа не слишком удобны для восприятия, поэтому быстродействие процессора принято характеризовать его тактовой частотойчислом тактов в секунду (герц). Таким образом, конкретная модель процессора может быть описана, например, так: процессор Intel® Pentium® 4 с тактовой частотой 3,4 Ггц (гигагерц или GHz).

Напомним, что вычислительным системам, основанным на архитектуре, предложенной Джоном фон Нейманом в 40-х годах ХХ века присущи следующие характеристики:

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

 

5.В.2.3. Оперативная память

В каждый момент времени (такт) процессор работает ровно с одной командой и средствами хранения команд не обладает.

Большинство команд представляют собой операции над некоторой порцией данных. Как мы выяснили выше, небольшое количество данных процессор все-таки в состоянии разместить «внутри себя», в регистрах. Однако, кроме самых простейших случаев, регистров для хранения всех данных, которые должны быть обработаны в конкретной программе, недостаточно. Таким образом, и сами данные и команды для их обработки должны быть куда-то записаны. Оттуда процессор будет их извлекать, выполнять указанные действия и в это же «куда-то» сохранять полученные результаты. Оперативная память, она же ОП, она же Random Access Memory, она же RAM, – второе по важности действующее лицо вычислительной системы, при выключении питания «забывает» все, что содержала. В отличие от процессора представляет собой совокупность физических и программных элементов. Должностные обязанности: «хранитель оперативной информации».

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

Каждое из приведенных определений отражает некоторые аспекты понятия ОП.

5.В.2.4. Долговременное хранение информации

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

Жесткий диск, он же винчестер, он же Hard-Disk Drive, он же HDD, он же «винт»– самое ценное действующее лицо вычислительной системы.

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

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

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

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

На этом мы закончим наш краткий экскурс в мир компьютерного «железа» и перейдем к «софту» – программному обеспечению.

5.В.2.5. Классификация программных средств

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

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

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

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

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

5.В.2.5. Операционная система

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

Операционная система, она же ОС, она же Operating System, она же OS, она же «операционка», она же – основное управляющее лицо любой современной вычислительной системы. Она представляет собой совокупность программных средств системного уровня. Должностные обязанности: обеспечение взаимодействия пользователя и вычислительной системы, обеспечение эффективного использования ресурсов последней, организация надежного функционирования программного обеспечения.

Устройство современных операционных систем более сложно, чем устройство самих вычислительных систем. Здесь отметим лишь два существенных момента. Пользователю вычислительной системы ОС предоставляет средства управления, программисту – набор функций системного уровня (так называемый API – Application Programming Interface).

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

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

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

В-третьих, Windows любой программе при запуске предоставляет «отдельное» линейное адресное пространство, размером в 4 Гб. Поскольку большинство компьютеров обладают меньшим объемом оперативной памяти, в реальности это пространство обеспечивается механизмами поддержки виртуальной памяти (с использованием жесткого диска).

 5.B.3. Парадигмы программирования

5.B.3.1. Основные определения

Что же определяет структуру и стиль программного кода  вообще и в частности проектов в среде VS .Net?  Прежде всего,  парадигма программирования, которой необходимо следовать, работая в любой среде программирования.

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

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

Таким образом,  «парадигмы разные нужны, парадигмы разные важны». Все они – всего лишь различные инструменты, которые можно использовать при программировании. Каждый из этих инструментов по-своему хорош Но это не значит, что они «эффективно универсальны». То есть, на самом деле, различные методики программирования дают разный выигрыш для решения задач разных классов. Этот выигрыш можно измерять по двум параметрам:

эффективность программного обеспечения на современных ЭВМ;

общие затраты на разработку программного обеспечения.

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

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

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

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

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

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

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

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

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

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

  1. определение (декларативное, функциональное программирование); 
  2. действие (императивное программирование);
  3. правило (продукционное программирование);
  4.  диаграмма переходов (автоматное программирование)
  5. и др. сущности.

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

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

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

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

Императивное программирование;

Процедурное программирование;

Структурное программирование;

Объектно-ориентированное программирование; 

Функциональное программирование;

Логическое программирование;

Декларативное программирование;

Событийно-ориентированное программирование.

5.В.3.2. Императивное программирование

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

Одна из характерных черт императивного программирования – наличие переменных с операцией «разрушающего присвоения»". То есть, имеется переменная А, которая содержит значение Х. На очередном шаге алгоритм предписывает присвоить переменной А значение Y. То значение, которое было у переменной  А, будет «навсегда забыто». На практике это означает «переход между состояниями под управлением функции переходов».

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

Первыми императивными языками были машинные коды – «родной язык» программирования для компьютера. В этих языках инструкции были крайне просты, что снижало нагрузку на компьютеры, однако затрудняло написание крупных программ. В 1954 появился первый  язык программирования - FORTRAN, а затем ALGOL, Pascal и C.

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

5.В.3.3. Процедурное программирование

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

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

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

Процедурными языками программирования являются следующие: Basic (начиная с Quick Basic до появления Visual Basic), Си, КОБОЛ, Фортран, Pascal и т.д.

5.В.3.4. Структурное программирование и
метод функциональной декомпозиции

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

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

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

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

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

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

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

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

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

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

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

Таким образом, пошаговая реализация это тактика разработки программы, а нисходящее проектирование это стратегия программирования.

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

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

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

Методология структурной разработки программного обеспечения была признана «самой сильной формализацией 70-х годов».

Перечислим некоторые достоинства структурного программирования:

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

5.В.3.5.  Объектно-ориентированное программирование

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

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

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

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

  1.  

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

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

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

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

Наличие инкапсуляции достаточно для  «объектности»  языка программирования, но ещё не означает его объектной ориентированности – для этого требуется наличие наследования.

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

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

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

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

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

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

По мнению одного из «отцов-основателей» ООП, объектно-ориентированный подход заключается в следующем наборе основных принципов:

  1. Всё является объектом.
  2.  Вычисления осуществляются путём взаимодействия (обмена данными) между объектами, при котором один объект требует, чтобы другой объект выполнил некоторое действие. Объекты взаимодействуют, посылая и получая сообщения. Сообщение — это запрос на выполнение действия, дополненный набором аргументов, которые могут понадобиться при выполнении действия.
  3.  Каждый объект имеет независимую память, которая состоит из других объектов.
  4.  Каждый объект является представителем (экземпляром) класса, который выражает общие свойства объектов.
  5.  В классе задаётся поведение (функциональность) объекта. Тем самым все объекты, которые являются экземплярами одного класса, могут выполнять одни и те же действия.
  6.  Классы организованы в единую древовидную структуру с общим корнем, называемую иерархией наследования. Память и поведение, связанное с экземплярами определённого класса, автоматически доступны любому классу, расположенному ниже в иерархическом дереве.

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

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

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

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

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

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

Объектно-ориентированное проектирование основывается на описании структуры и поведения проектируемой системы, то есть, фактически, в ответе на два основных вопроса:

  1.  из каких частей состоит система;
  2.  в чём состоит ответственность каждой из частей.

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

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

Кратко рассмотрим технологии родственные объектно-ориентированному программированию.

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

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

  1.  вместо механизма описания классов и порождения экземпляров язык предоставляет механизм создания объекта  и механизм клонирования объектов.
  2.  каждый вновь созданный объект является «экземпляром без класса», то есть каждый объект может стать прототипом  быть использован для создания нового объекта с помощью операции клонирования, а после клонирования новый объект может быть изменён, в частности, дополнен новыми полями и методами.
  3.  клонированный объект либо становится полной копией прототипа, хранящей все значения его полей и дублирующей его методы, либо сохраняет ссылку на прототип, не включая в себя клонированных полей и методов до тех пор, пока они не будут изменены.

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

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

  1.  объявление классов с полями (данными членами класса) и методами (функциями членами класса);
  2.  механизм расширения класса (наследования) порождение нового класса от существующего с автоматическим включением всех особенностей реализации класса-предка в состав класса-потомка (большинство ООП-языков поддерживают только единичное наследование);
  3.  средства защиты внутренней структуры классов от несанкционированного использования извне модификаторы доступа к полям и методам, типа public, private и protected;
  4.  полиморфные переменные и параметры функций (методов), позволяющие присваивать одной и той же переменной экземпляры различных классов;
  5.  полиморфное поведение экземпляров классов за счёт использования виртуальных методов.

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

  1.  конструкторы, деструкторы;
  2.  свойства;
  3.  индексаторы;
  4.  интерфейсы как альтернатива множественному наследованию;
  5.  переопределение операторов для классов.

Часть языков, иногда называемых «чисто объектными», целиком построена вокруг объектных средств – в них любые данные  являются объектами, любой код – методом какого-либо класса, и невозможно написать программу, в которой не использовались бы объекты. Примеры подобных языков – C#, Java. Другие языки включают ООП-подсистему в исходно процедурный язык. В них существует возможность программировать, не обращаясь к объектным средствам. Классические примеры – C++, Pascal и VB.

5.В.3.6.  Функциональное программирование

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

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

Наиболее известными языками функционального программирования являются Haskell – чистый функциональный, LISP и F# – функциональный язык для платформы  .NET.

Такой широко распространенный декларативный язык как SQL содержит некоторые элементы функционального программирования. В нем  остерегаются использовать переменные. Языки работы с электронными таблицами также можно рассматривать как функциональные. Многие нефункциональные языки, такие как C, C++ и C# могут вести себя как функциональные при использовании указателей на функцию. 

5.B.3.7.  Логическое программирование

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

Самым известным языком логического программирования является Prolog.

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

5.B.3.8. Декларативное программирование 

Декларативное программирование – термин с двумя различными значениями.

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

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

Программы на языках декларативного программирования легко поддаются методикам метапрограммирования – когда программа может генерироваться по её описанию. Например, XSLT-программа может быть сгенерирована из файла XML.

Таким образом, декларативное программирование подразумевает использование данных, а не написание кода для того, чтобы заставить приложение или компонент выполнить что-либо. Написание исходного кода иногда называют императивным программированием. Очевидно, со временем декларативное программирование получит еще большее распространение. Примеры подобных технологий уже сейчас можно увидеть в технологиях Microsoft ASP.NET и Microsoft Windows Communication Foundation. Даже в Microsoft Windows Presentation Foundation программисты могут разрабатывать пользовательский интерфейс, объявляя (декларируя) его разметку и поведение, используя язык разметки. 

5.B.3.9. Событийно-управляемое программирование

Событийно-ориентированное программирование (event-driven programming) – это способ построения компьютерной программы, при котором в коде (как правило, в головной функции программы) явным образом выделяется главный цикл приложения, тело которого состоит из двух частей: выборки события и обработки события.

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


5.B.4. Тестовые задания по теме

«Средства разработки приложений в
Visual Studio .NET»

  1.  Алгоритм – это
  2.  понятное и точное предписание исполнителю совершить последовательность действий, направленных на решение поставленной задачи
  3.  некоторые истинные высказывания, которые должны быть направлены на достижение поставленной цели
  4.  отражение предметного мира с помощью знаков и сигналов, предназначенное для конкретного исполнителя
  5.  инструкция по технике безопасности

  1.  Свойствами алгоритма являются
  2.  новизна, понятность, массовость, дискретность, результативность
  3.  дискретность, результативность, детерминированность, массовость, понятность
  4.  массовость, понятность, условность, четкость, однозначность
  5.  четкость, однозначность, массовость, дискретность, результативность

  1.  Расчлененность алгоритма на отдельные шаги, возможность выполнения которых исполнителем не вызывает сомнений, отражена в свойстве алгоритма, которое называется
  2.  дискретностью
  3.  однозначностью
  4.  результативностью
  5.  понятностью

  1.  Основное свойство алгоритма, характерное только для решения задач на ЭВМ,  это
  2.  дискретность
  3.  понятность
  4.  массовость
  5.  точность

  1.  Свойство алгоритма – дискретность – обозначает
  2.  разбиение алгоритма на конечное число простых шагов
  3.  что команды должны следовать последовательно друг за другом
  4.  что каждая команда должны быть описана в расчете на конкретного исполнителя
  5.  нет верного ответа

  1.  Графическое задание алгоритма – это
  2.  представление алгоритма в форме таблиц и расчетных формул
  3.  система обозначения правил для единообразной и точной записи алгоритмов  и их исполнения
  4.  способ представления алгоритма с помощью геометрических фигур
  5.  схематичное изображение в произвольной форме
  6.  
    Выбор метода решения должен предшествовать этапу
  7.  тестирования и отладки
  8.  разработки алгоритма
  9.  построения математической модели
  10.  анализа и уточнения результатов

  1.  Запись алгоритма в виде последовательности команд компьютера называется
  2.  вербальной
  3.  графической
  4.  программной
  5.  словесной

  1.  На этапе тестирования и отладки происходит
  2.  получение результата
  3.  перевод алгоритма на алгоритмический язык
  4.  представление задачи в виде последовательности математических формул
  5.  обнаружение  и исправление синтаксических ошибок, и доведение программы до рабочего состояния

  1.  Компьютер может отследить
  2.  синтаксические ошибки
  3.  логические ошибки
  4.  фактические ошибки в формулах
  5.  любые ошибки

  1.  Завершимость алгоритма за конечное число шагов отражено в свойстве, которое называется
  2.  однозначностью
  3.  результативностью
  4.  понятностью
  5.  дискретностью

  1.  Трансляторы бывают
  2.  компилирующего и интерпретирующего типа
  3.  компилирующего типа
  4.  интерпретирующего типа
  5.  интерпретирующего и транслирующего типа
  6.  компилирующего и транслирующего типа

  1.  Технология программирования предназначена для
  2.  обработки больших объемов структурированной информации
  3.  обработки текстовой информации
  4.  решения вычислительных задач и обеспечения экономической деятельности
  5.  обработки реальных изображений и звука
  6.  создания инструментальных программных средств информационных технологий

  1.  
    Технологии баз данных предназначены для
  2.  обработки больших объемов структурированной информации
  3.  обработки текстовой информации
  4.  решения вычислительных задач и обеспечения экономической деятельности
  5.  обработки реальных изображений и звука
  6.  создания инструментальных программных средств информационных технологий

  1.  Операционная система (ОС) – это
  2.  главный электронный блок компьютера
  3.  система программ, осуществляющая общее управление работой устройств компьютера
  4.  программа, выполняющая арифметические и логические операции
  5.  программа, управляющая работой компьютера в каждый конкретный момент времени
  6.  программа, обеспечивающая доступ пользователя к ресурсам компьютера

  1.  Прикладные программы
  2.  программы, предназначенные для решения конкретных задач
  3.  управляют работой аппаратных средств и обеспечивают услугами нас и наши прикладные комплексы
  4.  игры, драйверы, трансляторы и т.д.
  5.  программы, которые хранятся на разногоного типа дискетах

  1.  Компьютер обрабатывает
  2.  абстракцию
  3.  мотивацию
  4.  информацию
  5.  цифры, знаки, иероглифы

  1.  Устройствами ввода информации в компьютер являются
  2.  сканер, мышь  и клавиатура
  3.  принтер и трекбол
  4.  мышь, клавиатура и коврик
  5.  шина и клавиатура

  1.  Комплекс аппаратных и программных средств, позволяющих компьютерам обмениваться данными, - это
  2.  магистраль
  3.  компьютерная сеть
  4.  адаптер
  5.  интерфейс
  6.  шины данных

  1.  Скорость работы компьютера зависит от
  2.  наличия или отсутствия подключенного принтера
  3.  организации интерфейса операционной системы
  4.  тактовой частоты обработки информации в процессоре
  5.  объема обрабатываемой информации
  6.  объема внешнего запоминающего устройства

  1.  Компьютер – это
  2.  многофункциональное электронное устройство для работы с информацией
  3.  электронное устройство для обработки чисел
  4.  устройство для работы с текстами
  5.  устройство для хранения информации любого вида
  6.  устройство для обработки аналоговых сигналов

  1.  Постоянное запоминающее устройство служит для хранения
  2.  программы пользователя во время работы
  3.  особо ценных прикладных программ
  4.  особо ценных документов
  5.  постоянно используемых программ
  6.  программ начальной загрузки компьютера и тестирования его узлов

  1.  При выключении компьютера вся информация стирается
  2.  на гибком диске
  3.  на жестком диске
  4.  на CD-ROM диске
  5.  в оперативной памяти

  1.  Оперативная память служит для
  2.  обработки информации
  3.  обработки одной программы в заданный момент времени
  4.  хранения информации
  5.  запуска программ

  1.  Внешняя память служит для  
  2.  долговременного хранения информации независимо от того, работает ЭВМ или нет
  3.  хранения информации внутри ЭВМ
  4.  хранения оперативной, часто изменяющейся информации в процессе решения задачи
  5.  обработки информации в данный момент времени

  1.  Центральный процессор выполняет следующие функции
  2.  выполняет арифметические и логические операции
  3.  управляет процессами передачи данных
  4.  осуществляет физическое управление устройствами
  5.  контролирует состояние устройств
  6.  хранит активные программы и данные
  7.  осуществляет преобразование переменного тока в постоянный ток низкого напряжения

  1.  Текстовый редактор - это
  2.  программа автоматического перевода текста на символических языках в текст, записанный с использованием машинных кодов
  3.  программа, предназначенная для работы с текстовой информацией в процессе делопроизводства, редакционно-издательской деятельности и др
  4.  программа обработки изображений при создании мультимедийные игровых программ
  5.  программа управления ресурсами персонального компьютера при создании документов

  1.  Windows – это
  2.  графическая программа
  3.  текстовый редактор
  4.  хорошая вещь
  5.  операционная система

  1.  Под программным обеспечением (SoftWare) понимается.
  2.  совокупность программ, выполняемых вычислительной техникой
  3.  правила техники безопасности
  4.  последовательность символов, слов, абзацев
  5.  инструкция по получению денег в банкомате

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

  1.  Hardware – это
  2.  одна из составляющих информационной технологии - аппаратное обеспечение
  3.   одна из составляющих информационной технологии - программное обеспечение
  4.  жесткий диск, находящийся внутри системного блока

  1.  Software это
  2.  одна из составляющих информационной технологии - программное обеспечение
  3.  одна из составляющих информационной технологии - аппаратное обеспечение
  4.   жесткий диск, находящийся внутри блока         
  5.  компактный диск

  1.  Программа
  2.  это набор инструкций на машинном языке, который хранится в виде файла на магнитном диске и по вашей команде загружается в компьютер для выполнения
  3.  это игры, предназначенные для использования на ЭВМ
  4.  это набор инструкций, предназначенный для запуска компьютера
  5.  это набор инструкций, предназначенных для работы компьютера

 


 

А также другие работы, которые могут Вас заинтересовать

16187. Право и факт в римском праве. Учебное пособие 709.5 KB
  Покровский И.A. Право и факт в римском праве. Киев Типография Императорского университета Св. Владимира Н.Т. КорчакНовицкого 1898 г. Право и факт в римском праве Предисловие Значительная часть предлагаемой работы 1 5 9 была напечатана под заглавием Die actione...
16188. Основные вопросы владения в новом германском уложении. Учебное пособие 140.5 KB
  ОСНОВНЫЕ ВОПРОСЫ ВЛАДЕНИЯ В НОВОМ ГЕРМАНСКОМ УЛОЖЕНИИ Вестник права. 1899. № 1 И.А. ПОКРОВСКИЙ I. Владение являлось в литературе настоящего столетия одним из самых спорных институтов гражданского права. Несмотря на самую оживленную разработку его в которой приняли...
16189. История римского права. Учебное пособие 2.99 MB
  Покровский И.А. ИСТОРИЯ РИМСКОГО ПРАВА Используется греческий шрифт СОДЕРЖАНИЕ ИОСИФ АЛЕКСЕЕВИЧ ПОКРОВСКИЙ И ИЗУЧЕНИЕ РИМСКОГО ПРАВА В РОССИИ 5 Предисловие к 1му изданию 12 Предисл
16190. Основы римского гражданского права. Учебное пособие 1.3 MB
  PAGE 1 Подопригора A.A. Основы римского гражданского права: Учеб. пособие для студентов юрид. вузов и факультетов 2е изд. перераб. К.: Вентури 1995. 288 с. А.А.Подопригора ОСНОВЫ РИМСКОГО ГРАЖДАНСКОГО ПРАВА Допущено Министерством образования Ук
16191. Искусство спора, о теории и практике спора. Учебное пособие 648 KB
  53 О доказательствах Проф. С. И. Поварнин ИСКУССТВО СПОРА. О теории и практике спора Воспроизведено по второму изданию Культурнопросветительного кооперативного товарищества НАЧАТКИ ЗНАНИЙ Петроград 1923 Классическая серьезная книга по искусству спо
16192. Теоретические основы квалификации преступлений. Учебное пособие 649 KB
  Министерство образования Российской Федерации Московская государственная юридическая академия Оренбургский институт Плотников Александр Иванович Теоретические основы квалификации преступлений Учебное пособие ...
16193. Господарське законодавство. Підручник 1.17 MB
  МІНІСТЕРСТВОМ ОСВІТИ І НАУКИ УКРАЇНИ Я.М. Пігач Л.М. Труфанова ГОСПОДАРСЬКЕ ЗАКОНОДАВСТВО Рекомендовано Міністерством освіти і науки України як навчальний посібник для студентів вищих навчальних закладів Киї...
16194. Тактика допроса. Учебное пособие 548.5 KB
  Питерцев Станислав Константинович Степанов Алексей Александрович Тактика допроса Серия Библиотека криминалиста 160 с.: ил. Серия Библиотека В. Усманов Г. Михайлова В. Земских А. Батлер Н. Бчржаков В. Зисссева М. Одинакова В. Зассеева Главный редактор Заведующи...
16195. Тактика допроса. Учебное пособие 526.5 KB
  Питерцев Станислав Константинович Степанов Алексей Александрович Тактика допроса Допрос является самым распространенным следственным действием. От него зависит судьба уголовного дела. Главной темой своей книги авторы избрали не традиционный уголовнопроцессуальн...