скачать рефераты

МЕНЮ


Базовые сведения о надежности информационных технологий управления

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

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

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

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

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

Надежная программа должна обладать двумя основными свойствами:

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

Такое свойство программы назовем безошибочностью.

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

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

Такое свойство программы назовем помехоустойчивостью.

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

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

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

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


Технологии повышения безошибочности программ


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

К первой группе методов относятся, в частности:

·        использование принципов модульного программирования;

·        использование принципов структурного программирования;

·        применение языков высокого уровня;

·        повышение уровня непроцедурности программы;

·        методы синтеза программ по спецификациям и методы автоматического доказательства программ.

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

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

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

Технологии, применяемые при подготовке программы

·        Модульное программирование предполагает, что программа разбивается на отдельные части-модули, причем разбиение должно в той или иной мере удовлетворять требованиям, среди которых отметим:

·        ограничение размера модуля (обычно, в пределах 20-100 операторов);

·        семантическое выделение в отдельные модули (неформальная функционально-структурная декомпозиция);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Непроцедурность программ позволяет уйти от подобного (а значит, чреватого ошибками) расписывания последовательности действий для выполнения того или иного фрагмента программы. Непроцедурное программирование фрагмента означает задание спецификаций входа и выхода этого фрагмента без указания алгоритма преобразования. Иначе говоря, программист оговаривает, ЧТО НАДО СДЕЛАТЬ, не указывая КАК НАДО СДЕЛАТЬ. Реализация фрагмента по его спецификациям выполняется автоматически. Сама программа при этом не меняется. Примером метода повышения непроцедурности может служить использование макросредств - механизма получения открытых подпрограмм, настроенных на значения параметров. Другой пример - использование объектно-ориентированных языков. Предварительная и независимая отлаженность стандартных алгоритмов, привлекаемых для расшифровки спецификаций, позволяет повысить безошибочность подготовленной программы.

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

Технологии отладка программ

Одна из аксиом программирования гласит: Любая нетривиальная программа содержит хотя бы одну ошибку. Практика показывает справедливость этой аксиомы. Как бы хорошо ни была подготовлена программа, какие бы методы ни применялись при построении программы, следует исходить из "презумпции виновности".

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

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

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

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

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

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

Представим отладку программы в виде контура управления, в котором объектом управления является отлаживаемая программа Р. Целью такой системы является повышение уровня безошибочности программы.

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


 







Рис. 4.12. Схема отладки


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

Таким образом, блоки М и А олицетворяют анализ, а блок С - внесение изменений.

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

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

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

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

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

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

Технологии повышения помехоустойчивости программ

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

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

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

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

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

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

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

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

Наиболее распространенные методы повышения помехоустойчивости программ используют различные виды избыточности:

·  временную, поскольку для реализаций методов требуются дополнительное машинное время;

·  информационную, поскольку для проведения контроля необходима дополнительная информация;

·  программную, поскольку реализация методов программная;

·  эргатическую, поскольку не всегда удается устранить помеху автоматически; в этих случаях может помочь только вмешательство человека.

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

Повторение выполнения

Чаще всего применяются программистами такие два способа повторения выполнения фрагментов - двойной счет и контрольные точки.

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

Здесь мы опять встречаемся с контуром управления. Объектом управления в таком контуре является фрагмент программы. Цель контура - достижение высокой достоверности решения ценой потери времени.

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

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

Сам способ заключается в том, что в программе расставляются так называемые контрольные точки, в которые помещается обращение к процедуре "фотографирования" оперативной памяти во внешнюю память. Контрольные точки расставляются таким образом, чтобы время выполнения программы между контрольными точками было в пределах 5-10 минут. Если в какой-то момент в промежутке между контрольными точками произошел сбой оборудования или появилась какая-либо помеха, не позволяющая ожидать достоверный результат решения, то программу можно запустить не с самого начала, потеряв все время решения, а с предыдущей контрольной точки, предварительно восстановив соответствующее состояние оперативной памяти с магнитной ленты. Потеряно будет практически только время, прошедшее после организации соответствующей контрольной точки.

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

Технологии защиты от проникновения помехи

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

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

Программирование с защитой от помех обычно отнимает слишком много времени при подготовке программы (по некоторым оценкам, больше 20%).

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

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

Технологии фильтрации

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

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

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

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

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

Реакция на некорректность контролируемой величины может быть разной:

·        сообщение об ошибке;

·        замена некорректного значения стандартным значением;

·        замена ближайшим (по некоторому критерию) значением;

·        обращение к подпрограмме пользователя;

·        прекращение вычислений и т.д.

В любом случае реакция на некорректность должна быть предусмотрена заранее при составлении спецификации величины.

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

·  имя фильтруемого объекта или значение объекта;

·  спецификацию объекта;

·  точку пуска фильтрации.

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

Фильтры, проверяющие переменные величины, включаются в саму программу процессорами подготовки программ: трансляторами, макрогенераторами. Здесь могут быть два варианта:

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

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

Постоянное возрастание объемов и сложности производимого программного обеспечения выдвигает проблему повышения надежности программного обеспечения в ряд основных проблем разработки программных средств.

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


 


[1] Если для АСУ сформулирована составная функция наиболее общего вида, то соответствующая ей функциональная подсистема совпадает с системой в целом.

[2] Энтропия (от греч. entropía - поворот, превращение), понятие, впервые введенное в термодинамике для определения меры необратимого рассеяния энергии. Энтропия широко применяется и в других областях науки: в статистической физике как мера вероятности осуществления какого-либо макроскопического состояния; в теории информации как мера неопределенности какого-либо опыта (испытания), который может иметь разные исходы. Эти трактовки энтропии имеют глубокую внутреннюю связь. Например, на основе представлений об информационной энтропии можно вывести все важнейшие положения статистической физики.

В термодинамике понятие "энтропия" было введено Р. Клаузиусом (1865), который показал, что процесс превращения теплоты в работу следует общей физической закономерности - второму началу термодинамики. Его можно сформулировать строго математически, если ввести особую функцию состояния - энтропию.

[3] Парадигма (от гр. пример, образец) — теория (или модель, тип постановки проблемы), принятая в качестве образца решения исследовательских задач

[4] Декомпозиция - расчленение исходной системы на относительно обособленные части


Страницы: 1, 2, 3, 4, 5, 6


Copyright © 2012 г.
При использовании материалов - ссылка на сайт обязательна.