Раздел 5. Программное обеспечение информационных технологий
Раздел 5. Программное обеспечение информационных технологий
Технологии программирования
В процессе разработки программных систем используются различные технологии программирования. В соответствии с обычным значением слова “технология” под технологией программирования (programming technology) понимается совокупность производственных процессов, приводящая к созданию требуемого ПС, а также описание этой совокупности процессов. Другими словами, технология программирования понимается здесь в широком смысле как технология разработки программных средств, включая в нее все процессы, начиная с момента зарождения идеи этого средства до создания необходимой программной документации. Каждый процесс этой совокупности базируется на использовании каких-либо методов и средств, например, компьютера (в этом случае речь идет о компьютерной технологии программирования).
В литературе имеются и другие, несколько отличающиеся, определения технологии программирования. Используется в литературе и близкое к технологии программирования понятие программной инженерии, определяемой как систематический подход к разработке, эксплуатации, сопровождению и изъятию из обращения программных средств. Именно программной инженерии (software engineering) посвящена упомянутая работа [1.3]. Главное различие между технологией программирования и программной инженерией как дисциплинами для изучения заключается в способе рассмотрения и систематизации материала.
В технологии программирования акцент делается на изучении процессов разработки ПС (технологических процессов) и порядке их прохождения - методы и инструментальные средства разработки ПС используются в этих процессах, их применение и образуют технологические процессы. Тогда как в программной инженерии изучаются различные методы и инструментальные средства разработки ПС с точки зрения достижения определенных целей – эти методы и средства могут использоваться в разных технологических процессах (и в разных технологиях программирования).
Не следует также путать технологию программирования с методологией программирования. В технологии программирования методы рассматриваются “сверху” - с точки зрения организации технологических процессов, а в методологии программирования методы рассматриваются “снизу” - с точки зрения основ их построения. Например, в работе [1.9] методология программирования определяется как совокупность механизмов, применяемых в процессе разработки программного обеспечения и объединенных одним общим философским подходом.
В историческом аспекте в развитии технологии программирования можно выделить несколько этапов [ Гагарина].
1. Первый этап - “стихийное” программирование – отсутствие сформулированной технологии, когда программирование было, по сути, искусством. Этап охватывает период от появления первых ЭВМ до середины 60-х годов 20 века. Развитие программирования шло по пути замены машинных языков ассемблерами, а затем алгоритмическими языками (Fortran, Algol) и повторного использования подпрограмм, что повысило производительность труда программиста.
Стихийно использовалась разработка “снизу-вверх” – подход, при котором вначале проектировали и реализовывали сравнительно простые подпрограммы, из которых потом пытались построить сложную программу. В начале 60-х годов 20 века разразился кризис программирования. Он выражался в том, что фирмы превышали все сроки завершения программных проектов и их стоимость. В результате многие проекты так и не были завершены.
2. Второй этап – структурный подход к программированию. Этот подход сложился в 60 – 70 годы 20 века и представлял собой совокупность рекомендуемых технологических приемов, охватывающих все этапы разработки программного обеспечения. В основе структурного подхода лежит декомпозиция сложных систем с целью последующей реализации в виде отдельных небольших подпрограмм. В отличие от используемого ранее процедурного подхода к декомпозиции, структурный подход требовал представления задачи в виде иерархии подзадач простейшей структуры.
Проектирование осуществлялось “сверху-вниз” и подразумевало реализацию общей идеи, обеспечивая проработку интерфейсов подпрограмм. Вводились ограничения на конструкции алгоритмов, рекомендовались формальные модели их описания, а также специальный метод проектирования алгоритмов – метод пошаговой детализации. Поддержка принципов структурного программирования была заложена в основу процедурных языков программирования (PL/1, Algol-68, Pascal, C).
Появилась и начала развиваться технология модульного программирования, которая предполагает выделение групп подпрограмм, использующих одни и те же глобальные данные, в отдельно компилируемые модули. Практика показала, что структурный подход в сочетании с модульным программированием позволяет получить достаточно надежные программы, размер которых не превышает 100000 операторов [Л10 Гагарина]. Узким местом модульного программирования стали межмодульные интерфейсы, ошибки в которых трудно обнаружить по причине раздельной компиляции модулей (ошибки выявляются только при выполнении программы).
3. Третий этап – объектный подход к программированию. Сложился с середины 80-х до конца 90-х годов 20 века. Объектно-ориентированное программирование (ООП) определяется как технология создания сложного программного обеспечения, основанная на представлении программы в виде совокупности объектов, каждый из которых является экземпляром определенного типа (класса), а классы образуют иерархию с наследованием свойств. Взаимодействие программных объектов осуществляется путем передачи сообщений.
Основное достоинство объектно-ориентированного программирования по сравнению с модульным программированием – более естественная декомпозиция программного обеспечения, которая существенно облегчает его разработку. Кроме того, объектный подход предлагает новые способы организации программ, основанные на механизмах наследования, полиморфизма, композиции. Это позволяет существенно увеличить показатель повторного использования кодов и создавать библиотеки классов для различных применений.
Развитие объектного подхода в технологии программирования привело к созданию сред визуального программирования. Появились языки визуального объектно-ориентированного программирования, такие как Delphi, C++ Builder, Visual C++, C# и т. д. Однако технология ООП имеет и недостатки. Главный из них – зависимость модулей программного обеспечения от адресов экспортируемых полей и методов, структур и форматов данных. Эта зависимость объективна, так как модули должны взаимодействовать между собой, обращаясь, к ресурсам друг друга.
4. Четвертый этап – компонентный подход и CASE-технологии (с середины 90-х годов 20 века до нашего времени). Этот подход предполагает построение программного обеспечения из отдельных компонентов – физически отдельно существующих частей программного обеспечения, которые взаимодействуют между собой через стандартизованные двоичные интерфейсы. В отличие от обычных объектов объекты-компоненты можно собирать в динамически вызываемые библиотеки или исполняемые файлы, распространять в двоичном виде (без исходных текстов) и использовать в любом языке программирования, поддерживающем соответствующую технологию. В настоящее время рынок компонентов – реальность, поддерживаемая Интернетом и массовой рекламой и публикациями.
Основы компонентного подхода были разработаны компанией Microsoft, начиная с технологии OLE (Object Linking and Embedding – связывание и внедрение объектов), которая использовалась в ранних версиях Windows для создания составных документов. Ее развитием стало появление COM-технологии (Component Object Model – компонентная модель объектов), а затем ее распределенной версии – DCOM, на основе которых были разработаны компонентные технологии, решаются различные задачи разработки программного обеспечения.
Среди них следуют отметить OLE-automation – технологию создания программируемых приложений, обеспечивающую доступ к внутренним службам этих приложений. На основе OLE-automation создана технология ActiveX, предназначенная для создания программного обеспечения, как сосредоточенного на одном компьютере, так и распределенного. Безопасность и стабильная работа распределенных приложений обеспечивается еще двумя технологиями, заложенными в COM. Это – MTS (Multitier Distributed Application Sever- сервер многозвенных распределенных приложений) и MTS (Microsoft Transaction Server) – сервер управления транзакциями.
Компонентный подход лежит также в основе технологии CORBA (Common Object Request Bracer Architecture – общая архитектура с посредником обработки запросов объектов). Эта технология, реализующая подход, аналогичный COM, разработана группой компаний OMC (Object Management Group – группа внедрения объектной технологии программирования). Программное ядро CORBA реализовано для всех основных аппаратных и программных платформ и обеспечивает создание программного обеспечения в гетерогенной вычислительной среде.
Важнейшая особенность современного этапа технологии программирования - широкое использование компьютерных технологий создания и сопровождения программных систем на всех этапах их жизненного цикла. Эти технологии получили название CASE-технологий (Computer-Aided Software/System engineering – разработка программного обеспечения/программных систем с использованием компьютерной поддержки). Сегодня существуют CASE-технологии, поддерживающие как структурный, так и объектный, в том числе, компонентный подходы к программированию.
1.3.Качество и характеристики программного обеспечения
Рассматривая, оценивая и анализируя программные системы и отдельные программы, останавливаются на показателях качества программ и их основных характеристиках. Качество ПО - это совокупность свойств, определяющих полезность изделия (программы) для пользователей в соответствии с функциональным назначением и предъявлёнными требованиями. Характеристика качества программы - понятие, отражающее отдельные факторы, влияющие на качество программ и поддающиеся измерению.
Критерий качества - численный показатель, характеризующий степень, в которой программе присуще оцениваемое свойство. Критерии качества могут включать множество различных характеристик: экономичность, документированность, гибкость, модульность, надёжность, обоснованность, тестируемость, ясность, точность, модифицируемость, эффективность, легкость сопровождения и т.д.
Для измерения характеристик и критериев качества используют метрики. Метрика качества программ – это система измерений качества программ. Эти измерения могут проводиться на уровне критериев качества программ или на уровне отдельных характеристик качества. В первом случае система измерений позволяет непосредственно сравнивать программы по качеству. При этом сами измерения не могут быть проведены без субъективных оценок свойств программ. Во втором случае измерения характеристик можно выполнить объективно и достоверно, но оценка качества ПО в целом будет связана с субъективной интерпретацией получаемых оценок.
Каждое ПС должно выполнять определенные функции, т.е. делать то, что задумано. Хорошее ПС должно обладать еще целым рядом свойств, позволяющим успешно его использовать в течение длительного периода, т.е. обладать определенным качеством. Качество (quality) ПС - это совокупность его характеристик, которые влияют на его способность удовлетворять заданные потребности пользователей [3.6]. Это не означает, что разные ПС должны обладать одной и той же совокупностью таких свойств в их наивысшей степени. Этому препятствует тот факт, что повышение качества ПС по одному из таких свойств часто может быть достигнуто лишь ценой изменения стоимости, сроков завершения разработки и снижения качества этого ПС по другим его свойствам. Качество ПС является удовлетворительным, когда оно обладает указанными свойствами в такой степени, чтобы гарантировать успешное его использование.
Совокупность свойств ПС, которая образует удовлетворительное для пользователя качество ПС, зависит от условий и характера эксплуатации этого ПС, т.е. от позиции, с которой должно рассматриваться качество этого ПС. Поэтому при описании качества ПС, прежде всего, должны быть фиксированы критерии отбора требуемых свойств ПС. В настоящее время критериями качества ПС (criteria of software quality) принято считать:
1) функциональность, способность ПС выполнять набор функций, удовлетворяющих заданным или подразумеваемым потребностям пользователей. Набор указанных функций определяется во внешнем описании ПС;
2) надежность – устойчивость, точность выполнения предписанных функций обработки, возможность диагностики возникающих ошибок. Надежность (reliability) ПС - это его способность безотказно выполнять определенные функции при заданных условиях в течение заданного периода времени с достаточно большой вероятностью. При этом под отказом в ПС понимают проявление в нем ошибки. Таким образом, надежное ПС не исключает наличия в нем ошибок - важно лишь, чтобы эти ошибки при практическом применении этого ПС в заданных условиях проявлялись достаточно редко. Убедиться, что ПС обладает таким свойством можно при его испытании путем тестирования, а также при практическом применении.
3) легкость применения, это характеристики ПС, которые позволяют минимизировать усилия пользователя по подготовке исходных данных, применению ПС и оценке полученных результатов, а также вызывать положительные эмоции определенного или подразумеваемого пользователя. Сюда следует также отнести дружественный интерфейс, контекстно-зависимую подсказку, хорошую документацию;
4) эффективность - это отношение уровня услуг, предоставляемых ПС пользователю при заданных условиях, к объему используемых ресурсов.
5) сопровождаемость, модифицируемость – это характеристики ПС, которые позволяют минимизировать усилия по внесению изменений для устранения в нем ошибок и по его модификации в соответствии с изменяющимися потребностями пользователей, переходу на новые версии и т.п.;
6) мобильность (многоплатформенность) – независимость от технического комплекса вычислительных средств, операционной системы, сетевых возможностей, специфики предметной области задачи и т.д.;
7) коммуникативность - степень возможной интеграции с другими программами, обеспечение обмена данными между программами.
Во многих случаях функциональность и надежность являются обязательными критериями качества ПС, причем обеспечение надежности красной нитью проходит по всем этапам и процессам разработки ПС. Остальные критерии используются в зависимости от потребностей пользователей в соответствии с требованиями к ПС.
К основным характеристикам программ и программных систем относится сложность программной системы. При оценке сложности программ, как правило, выделяют три основные группы метрик:
1) метрики размера программ,
2) метрики сложности потока управления программ,
3) метрики сложности потока данных программ.
Оценки первой группы наиболее просты и, очевидно, поэтому получили широкое распространение. Традиционной характеристикой размера программ является количество строк исходного текста. Под строкой понимается любой оператор программы, поскольку именно оператор, а не отдельно взятая строка является тем интеллектуальным "квантом" программы, опираясь на который можно строить метрики сложности ее создания.
Непосредственное измерение размера программы, несмотря на свою простоту, дает хорошие результаты. Конечно, оценка размера программы недостаточна для принятия решения о ее сложности, но вполне применима для классификации программ, существенно различающихся объемами. При уменьшении различий в объеме программ на первый план выдвигаются оценки других факторов, оказывающих влияние на сложность. Таким образом, оценка размера программы есть оценка по номинальной шкале, на основе которой определяются только категории программ без уточнения оценки для каждой категории.
К группе оценок размера программ можно отнести также и метрику Холстеда. Основу метрики Холстеда составляют четыре измеряемых характеристики программы:
n1 - число уникальных операторов программы, включая символы-разделители, имена процедур и знаки операций (словарь операторов);
n2 - число уникальных операндов программы (словарь операндов);
N1 - общее число операторов в программе;
N2 - общее число операндов в программе.
Опираясь на эти характеристики, получаемые непосредственно при анализе исходных текстов программ, М. Холстед вводит следующие оценки:
словарь программы n1=n1+n2,
длину программы N=N1+N2, (1)
объем программы V=N*log2(n) (бит). (2)
Под битом подразумевается логическая единица информации - символ, оператор, операнд.
Далее М. Холстед вводит n* - теоретический словарь программы, т.е. словарный запас, необходимый для написания программы, с учетом того, что необходимая функция уже реализована в данном языке и, следовательно, программа сводится к вызову этой функции. Используя n*, Холстед вводит оценку V*:
V* = n* * log2 n*, (3)
с помощью которой описывается потенциальный объем программы, соответствующий максимально компактному тексту программы, реализующей данный алгоритм.
Вторая наиболее представительная группа оценок сложности программ - метрики сложности потока управления программ. Как правило, с помощью этих оценок оперируют либо плотностью управляющих переходов внутри программ, либо взаимосвязями этих переходов. И в том и в другом случае стало традиционным представление программ в виде управляющего ориентированного графа G = (V,E), где V - вершины, соответствующие операторам, а E - дуги, соответствующие переходам.
Впервые графическое представление программ было предложено Маккейбом. Основной метрикой сложности он предлагает считать цикломатическую сложность графа программы, или, как ее еще называют, цикломатическое число Маккейба, характеризующее трудоемкость тестирования программы.
Для вычисления цикломатического числа Маккейба Z(G) применяется формула
Z(G) = e – v + 2p,
где e - число дуг ориентированного графа G;
v - число вершин;
p - число компонентов связности графа.
Число компонентов связности графа можно рассматривать как количество дуг, которые необходимо добавить для преобразования графа в сильно связный. Cильно связным называется граф, любые две вершины которого взаимно достижимы. Для графов корректных программ, т. е. графов, не имеющих недостижимых от точки входа участков и "висячих" точек входа и выхода, сильно связный граф, как правило, получается путем замыкания дугой вершины, обозначающей конец программы, на вершину, обозначающую точку входа в эту программу.
Одной из наиболее простых, но, как показывает практика, достаточно эффективных оценок сложности программ является метрика Т. Джилба, в которой логическая сложность программы определяется как насыщенность программы выражениями типа IF-THEN-ELSE. При этом вводятся две характеристики: CL - абсолютная сложность программы, характеризующаяся количеством операторов условия; cl - относительная сложность программы, характеризующаяся насыщенностью программы операторами условия, т. е. cl определяется как отношение CL к общему числу операторов.
Другая группа метрик сложности программ – метрики сложности потока данных, т.е. использования, конфигурации и размещения данных в программах. Рассмотрим метрику, связывающую сложность программ с обращениями к глобальным переменным.
Пара "модуль, глобальная переменная" обозначается как (p,r), где p - модуль, имеющий доступ к глобальной переменной r. В зависимости от наличия в программе реального обращения к переменной r формируются два типа пар "модуль, глобальная переменная": фактические и возможные. Возможное обращение к r с помощью p показывает, что область существования r включает в себя p.
Характеристика Aup говорит о том, сколько раз модули up действительно получали доступ к глобальным переменным, а число Pup - сколько раз они могли бы получить доступ. Отношение числа фактических обращений к возможным определяется как Rup = Aup/Pup. Эта формула показывает приближенную вероятность ссылки произвольного модуля на произвольную глобальную переменную. Очевидно, чем выше эта вероятность, тем выше вероятность "несанкционированного" изменения какой-либо переменной, что может существенно осложнить работы, связанные с модификацией программы.
Кроме метрик сложности программ, используются метрики стилистики и понятности программ. Наиболее простой метрикой стилистики и понятности программ является оценка уровня комментированности программы F:
F = Nком / Nстр, (4)
где Nком - количество комментариев в программе; Nстр - количество строк или операторов исходного текста.
Таким образом, метрика F отражает насыщенность программы комментариями. Исходя из практического опыта, принято считать, что F >= 0.1, т. е. на каждые десять строк программы должен приходиться минимум один комментарий. Как показывают исследования, комментарии распределяются по тексту программы неравномерно: в начале программы их избыток, а в середине или в конце - недостаток. Это объясняется тем, что в начале программы, как правило, расположены операторы описания идентификаторов, требующие более "плотного" комментирования. Кроме того, в начале программы также расположены "шапки", содержащие общие сведения об исполнителе, характере, функциональном назначении программы и т. п. Такая насыщенность компенсирует недостаток комментариев в теле программы, и поэтому формула (4) недостаточно точно отражает комментированность функциональной части текста программы.
К другим характеристикам программ следует отнести:
1) состав функций обработки информации, определенный функциональными требованиями к программной системе;
2) объем файлов, используемых программной системой;
3) требования к операционной системе и компьютерной технике и др.
1.4.Варианты использования и распространения программных продуктов
Все программы по характеру использования и категориям пользователей можно разделить на два класса – утилитарные программы и программные продукты. Первые предназначены для удовлетворения нужд их разработчиков (программы для себя) и не предназначены для широкого распространения. Вторые (программные продукты) используются для удовлетворения потребностей пользователей, широкого распространения и продажи.
Существует большое количество различных компаний, занимающиеся разработкой проприетарного программного обеспечения (proprietary software). Этим термином обозначают программное обеспечение, которое имеет собственника, осуществляющего контроль над этим программным обеспечением и определяющего собственные лицензионные соглашения по использованию программного продукта. Наиболее типичными ограничениями проприетарного ПО являются:
1) ограничение на коммерческое использование. Существует большое количество проприетарных программных продуктов, которое можно использовать бесплатно в некоммерческих целях для частных лиц, медицинских и учебных заведений, для некоммерческих организаций и т.д. Такое программное обеспечение очень популярно и широко используется, а за счёт своей бесплатности имеет хорошую техническую поддержку со стороны специалистов, у которых отсутствует необходимость дополнительных затрат на обучение;
2) ограничение на распространение. Этот вид ограничений сопровождает обычно крупные программные проекты, когда правообладатель требует оплаты за каждую копию программы. Обычно с таким ограничением используются программные продукты, ориентированные на узкий «профессиональный» сегмент рынка или у программного обеспечения, требующегося большому числу пользователей. Примером может служить пакет программ Adobe CS3 или операционная система Microsoft Windows XP;
3) ограничение на модификацию. Этот вид ограничения используется только в программных пакетах с закрытыми исходными кодами и может запрещать или ограничивать любую модификацию программного кода, дизассемблирование и декомпиляцию.
В настоящее время существуют и другие варианты легального распространения программных продуктов, которые появились с использованием Интернета:
1) freeware – бесплатные, свободно распространяемые программы. Очень много серьезных компаний писали, пишут и будут писать freeware-программы. Дело в том, что freeware – прекрасный инструмент в продвижении новых технологий и продуктов. Например, всем известна программа общения ICQ. Это популярный бесплатный продукт, который имеет очень сильные позиции в сравнении с платными программами. Некоторые shareware-программы становятся бесплатными. Всем известный мультимедиапроигрыватель Winamp первоначально был shareware-программой стоимостью в $10. Однако после того, как сайт winamp.com стал привлекать большое количество посетителей, разработчики, получая солидные доходы от рекламы, решили сделать свой продукт бесплатным, еще больше увеличив его популярность и свои кошельки;
2) shareware – условно-бесплатные программы. Употребляется и еще одно наименование этого типа ПО ”пробное” (trial). Основное достоинство shareware “попробуй, прежде чем купить” (try before you buy). Пользователю предоставляется продукт с некоторыми ограничениями, пока он его не приобретет. Ограничения могут быть функциональными и/или временными (чаще всего программа работает 30 дней или определенное количество запусков). Если пользовать решает, что это программа ему нужна, он должен зарегистрироваться, заплатив автору определенную сумму. В противном же случае обязан прекратить использование программы и удалить ее со своего компьютера;
3) public domain software - очень похожие на freeware программы. Распространяются бесплатно. Однако, в отличие от freeware, где автор программы имеет все права на программу, в случае с public domain у него эти права отсутствуют. Программа распространяется вместе с исходным кодом, и автор отказывается от своих прав. Главной идеей было развитие программы в дальнейшем. Однако в силу того, что программа была “ничья”, кто угодно мог слегка модифицировать код, откомпилировать и распространять ее как платную. По этой причине таких программ в настоящее время просто не найти;
4) open source. Представляет собой развитие концепции public domain software, в которой учтены ошибки этого варианта. Программа, как и раньше, распространяется на бесплатной основе вместе с исходным кодом. Однако автор уже не отказывается от своих прав. Существует система требований к лицензии на программный продукт, который называется The Open Source Definition (OSD), которая представлена на сайте. К программе обязательно должен быть приложен исходный код. Модифицированное ПО должно распространяться на тех же условиях, что и исходный продукт. Автор исходного продукта даже имеет право требовать, чтобы исходный код его программы распространялся без изменений, но в комплекте с соответствующими модифицирующими исправлениями.
Существуют и другие, можно сказать экзотические варианты распространения программ. К ним можно отнести:
1) adware. К этой категории относятся программы, которые во время своей работы демонстрируют пользователю рекламу, обычно графические баннеры размером 468x60 точек. Adware сочетает в себе freeware и shareware. С одной стороны, пользователь не обязан оплачивать программу, и может ею пользоваться сколь угодно долго, с другой, у него есть стимул оплатить программу, ведь в этом случае он избавится от баннера, который так долго его нервирует. Наибольшее развитие этот тип получил в программах, которые работают в Интернете, ведь именно оттуда скачивается новая реклама. Например, браузеры, download-менеджеры и программы дозвона;
2) donationware. Такое ПО также распространяются бесплатно, однако разработчик программы в лицензионном соглашении указывает, что, если пользователю программа нравится, то он может (а не обязан) выслать денежное вознаграждение. К сожалению, как показывает практика, пользователи очень вяло реагируют на такие просьбы и очень редко высылают деньги.
Ряд производителей использует OEM-программы (Original Equipment Manu-facturer), т.е. встроенные программы, устанавливаемые на компьютеры или поставляемые вместе с компьютером.
Программный продукт должен быть соответствующим образом подготовлен к эксплуатации (отлажен), иметь необходимую техническую документацию, предоставлять сервис и гарантию надежной работы программы, иметь товарный знак изготовителя, а также наличие кода государственной регистрации.
МВМ имеют мощный потенциал для реструктуризации существующих программных систем в целях повышения уровня защиты, а также облегчают развитие новых подходов к построению безопасных систем. Сегодняшние ОС не обеспечивают надежной изоляции, оставляя машину почти беззащитной. Перемещение механизмов защиты за пределы ВМ (чтобы они выполнялись параллельно с ОС, но были изолированы от нее) позволяет сохранить их функциональные возможности и повысить устойчивость к нападениям.
Размещение средств безопасности за пределами ВМ – привлекательный способ изоляции сети. Доступ к сети предоставляется ВМ после проверки, гарантирующей, что она, с одной стороны, не представляет угрозы, а с другой — неуязвима для нападения. Управление доступом к сети на уровне ВМ превращает виртуальную машину в мощный инструмент борьбы с распространением злонамеренного кода.
Мониторы МВМ особенно интересны в плане управления многочисленными группами программ с различными уровнями безопасности. Благодаря отделению ПО от оборудования ВМ обеспечивают максимальную гибкость при поиске компромисса между производительностью, обратной совместимостью и степенью защиты. Изоляция программного комплекса в целом упрощает его защиту. В сегодняшних ОС почти невозможно судить о безопасности отдельного приложения, поскольку процессы плохо изолированы от друг друга. Таким образом, безопасность приложения зависит от безопасности всех остальных приложений на машине.
Гибкость управления ресурсами, которую обеспечивают МВМ, может сделать системы более стойкими к нападениям. Возможность быстро тиражировать ВМ и динамически адаптироваться к большим рабочим нагрузкам станет основой мощного инструмента, позволяющего справиться с нарастающими перегрузками из-за внезапного наплыва посетителей на Web-сайте или атаки типа «отказ в обслуживании».
Модель распространения программных продуктов на основе ВМ потребует от поставщиков ПО корректировки лицензионных соглашений. Лицензии на эксплуатацию на конкретном процессоре или физической машине не приживутся в новых условиях, в отличие от лицензий на число пользователей или неограниченных корпоративных лицензий. Пользователи и системные администраторы будут отдавать предпочтение операционным средам, которые легко и без особых затрат распространяются в виде виртуальных машин.
Возрождение МВМ существенно изменило представления разработчиков программных и аппаратных средств о структурировании сложных компьютерных систем и управлении ими. Кроме того, МВМ обеспечивают обратную совместимость при развертывании инновационных решений в области операционных систем, которые позволяют решать современные задачи, сохраняя предыдущие достижения. Эта их способность станет ключевой при решении грядущих компьютерных проблем.
Компании все чаще отказываются от стратегии развития, основанной на закупке отдельных машин и увязке их в сложные программные системы с обилием межкомпонентных связей. Мониторы МВМ дают этим неустойчивым, плохо управляемым системам новую свободу. В ближайшие годы ВМ выйдут далеко за рамки простого предоставления ресурсов и перешагнут пороги машинных залов, чтобы стать фундаментальными строительными блоками для обеспечения мобильности, безопасности и практичности настольных ПК. Несомненно, МВМ станут важной частью вечно меняющегося компьютерного мира.
Виртуализация предоставляет также преимущества для сред разработки и тестирования ПО. Различные этапы цикла создания ПО, включая получение рабочей версии, можно выполнять в разных виртуальных разделах одной и той же платформы. Это поможет повысить степень полезного использования аппаратного обеспечения и упростить управление жизненным циклом. Во многих случаях IT-организации получат возможность тестировать новые и модернизированные решения на имеющихся рабочих платформах, не прерывая производственный процесс. Это не только упрощает миграцию, но также позволяет сократить расходы, устранив необходимость дублирования вычислительной среды.
Освобождая разработчиков и пользователей от ресурсных ограничений и недостатков интерфейса, виртуальные машины снижают уязвимость системы, повышают мобильность программного обеспечения и эксплуатационную гибкость аппаратной платформы.
Компьютерные системы существуют и продолжают развиваться благодаря тому, что разработаны по законам иерархии и имеют хорошо определенные интерфейсы, отделяющие друг от друга уровни абстракции. Использование таких интерфейсов облегчает независимую разработку аппаратных и программных подсистем силами разных групп специалистов. Абстракции скрывают детали реализации нижнего уровня, уменьшая сложность процесса проектирования.
Подсистемы и компоненты, разработанные по спецификациям разных интерфейсов, не способны взаимодействовать друг с другом. Например, приложения, распространяемые в двоичных кодах, привязаны к определенной ISA и зависят от конкретного интерфейса к операционной системе. Несовместимость интерфейсов может стать сдерживающим фактором, особенно в мире компьютерных сетей, в котором свободное перемещение программ столь же необходимо, как и перемещение данных.
Виртуализация позволяет обойти эту несовместимость. Виртуализация системы или компонента (например, процессора, памяти или устройства ввода/вывода) на конкретном уровне абстракции отображает его интерфейс и видимые ресурсы на интерфейс и ресурсы реальной системы. Следовательно, реальная система выступает в роли другой, виртуальной системы или даже нескольких виртуальных систем.
В отличие от абстракции, виртуализация не всегда нацелена на упрощение или сокрытие деталей. Например, при отображении виртуальных дисков на реальный программные средства виртуализации используют абстракцию файла как промежуточный шаг. Операция записи на виртуальный диск преобразуется в операцию записи в файл (и, следовательно, в операцию записи на реальный диск). Отметим, что в данном случае никакого абстрагирования не происходит – уровень детализации интерфейса виртуального диска (адресация секторов и дорожек) ничем не отличается от уровня детализации реального диска.
Языки программирования
Инструментальное программное обеспечение (ПО) или системы программирования предназначены для автоматизации разработки новых программ на языке программирования. Язык программирования можно определить как формальную знаковую систему, предназначенную для записи программ, задающих алгоритм в форме, понятной для исполнителя (например, компьютера). Язык программирования определяет набор лексических, синтаксических и семантических правил, используемых при составлении компьютерной программы. Он позволяет программисту точно определить то, на какие события будет реагировать компьютер, как будут храниться и передаваться данные, а также какие именно действия следует выполнять над этими данными при различных обстоятельствах.
Со времени создания первых программируемых машин человечество придумало уже более восьми с половиной тысяч языков программирования [1 http://ru.wikipedia.org/wiki/]. Каждый год их число пополняется новыми языками. Некоторыми языками умеет пользоваться только небольшое число их собственных разработчиков, другие становятся извест