Абстракция (информатика)
В обеспечения и информатике разработке программного абстракция — это процесс обобщения конкретных деталей. [1] такие как атрибуты , от изучения объектов и систем, чтобы сосредоточить внимание на более важных деталях. [2] Абстракция — фундаментальная концепция в информатике и разработке программного обеспечения , особенно в парадигме объектно-ориентированного программирования . [3] Примеры этого включают:
- использование абстрактных типов данных для отделения использования от рабочих представлений данных в программах ; [4]
- концепция функций или подпрограмм, которые представляют собой конкретный способ реализации потока управления ;
- процесс реорганизации общего поведения групп неабстрактных классов в абстрактные классы с использованием наследования и подклассов , как это видно в объектно-ориентированных языках программирования.
Обоснование [ править ]
Суть абстракции заключается в сохранении информации, актуальной в данном контексте, и забвении информации, нерелевантной в этом контексте.
Вычисления в основном работают независимо от конкретного мира. Аппаратное обеспечение реализует модель вычислений , взаимозаменяемую с другими. [6] Программное обеспечение имеет архитектуру , позволяющую людям создавать огромные системы, концентрируясь на нескольких задачах одновременно. Эти архитектуры состоят из определенного выбора абстракций. Десятое правило Гринспана — это афоризм о том, что такая архитектура одновременно неизбежна и сложна.
Языковая абстракция — центральная форма абстракции в вычислительной технике: разрабатываются новые искусственные языки для выражения конкретных аспектов системы. Языки моделирования помогают в планировании. Компьютерные языки можно обрабатывать с помощью компьютера. Примером этого процесса абстракции является поколенческое развитие языка программирования от машинного языка до языка ассемблера и языка высокого уровня . Каждый этап может быть использован в качестве трамплина для следующего этапа. Языковая абстракция продолжается, например, в языках сценариев и предметно-ориентированных языках программирования .
Некоторые функции языка программирования позволяют программисту создавать новые абстракции. К ним относятся подпрограммы , модули , полиморфизм и программные компоненты . Некоторые другие абстракции, такие как шаблоны проектирования программного обеспечения и архитектурные стили, остаются невидимыми для переводчика и действуют только при проектировании системы.
Некоторые абстракции пытаются ограничить диапазон понятий, которые должен знать программист, полностью скрывая абстракции, на которых они построены. Инженер-программист и писатель Джоэл Спольски раскритиковал эти усилия, заявив, что все абстракции негерметичны – что они никогда не смогут полностью скрыть детали ниже; [7] однако это не отменяет полезности абстракции.
Некоторые абстракции предназначены для взаимодействия с другими абстракциями — например, язык программирования может содержать интерфейс внешней функции для выполнения вызовов языка более низкого уровня.
Особенности абстракции [ править ]
Языки программирования [ править ]
Различные языки программирования предоставляют разные типы абстракции в зависимости от предполагаемого применения языка. Например:
- В объектно-ориентированных языках программирования, таких как C++ , Object Pascal или Java , концепция абстракции сама по себе стала декларативным утверждением — с использованием синтаксиса
function(parameters) = 0;
(в C++ ) или ключевые словаabstract
[8] иinterface
[9] (на Яве ). После такого объявления программист несет ответственность за реализацию класса для создания экземпляра объекта объявления. - Языки функционального программирования обычно демонстрируют абстракции, связанные с функциями, такие как лямбда-абстракции (преобразование термина в функцию некоторой переменной) и функции более высокого порядка (параметры — это функции).
- Современные члены семейства языков программирования Lisp, такие как Clojure , Scheme и Common Lisp, поддерживают макросистемы , позволяющие синтаксическую абстракцию. Другие языки программирования, такие как Scala, также имеют макросы или очень похожие функции метапрограммирования (например, в Haskell есть Template Haskell , а в OCaml — MetaOCaml ). Они могут позволить программисту исключить шаблонный код , абстрагироваться от утомительных последовательностей вызовов функций, реализовать новые структуры потока управления и реализовать доменно-специфические языки (DSL) , которые позволяют выражать концепции, специфичные для предметной области, краткими и элегантными способами. Все это, при правильном использовании, повышает как эффективность работы программиста, так и ясность кода, делая намеченную цель более явной. Следствием синтаксической абстракции также является то, что любой диалект Лиспа и фактически почти любой язык программирования в принципе может быть реализован на любом современном Лиспе со значительно меньшими (но в большинстве случаев все же нетривиальными) усилиями по сравнению с «более традиционным» языки программирования, такие как Python , C или Java .
Методы спецификации [ править ]
Аналитики разработали различные методы формальной спецификации программных систем. Некоторые известные методы включают в себя:
- Метод на основе абстрактных моделей (VDM, Z);
- Алгебраические методы (Larch, CLEAR, OBJ, ACT ONE, CASL);
- Процессные методики (LOTOS, SDL, Эстель);
- Трассировочные методы (СПЕЦИАЛЬНЫЕ, ТАМ);
- Методы, основанные на знаниях (Refine, Gist).
Языки спецификации [ править ]
Языки спецификаций обычно полагаются на абстракции того или иного типа, поскольку спецификации обычно определяются в проекте раньше (и на более абстрактном уровне), чем конечная реализация. Например, язык спецификации UML позволяет определять абстрактные классы, которые в водопадном проекте остаются абстрактными на этапах архитектуры и спецификации проекта.
Абстракция управления [ править ]
Языки программирования предлагают абстракцию управления как одну из основных целей своего использования. Компьютерные машины понимают операции на очень низком уровне, такие как перемещение некоторых битов из одного места памяти в другое и создание суммы двух последовательностей битов. Языки программирования позволяют сделать это на более высоком уровне. Например, рассмотрим этот оператор, написанный в стиле Паскаля :
a := (1 + 2) * 5
Человеку это кажется довольно простым и очевидным расчетом ( «один плюс два — три, умножить на пять — пятнадцать» ). Однако шаги низкого уровня, необходимые для выполнения этой оценки и возврата значения «15», а затем присвоения этого значения переменной «a», на самом деле довольно тонкие и сложные. Значения необходимо преобразовать в двоичное представление (часто это гораздо более сложная задача, чем можно было бы подумать), а вычисления разложить (компилятором или интерпретатором) на ассемблерные инструкции (опять же, которые гораздо менее интуитивно понятны программисту: такие операции, как сдвиг двоичного регистра влево или добавление двоичного дополнения содержимого одного регистра к другому — это просто не то, как люди думают об абстрактных арифметических операциях сложения или умножения). Наконец, присвоение результирующего значения «15» переменной с меткой «a», чтобы «a» можно было использовать позже, включает в себя дополнительные «закулисные» шаги по поиску метки переменной и ее результирующего местоположения в физическом мире. или виртуальную память, сохраняя двоичное представление «15» в этой ячейке памяти и т. д.
Без абстракции управления программисту пришлось бы указывать все шаги регистрового/двоичного уровня каждый раз, когда он просто хотел сложить или умножить пару чисел и присвоить результат переменной. Такое дублирование усилий имеет два серьезных негативных последствия:
- это заставляет программиста постоянно повторять довольно распространенные задачи каждый раз, когда требуется подобная операция
- он заставляет программиста программировать для конкретного оборудования и набора команд
Структурное программирование [ править ]
Структурированное программирование предполагает разделение сложных программных задач на более мелкие части с четким управлением потоками и интерфейсами между компонентами, а также снижение потенциальной сложности для побочных эффектов.
В простой программе это может быть направлено на то, чтобы циклы имели единственную или очевидную точку выхода и (где это возможно) имели единственную точку выхода из функций и процедур.
В более крупной системе это может включать разбиение сложных задач на множество различных модулей. Рассмотрим систему расчета заработной платы на судах и в береговых офисах:
- Самый верхний уровень может содержать меню типичных операций конечного пользователя.
- Внутри него могут быть автономные исполняемые файлы или библиотеки для таких задач, как регистрация и увольнение сотрудников или печать чеков.
- Внутри каждого из этих автономных компонентов может быть множество разных исходных файлов, каждый из которых содержит программный код для решения части проблемы, при этом для других частей программы доступны только выбранные интерфейсы. Программа входа в систему может иметь исходные файлы для каждого экрана ввода данных и интерфейса базы данных (который сам может быть автономной сторонней библиотекой или статически связанным набором библиотечных процедур).
- Либо база данных, либо приложение расчета заработной платы также должны инициировать процесс обмена данными между судном и берегом, и эта задача передачи данных часто будет содержать множество других компонентов.
Эти уровни создают эффект изоляции деталей реализации одного компонента и его различных внутренних методов от других. Объектно-ориентированное программирование охватывает и расширяет эту концепцию.
Абстракция данных [ править ]
Абстракция данных обеспечивает четкое разделение между абстрактными свойствами типа данных и конкретными деталями его реализации. Абстрактные свойства — это те, которые видны клиентскому коду, который использует тип данных ( интерфейс к типу данных), в то время как конкретная реализация остается полностью конфиденциальной и действительно может меняться, например, для включения улучшений эффективности с течением времени. Идея состоит в том, что такие изменения не должны оказывать никакого влияния на клиентский код, поскольку они не влекут за собой никаких изменений в абстрактном поведении.
Например, можно определить абстрактный тип данных , называемый справочной таблицей , который уникальным образом связывает ключи со значениями и в котором значения можно получить, указав соответствующие им ключи. Такая таблица поиска может быть реализована различными способами: как хеш-таблица , двоичное дерево поиска или даже простой линейный список пар (ключ:значение). Что касается клиентского кода, абстрактные свойства типа в каждом случае одинаковы.
Конечно, все это в первую очередь зависит от правильного получения деталей интерфейса, поскольку любые изменения в нем могут иметь серьезные последствия для клиентского кода. Один из способов взглянуть на это так: интерфейс формирует контракт о согласованном поведении между типом данных и клиентским кодом; все, что не указано в договоре, может быть изменено без предварительного уведомления.
Ручная абстракция данных [ править ]
Хотя большая часть абстракции данных происходит с помощью информатики и автоматизации, бывают случаи, когда этот процесс выполняется вручную и без вмешательства программирования. Один из способов понять это — абстракция данных в процессе проведения систематического обзора литературы. В этой методологии данные абстрагируются одним или несколькими абстракторами при проведении метаанализа , при этом ошибки уменьшаются за счет двойной абстракции данных с последующей независимой проверкой, известной как судебное решение . [10]
Абстракция в объектно-ориентированном программировании [ править ]
В объектно-ориентированного программирования теории абстракция включает в себя возможность определять объекты, которые представляют собой абстрактных «актеров», которые могут выполнять работу, сообщать о своем состоянии и изменять его, а также «общаться» с другими объектами в системе. Термин «инкапсуляция» относится к сокрытию деталей состояния , но расширение концепции типа данных из более ранних языков программирования для наиболее тесной связи поведения с данными и стандартизации способа взаимодействия различных типов данных является началом абстракции . Когда абстракция переходит в определенные операции, позволяющие заменять объекты разных типов, это называется полиморфизмом . Когда оно происходит в противоположном направлении, внутри типов или классов, структурируя их для упрощения сложного набора отношений, это называется делегированием или наследованием .
Различные языки объектно-ориентированного программирования предлагают схожие возможности абстракции, и все это для поддержки общей стратегии полиморфизма в объектно-ориентированном программировании, которая включает замену одного типа другим в той же или аналогичной роли. , образ или пакет обычно не поддерживаются, Хотя конфигурация они могут предопределить очень многие из этих привязок во время компиляции , времени компоновки или времени загрузки . будет изменяться лишь минимум таких привязок В результате во время выполнения .
Common Lisp Object System или Self Например, в меньше различий между классами и экземплярами, а больше используется делегирование для полиморфизма . Отдельные объекты и функции абстрагируются более гибко, чтобы лучше соответствовать общему функциональному наследию Lisp .
C++ иллюстрирует другую крайность: он сильно полагается на шаблоны , перегрузку и другие статические привязки во время компиляции, что, в свою очередь, имеет определенные проблемы с гибкостью.
Хотя эти примеры предлагают альтернативные стратегии достижения той же абстракции, они принципиально не меняют необходимость поддержки абстрактных существительных в коде — все программирование опирается на способность абстрагировать глаголы как функции, существительные как структуры данных или как процессы.
Рассмотрим, например, пример фрагмента Java , представляющий некоторых обычных сельскохозяйственных «животных» на уровне абстракции, подходящем для моделирования простых аспектов их голода и кормления. Он определяет Animal
класс для представления как состояния животного, так и его функций:
public class Animal extends LivingThing
{
private Location loc;
private double energyReserves;
public boolean isHungry() {
return energyReserves < 2.5;
}
public void eat(Food food) {
// Consume food
energyReserves += food.getCalories();
}
public void moveTo(Location location) {
// Move to new location
this.loc = location;
}
}
Используя приведенное выше определение, можно создавать объекты типа Животное и вызовите их методы следующим образом:
thePig = new Animal();
theCow = new Animal();
if (thePig.isHungry()) {
thePig.eat(tableScraps);
}
if (theCow.isHungry()) {
theCow.eat(grass);
}
theCow.moveTo(theBarn);
В приведенном выше примере класс Animal
это абстракция, используемая вместо реального животного, LivingThing
является дальнейшей абстракцией (в данном случае обобщением) Animal
.
Если требуется более дифференцированная иерархия животных – чтобы отличить, скажем, тех, кто дает молоко, от тех, кто не дает ничего, кроме мяса в конце своей жизни – это промежуточный уровень абстракции, вероятно DairyAnimal (коровы, козы), который бы есть продукты, подходящие для получения хорошего молока, и мясных животных (свиньи, бычки), которые едят продукты, обеспечивающие лучшее качество мяса.
Такая абстракция может избавить программиста приложения от необходимости указывать тип пищи, и вместо этого они смогут сосредоточиться на графике кормления. Эти два класса могут быть связаны с помощью наследования или использоваться отдельно, и программист может определить различные степени полиморфизма между этими двумя типами. Эти возможности, как правило, сильно различаются в зависимости от языка, но в целом каждый из них может достичь всего, что возможно с любым другим. Множество перегрузок операций, тип данных за типом данных, могут иметь тот же эффект во время компиляции, что и любая степень наследования или другие средства достижения полиморфизма. Обозначение класса — это просто удобство программиста.
Объектно-ориентированный дизайн [ править ]
Решения относительно того, что абстрагировать, а что оставить под контролем программиста, становятся основной задачей объектно-ориентированного проектирования и анализа предметной области — фактически определение соответствующих отношений в реальном мире является задачей объектно-ориентированного анализа или анализа наследия .
В общем, чтобы определить подходящую абстракцию, необходимо принять множество небольших решений относительно объема (анализ предметной области), определить, с какими другими системами необходимо сотрудничать (анализ наследия), а затем выполнить подробный объектно-ориентированный анализ, который выражается в рамках времени и бюджета проекта. ограничения как объектно-ориентированный дизайн. В нашем простом примере доменом является скотный двор, живые свиньи и коровы, а также их привычки в еде являются устаревшими ограничениями, детальный анализ показывает, что программисты должны иметь возможность кормить животных тем, что доступно, и, следовательно, нет смысла писать код. тип еды в сам класс, а дизайн представляет собой один простой класс Animal, экземплярами которого являются свиньи и коровы с одинаковыми функциями. Решение о дифференциации DairyAnimal изменило бы подробный анализ, но анализ предметной области и наследия останется неизменным - таким образом, он полностью находится под контролем программиста и называется абстракцией в объектно-ориентированном программировании в отличие от абстракции в предметной области или наследии. анализ.
Соображения [ править ]
При обсуждении формальной семантики языков программирования , формальных методов или абстрактной интерпретации абстракция относится к рассмотрению менее подробного, но безопасного определения наблюдаемого поведения программы. Например, можно наблюдать только конечный результат выполнения программы вместо того, чтобы рассматривать все промежуточные этапы выполнения. Абстракция определяется конкретной ( более точной) моделью выполнения.
Абстракция может быть точной или верной в отношении свойства, если можно одинаково хорошо ответить на вопрос о свойстве на конкретной или абстрактной модели. Например, если кто-то хочет знать, сколько стоит результат вычисления математического выражения, включающего только целые числа +, -, ×, по модулю n , то нужно только выполнить все операции по модулю n (знакомая форма этой абстракции - приведение вне девяток ).
Однако абстракции, хотя и не обязательно точные , должны быть обоснованными . То есть от них должно быть возможно получить обоснованные ответы, даже несмотря на то, что абстракция может просто дать результат неразрешимости . Например, учащиеся в классе могут быть абстрагированы по их минимальному и максимальному возрасту; если спросить, принадлежит ли определенный человек к этому классу, можно просто сравнить возраст этого человека с минимальным и максимальным возрастом; если его возраст лежит за пределами диапазона, можно смело ответить, что человек не принадлежит к классу; если нет, можно ответить только «не знаю».
Уровень абстракции, включенный в язык программирования, может влиять на его общее удобство использования . Структура когнитивных измерений включает в себя концепцию градиента абстракции в формализме. Эта структура позволяет разработчику языка программирования изучать компромиссы между абстракцией и другими характеристиками проекта, а также то, как изменения в абстракции влияют на удобство использования языка.
Абстракции могут оказаться полезными при работе с компьютерными программами, поскольку нетривиальные свойства компьютерных программ по существу неразрешимы (см. теорему Райса ). Как следствие, автоматические методы получения информации о поведении компьютерных программ должны либо отказаться от завершения (в некоторых случаях они могут дать сбой, выйти из строя или вообще не дать результата), либо от надежности (они могут предоставлять ложную информацию), либо от точности (они могут предоставлять ложную информацию). на некоторые вопросы они могут ответить «Я не знаю»).
Абстракция – это основная концепция абстрактной интерпретации . Проверка модели обычно происходит на абстрактных версиях изучаемых систем.
Уровни абстракции [ править ]
Информатика обычно представляет уровни (или, реже, слои ) абстракции, где каждый уровень представляет собой отдельную модель одной и той же информации и процессов, но с разным количеством деталей. На каждом уровне используется система выражения, включающая уникальный набор объектов и композиций, применимых только к определенной области. [11] Каждый относительно абстрактный, «более высокий» уровень основывается на относительно конкретном, «более низком» уровне, который имеет тенденцию обеспечивать все более «детализированное» представление. Например, вентили построены на электронных схемах, двоичные данные — на вентилях, машинный язык — на двоичном коде, язык программирования — на машинном языке, приложения и операционные системы — на языках программирования. Каждый уровень воплощается, но не определяется уровнем, находящимся под ним, что делает его языком описания, который в некоторой степени самодостаточен.
Системы данных баз
Поскольку многие пользователи систем баз данных недостаточно хорошо знакомы с компьютерными структурами данных, разработчики баз данных часто скрывают сложность за счет следующих уровней:

Физический уровень. Самый низкий уровень абстракции описывает, как система фактически хранит данные. Физический уровень подробно описывает сложные низкоуровневые структуры данных.
Логический уровень. Следующий более высокий уровень абстракции описывает , какие данные хранятся в базе данных и какие отношения существуют между этими данными. Таким образом, логический уровень описывает всю базу данных в терминах небольшого числа относительно простых структур. Хотя реализация простых структур на логическом уровне может включать сложные структуры физического уровня, пользователю логического уровня не обязательно знать об этой сложности. Это называется физической независимостью данных . Администраторы баз данных , которые должны решить, какую информацию хранить в базе данных, используют логический уровень абстракции.
Уровень представления: самый высокий уровень абстракции описывает только часть всей базы данных. Хотя на логическом уровне используются более простые структуры, сложность остается из-за разнообразия информации, хранящейся в большой базе данных. Многим пользователям системы баз данных не нужна вся эта информация; вместо этого им нужен доступ только к части базы данных. Уровень абстракции представления существует для упрощения их взаимодействия с системой. Система может предоставлять множество представлений для одной и той же базы данных.
Многоуровневая архитектура [ править ]
Возможность обеспечить проектирование различных уровней абстракции может
- значительно упростить конструкцию
- позволить различным ролевым игрокам эффективно работать на разных уровнях абстракции
- поддерживать переносимость программных артефактов (в идеале на основе модели)
при проектировании систем, так и при проектировании бизнес-процессов Это можно использовать как . Некоторые процессы проектирования специально создают проекты, содержащие различные уровни абстракции.
Многоуровневая архитектура разделяет задачи приложения на составные группы (уровни). Это метод, используемый при разработке компьютерного программного обеспечения, аппаратного обеспечения и средств связи, при котором системные или сетевые компоненты изолируются по уровням, чтобы изменения можно было вносить на одном уровне, не затрагивая другие.
См. также [ править ]
- Принцип абстракции (компьютерное программирование)
- Инверсия абстракции для антипаттерна одной опасности в абстракции
- Абстрактный тип данных для абстрактного описания набора данных.
- Алгоритм абстрактного описания вычислительной процедуры
- Абстракция скобок для превращения термина в функцию переменной
- Моделирование данных для структурирования данных независимо от процессов, которые их используют.
- Инкапсуляция абстракций, скрывающих детали реализации.
- Десятое правило Гринспана для афоризма о (?) оптимальной точке в пространстве абстракций
- Функция высшего порядка для абстракции, когда функции производят или потребляют другие функции.
- Лямбда-абстракция для превращения термина в функцию некоторой переменной.
- Список абстракций (информатика)
- Уточнение противоположности абстракции в вычислениях
- Целое число (информатика)
- Эвристика (информатика)
Ссылки [ править ]
- ^ Колберн, Тимоти; Шут, Гэри (5 июня 2007 г.). «Абстракция в информатике». Разум и машины . 17 (2): 169–184. дои : 10.1007/s11023-007-9061-7 . ISSN 0924-6495 . S2CID 5927969 .
- ^ Крамер, Джефф (1 апреля 2007 г.). «Является ли абстракция ключом к вычислениям?». Коммуникации АКМ . 50 (4): 36–42. дои : 10.1145/1232743.1232745 . ISSN 0001-0782 . S2CID 12481509 .
- ^ Бен-Ари, Мордехай (1 марта 1998 г.). «Конструктивизм в компьютерном образовании» . Бюллетень ACM SIGCSE . 30 (1): 257, 257–261. дои : 10.1145/274790.274308 . ISSN 0097-8418 .
- ^ Лисков, Барбара (1 мая 1988 г.). «Основной доклад – абстракция данных и иерархия». Уведомления ACM SIGPLAN . 23 . АКМ: 17–34. дои : 10.1145/62138.62141 . ISBN 0897912667 . S2CID 14219043 .
- ^ Гуттаг, Джон В. (18 января 2013 г.). Введение в вычисления и программирование с использованием Python (изд. весны 2013 г.). Кембридж, Массачусетс: MIT Press. ISBN 9780262519632 .
- ^ Флориди, Лучано (сентябрь 2008 г.). «Метод уровней абстракции» . Разум и машины . 18 (3): 303–329. дои : 10.1007/s11023-008-9113-7 . hdl : 2299/2998 . ISSN 0924-6495 . S2CID 7522925 .
- ^ Спольски, Джоэл. «Закон дырявых абстракций» .
- ^ «Абстрактные методы и классы» . Учебники по Java . Оракул . Проверено 4 сентября 2014 г.
- ^ «Использование интерфейса как типа» . Учебники по Java . Оракул . Проверено 4 сентября 2014 г.
- ^ Э, Цзянь-Ю; Салданья, Ян Дж.; Каннер, Джозеф; Шмид, Кристофер Х.; Ле, Джимми Т.; Ли, Тяньцзин (2020). «Решение, а не опыт абстракции данных, имеет большее значение для уменьшения ошибок при абстрагировании данных в систематических обзорах». Методы синтеза исследований . 11 (3): 354–362. дои : 10.1002/jrsm.1396 . ISSN 1759-2879 . ПМИД 31955502 . S2CID 210829764 .
- ^ Лучано Флориди , Левеллизм и метод абстракции МЭГ – Отчет об исследовании 22.11.04
Дальнейшее чтение [ править ]
- Гарольд Абельсон; Джеральд Джей Сассман; Джули Сассман (25 июля 1996 г.). Структура и интерпретация компьютерных программ (2-е изд.). МТИ Пресс. ISBN 978-0-262-01153-2 . Архивировано из оригинала 26 февраля 2009 года . Проверено 22 июня 2012 г.
- Спольски, Джоэл (11 ноября 2002 г.). «Закон дырявых абстракций» . Джоэл о программном обеспечении .
- Абстракция/сокрытие информации – курс CS211, Корнельский университет.
- Эрик С. Робертс (1997). Абстракции программирования в CA. Второй курс информатики .
- Палермо, Джеффри (29 июля 2008 г.). «Луковая архитектура» . Джеффри Палермо .
- Вишкин, Узи (январь 2011 г.). «Использование простой абстракции, чтобы заново изобрести вычисления для параллелизма» . Коммуникации АКМ . 54 (1): 75–85. дои : 10.1145/1866739.1866757 .
Внешние ссылки [ править ]
- SimArch для распределенных систем моделирования. Пример многоуровневой архитектуры