Slide: 1 Ада-технологии в 21 веке – не миф, а реальность ( Язык Ада: технологии, применение, стандартизация, возможности для встроенных систем ). Сергей.

Презентация:



Advertisements
Похожие презентации
Учебный курс Объектно-ориентированный анализ и программирование Лекция 4 Трансформация логической модели в программный код Лекции читает кандидат технических.
Advertisements

Февраль Типизация языков программирования.
1 Диаграммы реализации (implementation diagrams).
Использование языка Си для программирования ЦСП TMS320C67x.
Основы информатики Классы Заикин Олег Сергеевич zaikin.all24.org
К построению и контролю соблюдения политик безопасности распределенных компьютерных систем на основе механизмов доверия А. А. Иткес В. Б. Савкин Институт.
Министерство образования Республики Беларусь Белорусский государственный университет Управляющие структуры языков программирования.
Массивы 9 класс. Основные теоретические сведения Примеры решения задач.
Автор: учитель информатики МКОУ Плесской средней общеобразовательной школы Юдин Андрей Борисович Часть 1.
Проектирование архитектуры ИСО 1. UML 2 Структура определения языка 4.
Языки и методы программирования Преподаватель – доцент каф. ИТиМПИ Кузнецова Е.М. Лекция 7.
ГОСТЕХКОМИССИЯ РОССИИ РУКОВОДЯЩИЙ ДОКУМЕНТ Защита от несанкционированного доступа к информации.
ФИЛОСОФИЯ.NET Любому современному программисту, который желает идти в ногу с последними веяниями, каждые несколько лет приходится переучиваться.
ОСНОВЫ ТЕХНОЛОГИИ РАЗРАБОТКИ ПРОГРАММ. Разработка программ - промышленное производство необходима технология разработки программ. Д. Кнут «Искусство программирования.
Этапы решения задач на компьютерах Постановка задачи Формальное построение модели задачи Формальное построение модели задачи Построение математической.
1 Записи 2 Запись – это тип данных, который может включать в себя несколько полей – элементов разных типов (в том числе и другие структуры). Свойства:
Подпрограммы 1.Принцип модульности 2.Область действия переменных 3.Параметры подпрограмм 4.Модули.
OpenGL и Direct3D сравнение стандартов Выполнил: Пенкин А. Группа И-204.
Лекция 4 Программирование на Паскале. Элементы языка Турбо Паскаль 7.0. Типы данных. Управляющие конструкции.
Практическое занятие 6. Функции. Большинство языков программирования используют понятия функции и процедуры. C++ формально не поддерживает понятие процедуры,
Транксрипт:

Slide: 1 Ада-технологии в 21 веке – не миф, а реальность ( Язык Ада: технологии, применение, стандартизация, возможности для встроенных систем ). Сергей Рыбин Москва, 28 октября 2010 г.

Slide: 2 Еще одна попытка разорвать порочный круг… Ада (практически) отсутствует в современном ИТ-образовании в ВУЗах СНГ Ада (практически) отсутствует в современной ИТ-индустрии в странах СНГ ИТ-специалисты не знакомы с Ада-технологиями и инструментарием Отсутствует «заказ» на подготовку специалистов, владеющих Ада-технологиями

Slide: 3 И это в ситуации, когда Ада используется в таких областях, как: –организация воздушного движения –авионика (военная и гражданская) –средства связи и телекоммуникаций –энергетика –банковские системы –медицинские системы –военные системы (наземного, морского и авиакосмического базирования) –космические технологии –телевидение –транспорт –электроника –… Такими компаниями, как: –Alenia –Alstom Transport –Ansaldo STS –BAE Systems –Boeing –EADS –European Space Agency –Eurocontrol –IPESOFT –JEOL –Lockheed Martin –MBDA –Philips Semiconductor –Raytheon –Rockwell Collins –SAAB –General Electric –Thales –Thales Alenia Space –...

Slide: 4 Ада – язык, ориентированный на создание надежного кода. Современные индустриальные языки сопоставимы по предоставляемым возможностям, различаясь в том, как именно эти возможности предоставляются. Ада – единственный из современных индустриальных языков, специально созданный для обеспечения надежности больших программных систем – как при их разработке, так и при сопровождении. Ада предоставляет возможности, отсутствующие в языках-конкурентах (С/С++, Java): –высокоуровневые языковые абстракции и соответствующие конструкции для программирования асинхронных процессов

Slide: 5 Hello, World! Язык был разработан в конце 80-х годов по заказу МО США как единый язык для разработки встроенных программных систем; Стандарт ANSI (1983), стандарт ISO/IEC 8652 (1987/1995/2007/2012); Ада – прямой потомок Паскаля: with Ada.Text_IO; use Ada.Text_IO; procedure Hello_World is begin Put_Line ( Hello, World! ); -- Это комментарий end Hello_World;

Slide: 6 Язык программирования и надежность - философия (1). Создание программы (программной услуги) – не написание кода, а определение и использование моделей и абстракций, соответствующих объектам и процессам в решаемой задаче или проблемной области. Уровень и разнообразие базовых абстракций должен соответствовать уровню и разнообразию решаемых задач («принцип сундука») –готовые и удобные решения для часто встречающихся технологических потребностей; –удобные средства создания проблемно-ориентированных абстракций; –высокая производительность на полном жизненном цикле программной услуги;

Slide: 7 Язык программирования и надежность - философия (2). «Все, что не разрешено – запрещено!» Язык реализует жесткую дисциплину прогнозирования (определения свойств абстракции при ее создании) и контроля * (использования абстракции в соответствии с определенными для нее свойствами); Чем раньше обнаружится ошибка (несоответствие использования абстракции определенным для нее свойствам), тем проще, быстрее и дешевле оказывается ее устранение; * Кауфман В.Ш - Языки программирования. Концепции и принципы М.:Радио и связь, 1993

Slide: 8 Язык программирования и надежность - философия (3). Программист в основном занят сопровождением и модификацией чужого кода, а не созданием своего –ясность и хорошая структурированность кода многократно важнее возможности быстро его написать! Сложный инструмент редко бывает надежным –предоставляя больше возможностей, чем Си++, Ада оказывается существенно более простым языком для изучения и понимания; Все, что может быть определено – должно быть явно определено! –умолчания и надежда на «здравый смысл» - один из основных источников недоразумений и ошибок! –определение Ады «замкнуто». По сравнению с Си/Си++, например: –правила видимости не требуют привлечения мифического понятия «пространства имен», а вполне обходятся синтаксическими конструкциями языка; –правила модульности и раздельной компиляции не требуют привлечения внеязыкового понятия «файл», а также обходятся синтаксическими конструкциями языка;

Slide: 9 Язык программирования и надежность - философия (4). Опережающая стандартизация –Ада возникла и развивалась как стандарт языка программирования; –Средства контроля стандарта Ады были разработаны к моменту принятия первого стандарта языка – все индустриальные реализации Ады достаточно точно соответствуют той или иной версии стандарта, диалектов Ады в индустрии не было и нет; Классификация ошибок в программе на уровне стандарта языка. Стандарт четко подразделяет все содержащиеся в нем требования на следующие группы: –проверяемые во компиляции отельного модуля (нарушение требования означает, что компиляция не является успешной, в ее результате не будет создан объектный код); –проверяемые при сборке программы из успешно скомпилированных модулей (нарушение требования означает, что исполняемый файл создан не будет); –проверяемые при выполнении программы (нарушение требования приводит к возбуждению предопределенного исключения); –правила, нарушение которых реализация проверять не обязана. Средства контроля стандарта проверяют, что поведение реализации соответствует этой классификации!

Slide: 10 Язык программирования и надежность – практика. О пользе ясного синтаксиса (1) Опасность ошибиться и не заметить: Си - правильный код: if (the_signal == clear) { open_gates (...); start_train (...); } Но если перепутать = и==, получим формально корректный код: if (the_signal = clear) { open_gates (...); start_train (...); } В Аде такое невозможно: if The_Signal = Clear then Open_Gates (...); Start_Train (...); end if; В Аде присваивание := никогда не может оказаться частью конструкции, являющейся условием и быть перепутано со сравнением =. В Аде операторы четко отделены от выражений.

Slide: 11 Язык программирования и надежность – практика. О пользе ясного синтаксиса (2) Опасность ошибиться и не заметить: Си - правильный код: if (the_signal == clear) { open_gates (...); start_train (...); } Если случайно поставить «лишнюю» точку с запятой, получим формально корректный код: if (the_signal == clear) ; { open_gates (...); start_train (...); } В Аде такое невозможно: if The_Signal = Clear then ; Open_Gates (...); Start_Train (...); end if; В Аде не бывает неявных пустых операторов, которые «вдруг» появляются перед ;. Данный код будет отвергнут как синтаксически некорректный

Slide: 12 Язык программирования и надежность – практика. О пользе ясного синтаксиса (3) Полезные «мелочи» procedure P1 is... procedure P2 is... begin... end P2; begin... Bl1 : begin... Bl2 : begin... end Bl2;... end Bl1; end P1; record I : Integer; end record;... if Condition then for I in loop case Value is... end case; end loop; end if;

Slide: 13 Язык программирования и надежность – практика. Строгая типизация в Аде (1). Прогнозирование и контроль свойств элементов программы - основное средство обеспечения надежности: –каждая используемая в программе сущность должна быть объявлена; –объявление полностью определяет свойства сущности; –каждая сущность может использоваться только в соответствии с ее свойствами, заданными в объявлении; –никакие неявные преобразования или изменения свойств сущности недопустимы; –Все, что не разрешено (объявлением сущности), запрещено (при использовании сущности); Что такое тип данных в языке программирования? –множество значений + набор применимых операций или все-таки –отражение содержательной роли объектов данных в проблемной области? Типы данных и надежность программ - философия Ады: –надежность программы возрастает, если программа максимально точно и подробно отражает модель проблемной области; –для каждого объекта данных важно определить его роль в (модели) проблемной области и проконтролировать, что каждый объект используется только в своей роли; Концепция строгой типизации: тип данных = содержательная роль объектов данных в модели проблемной области;

Slide: 14 Язык программирования и надежность – практика. Строгая типизация в Аде (2) Все типы данных явно определены (объявлены) в программе, все они имеют имена и определения; Все объекты данных (и все их компоненты) имеют ровно один тип. Этот тип известен при объявлении объекта. Этот тип должен быть задан путем указания имени ранее объявленного типа данных; Все операции объявлены в тексте программы, все они имеют явно определенные типы параметров и результата (если он есть) Эти типы также должны быть заданы путем указания имен ранее объявленных типов данных. При вызове любой операции (присваивание тоже считается операцией!) проверяется, что типы операндов соответствуют заявленным типам параметров операции; Соответствие типов есть не соответствие структур значений, а совпадение имен (объявлений) типов; Все типы должны определяться статически (это никак не связано и никак не препятствует динамическому полиморфизму как части объектно-ориентированного программирования) Неявные преобразования типов недопустимы.

Slide: 15 Язык программирования и надежность – практика. Строгая типизация в Аде – классический пример type Фрукты is new Integer; -- тип с теми же свойствами, что -- Integer, но ДРУГОЙ!!! type Яблоки is new Фрукты; type Апельсины is new Фрукты;... Я1, Я2 : Яблоки; А1, А2 : Апельсины; Ф : Фрукты;... Я1 := 5; -- можно Я1 := Я1 + Я2; -- можно А1 := Я1 + А2; -- нельзя - нет такого « + » ! Ф := Я1; -- нельзя - разные типы источника и получателя « := » ! if Я1 + Я2 > Ф then -- и это недопустимо! Нет такого > … end if; -- А вот так – можно! Явное указание на то, что объект (временно) -- меняет свою содержательную роль (явное преобразование типа): Ф := Фрукты (Я1) + Фрукты (А1);

Slide: 16 Язык программирования и надежность – практика. Строгая типизация в Аде: («Если нельзя, но очень хочется, то можно!» ((С))) Явное преобразование типа – использование объекта данных в другой (родственной) роли; Иногда возникает необходимость преобразования типа между типами, вообще не имеющими друг к другу никакого отношения… Это можно сделать, но для этого придется специально настроить вот такой шаблон: generic type Source() is limited private; type Target() is limited private; function Ada.Unchecked_Conversion(S : Source) return Target; и применить результат настройки к нужным объектам (то есть, сделать такое случайно, «не заметив», невозможно).

Slide: 17 Язык программирования и надежность – практика. Подтипы и исключительные ситуации. procedure Автопилот is type Скорость is digits 8 range ; function Данные_Спидометра return Скорость is... end Данные_Спидометра; subtype Безопасная_Скорость is Скорость range ; Текущая_Скорость : Безопасная_Скорость;... begin... loop Текущая_Скорость := Данные_Спидометра;... end loop;... exception when Constraint_Error => Включить_Аварийный_Сигнал; Нажать_На_Тормоз;... end Автопилот; Тип данных – это: –концептуально - содержательная роль объектов данных в программе; –технически – множество значений + совокупность операций; Подтип – это ограничение множества значений в рамках той же содержательной роли; Реализация сама проверяет, что присваиваемое значение попадает в подтип, определенный для данного объекта данных (принадлежит подтипу); В случае нарушения подтипового ограничения при выполнении программы возбуждается предопределенное ограничение Constraint_Error;

Slide: 18 Язык программирования и надежность – практика. Полезные «мелочи»… Все намерения программиста должны быть явно обозначены type Week_Day is (Mon, Tue, Wen, Thu, Fri, Sat, Sun); Day : Week_Day;... case Day is when Mon.. Thu => Working_Like_Dog; when Sat => Drinking; when Sun => Fishing; end case; -- Но что происходит в пятницу??? -- Такой код не будет скомпилирован! Статическая борьба с «дохлыми» ссылками: package P is type T is...; type T_Ptr is access all T; Global : T_Ptr; end P;... procedure Q is X : aliased T; Local : T_Ptr := X'Access; -- Так нельзя! -- Local может быть присвоен чему угодно, -- в т.ч. и Global begin Global := X'Access; -- Нельзя! Global := Local; -- Нельзя! Global := X Unchecked_Access; -- Можно, но под личную -- ответственность автора... end Q;

Slide: 19 Язык программирования и надежность – практика. Проблемы при сборке программы package P1 is function F1 return Integer; end P1; with P1; package body P2 is X2 : Integer := P1.F1; function F2 return Integer is begin return X2; end F2; end P2; with P2; package body P1 is X1 : Integer := P2.F2; function F1 return Integer is begin return X1; end F1; end P1; package P2 is function F2 return Integer; end P2; Реализация Ады обязана определить, что не существует корректного порядка включения кода, порождаемого модулями P1 и P2, в исполняемый код, а потому никогда не будет создан исполняемый код для программы, в состав которой входят эти модули.

Slide: 20 На обеспечение надежности работают и такие языковые механизмы, как: Разделение спецификации (интерфейса) и реализации (тела) для каждого программного модуля и невозможность доступа к телам со стороны клиентов модуля; Приватные типы; Правила видимости имен; Правила раздельной компиляции; Контрактная модель настройки шаблонов; …

Slide: 21 Чего стоят такие меры обеспечения надежности? Статический контроль (как при раздельной компиляции модулей, так и при сборке программ) приводит только лишь к утяжелению транслятора, никак не сказываясь на размерах и быстродействии исполняемого кода; Динамический контроль (подтиповые ограничения) незначительно утяжеляют исполняемый код, при необходимости они могут быть (выборочно) отключены; Зато шансов, что до исполнения будет допущен код с «дурными» ошибками, которые к тому же не будут сразу обнаружены, намного меньше!

Slide: 22 И что они дают? IEEE Software, 1987, #1, pp40-44: производительность разработчиков на полном цикле (>= 20_000 SLOC): –Ада - 12 строк/день –другие языки - 10 строк/день распределение затрат в проекте:

Slide: 23 Асинхронные процессы в Аде Наш мир состоит из взаимодействующих асинхронных процессов, взаимодействующих друг с другом и конкурирующих за использование разделяемых ресурсов; Программы, встроенные в реальный мир, должны уметь работать с асинхронными процессами и разделяемыми ресурсами; Программы с асинхронными процессами существенно сложнее последовательных программ; Чем может помочь язык программирования? –Предоставление высокоуровневых средств описания асинхронных процессов и управления ими; –Данные средства должны быть согласованы с привычными нам моделями взаимодействия асинхронных процессов; –Данные средства должны быть ориентированы на устойчивые к ошибкам парадигмы и технологии работы с асинхронными процессами; Ада – единственный индустриальный язык, который это умеет.

Slide: 24 Два асинхронных процесса на 19 строк кода (by B. Brosgol, ) 1 with Ada.Text_IO; 2 procedure Tasking_Example is 3 Finished : Boolean := False; 4 pragma Atomic(Finished); 5 6 task Outputter; -- task specification 7 8 task body Outputter is -- task body 9 Count : Integer := 1; 10 begin 11 while not Finished loop 12 Ada.Text_IO.Put_Line(Integer'Image(Count)); 13 Count := Count + 1; 14 delay 1.0; -- one second 15 end loop; 16 Ada.Text_IO.Put_Line("Terminating"); 17 end Outputter; begin 20 delay 20.0; -- twenty seconds 21 Finished := True; 22 end Tasking_Example; процесс Tasking_Example процесс Outputter результат работы этой программы: Terminating

Slide: 25 «Умный» буфер protected type Bounded_Buffer is entry Put (X: in Item); entry Get (X: out Item); private A : Item_Array (1.. Max); I, J : Integer range 1.. Max := 1; Count : Integer range 0.. Max := 0; end Bounded_Buffer; protected body Bounded_Buffer is entry Put (X : in Item) when Count 0 is begin X := A(J); J := J mod Max + 1; Count := Count - 1; end Get; end Bounded_Buffer; -- Использование буфера: -- * возможно только в режиме -- взаимного исключения; -- * тупики исключены; My_Buffer : Bounded_Buffer;... My_Buffer.Put (Something);... My_Buffer.Get (To_Something);

Slide: 26 GNAT – реализация Ады 83/95/2005/2012 в семействе компиляторов GNU GPL Компилятор переднего плана для Ады + кодогенератор GCC + GUI + набор инструментов + набор технологических решений для основных областей применения; Распространяется под лицензиями GPL/GMGPL: –все исходные коды всех компонент бесплатно доступны любому, получившему компилятор законным образом; –в версии GNAT Pro отсутствует проблема GPL-инфицирования; Разрабатывается и сопровождается с 1995 года компанией AdaCore ( Распространяется как: –GNAT Pro (AdaCore); –GAP (AdaCore); –GNAT GPL (AdaCore); –версии, подготовленные, собранные и распространяемые другими людьми, сообществами, организациями…

Slide: 27 GNAT Pro – поддерживаемые платформы Linux: x86 GNU Linux (32 bits) Linux: x86-64 GNU Linux (64 bits) Linux: HP Integrity Itanium GNU Linux Linux: SGI Altix Itanium GNU Linux Solaris: SPARC Solaris (32 bits) Solaris: SPARC Solaris (64 bits) Solaris: x86 Solaris/Trusted Solaris (32 bits) Windows: x86 Windows (32 bits, 64 bits) Windows:.NET on Windows Mac OS X: x86-64 Mac OS X (64 bits) Mac OS X: PowerPC Mac OS X HP-UX: PA-Risc HP-UX HP-UX: Itanium HP-UX Tru64: Alpha Tru64 OpenVMS: Alpha OpenVMS OpenVMS: Itanium OpenVMS IRIX: MIPS IRIX AIX: PowerPC AIX (32 bits) LynxOS: x86 LynxOS 4.x Кросс-компилятры для : –Embedded Linux –PikeOS –Nucleus OS –LynxOS –VxWorks

Slide: 28 GNAT Pro – индустриальное использование Список клиентов (фрагмент): ABB Alcatel Space Air Traffic Control Netherlands BNP Paribas Boeing BAE Systems Ericsson Microwave System Eurocontrol Eurocopter Eurotunnel General Dynamics Havelsan Hewlett-Packard Honeywell Indra Lockheed Martin MBDA Ministry of Defense, the Netherlands NATO Paranor Philips Semiconductors ITEC PostFinance Raytheon Rockwell Collins Saab Siemens Transportation Systems SGI Sema Group Thales Проекты: –Lockheed Martin – модернизация транспортного самолета C-130J; –Thales – система определения положения в пространстве для Airbas A350; –Thales – встроенное ПО для перископов подводных лодок; –Lockheed Martin – система предупреждения конфликтов при управлении воздушным движением; –Raytheon – боевое корабельное ПО; –Boeing Dreamliner –BAE Systems – бортовое ПО для европейского истребителя (Eurofighter Typhoon ) –MBDA – встроенное ПО для компонент международной космической станции; Вся информация – с и

Slide: 29 GNAT Pro - компилятор Ada front-end (реализован на 95% на Аде + 5% Си- кода) + общий кодогенератор GNU GCC; –общий кодогенератор существенно облегчает работу над мультиязыковыми проектами; –GNAT Pro – среда разработки на Аде/Си/Си++ Существует как в обычном (native), так и в кросс- вариантах; Удовлетворяет (как минимум!) стандартным индустриальным требованиям (ресурсоемкость, скорость компиляции, качество кода): –косвенное доказательство эффективности – использование метода «раскрутки» при (регулярном) построении компилятора;

Slide: 30 GNAT Pro – компилятор / GUI Полная поддержка всех редакций стандарта Ады; Полезные расширения стандарта (в рамках, определяемых стандартом языка) –прагмы и атрибуты для «тонкого» управления связью модулей, реализованных на разных языках, доступа к машинно-зависимым характеристикам и т.п.; Богатый набор параметров компиляции –управление уровнем оптимизации, тонкая настройка механизма генерации предупреждений и контроля стиля кодирования и др. Исчерпывающая документация Два варианта GUI на выбор (Ада/Си/Си++): –GPS (реализована на базе GtkAda); –GNATbench (Ada plug-in для Eclipse); Многоплатформность –интерфейс и функциональность среды одинаковы на всех платформах, где среда реализована

Slide: 31 GNAT Pro – инструментарий (1) CodePeer – статический анализ графа потока данных и потока управления программы, позволяющий обнаруживать такие (потенциально) опасные ситуации, как: –использование неинициализированных переменных; –переполнения (численные и переполнения структур данных); –некорректное использование указателей; –недоступный код и др. gnatstack – статический анализ размера стека: –определение максимального стека размера для каждой точки входа; –выявление потенциально опасных вызовов, которые могут привести к неограниченному росту стека; gnatelim – выявление неиспользуемых подпрограмм: –список неиспользуемых подпрограмм передается компилятору, что приводит к уменьшению размера исполняемого кода;

Slide: 32 GNAT Pro – инструментарий (2) gnatpp – конфигурируемый инструмент реформатирования Ада-кода; gnatmetric – инструмент подсчета метрик: –классические метрики (число строк, объявлений, операторов…); –метрики сложности; –объектно-ориентированные метрики; gnatprep – препроцессор для Ада-кода; gnatmem – выявление ситуаций, приводящих к «утечкам памяти»; gnatcheck – контролер стиля кодирования, содержит более 60 правил, расширяемый по запросам пользователей; gnathtml – конвертация Ада-кода в формат HTML; возможность использования стандартного инструментария gcc (gcov, gprof);

Slide: 33 SPARK – корректность программы «по построению» (Основанная на Аде) практическая технология доказательного программирования: –язык, объединяющий исполняемый код (подмножество Ады) и логические утверждения, позволяющие формулировать утверждения о свойствах исполняемого кода (пре- и пост-условия, инварианты циклов и др.); –Spark Examiner: инструмент проверки корректности SPARK-кода; –успешное применение в ряде индустриальных проектов;

Slide: 34 SPARK – пример Сортировка массива с доказательством корректности (из книги John Barnes, High Integrity Software. The Spark Approach to Safety and Security. Addison-Wesley, 2003): package Array_Utilities is Max_Table_Size : constant := 100; type Base_Index_Type is range 0..Max_Table_Size; subtype Index_Type is Base_Index_Type range 1..Max_Table_Size; type Contents_Type is range ; type Array_Type is array (Index_Type) of Contents_Type; --# function Ordered(A : Array_Type; L,U : Index_Type) --# return Boolean; --# function Perm (A, B : Array_Type) return Boolean; procedure Sort (Table : in out Array_Type); --# derives Table from Table; --# post Ordered (Table, 1, Max_Table_Size) and --# Perm (Table,Table~); end Array_Utilities; package body Array_Utilities is --# function Partitioned(A : Array_Type; --# L, M, U : Index_Type) return Boolean; procedure Sort (Table : in out Array_Type) is Key : Index_Type; --# function The_Smallest (A : Array_Type; --# L,U : Index_Type) return Index_Type; function Find_Smallest (Arr : Array_Type; L,U: Index_Type) return Index_Type --# pre 1

Slide: 35 SPARK – пример (окончание) package body Array_Utilities is... procedure Swap_Elements (T : in out Array_Type; I, J : in Index_Type) --# derives T from T,I,J; --# post T = T~[I => T~(J); J => T~(I)] and Perm(T,T~); is Temp : Contents_Type; begin Temp := T(I); T(I) := T(J); T(J) := Temp; end Swap_Elements; begin -- Sort for Low in Index_Type range 1.. Max_Table_Size - 1 loop Key := Find_Smallest(Table,Low,Max_Table_Size); if Key /= Low then Swap_Elements(Table,Low,Key); end if; --# assert 1

Slide: 36 Специализированные библиотеки AWS – Ada Web Services –библиотека для создания Web-приложений на Аде; –поддержка протоколов SOAP, SMTP, LDAP, Jabber; –поддержка HTTPS/SSL; PolyORB – набор решений для построения распределенных приложений; –основан на технологии CORBA; –предлагает различные решения для обеспечения безопасности коммуникаций; –позволяет создавать приложения для работы в реальном времени; XML Ada: –анализатор текстов на XML; –Поддержка SAX 2.0 и DOM 2.0; –Поддержка Unicode (UTF-8 и UTF-16); GtkAda – библиотека для построения графических пользовательских интерфейсов; ASIS – Ada Semantic Interface Specification: –доступ к синтаксису и семантике программных модулей на языке Ада; –позволяет быстро разрабатывать инструменты статического анализа Ада-кода;

Slide: 37 Поддержка сертификации разрабатываемых программ (1) Многие проекты, выполняемые на основе GNAT- технологии, предполагают сертификацию в рамках стандарта DO-178B; Конфигурируемые библиотеки периода исполнения: –Zero Foot Print (ZFP) – минимальная библиотека, не содержащая исполняемого кода; –Certified Profile – сертифицированное расширение ZFP, достаточное для многих аэрокосмических приложений; –Ravenscar Profile – расширение ZFP, позволяющее создавать сертифицируемые многопроцессные приложения; обоснование отсутствия переполнения стека при выполнении программы (gnatstack);

Slide: 38 Поддержка сертификации разрабатываемых программ (2) поддержка тестирования (DO 178B, уровни С, В, А) – couverture: –контроль выполнения критериев полноты структурного тестирования разного уровня; –выполнение тестирования встраиваемого кода на инструментальной машине в режиме эмуляции; –проверка выполнения критериев полноты без инструментирования (изменения) тестируемого кода; traceability: когда покрытие исходного кода гарантирует эквивалентное покрытие объектного кода? контроль стиля кодирования: –gnatcheck: –набор правил, расширяемый по запросу пользователей; –квалифицированные версии для конкретных стилей кодирования; –помощь в оптимизации требований стиля кодирования;

Slide: 39 Условия распространения GNAT Pro Распространяется методом подписки на услуги AdaCore; Подписка включает в себя: –доступ к версии GNAT-технологии, распространяемой под лицензией GPL/GMGPL (позволяющей разрабатывать продукты, которые уже не обязаны удовлетворять GPL!); –доступ к исходным текстам всех компонент GNAT Pro, на которые распространяется подписка; –возможность регулярно получать новые релизы всех компонент технологии; –возможность пользоваться оперативной технической поддержкой в режиме 24х7х365;

Slide: 40 GNAT Pro – техническая поддержка Оперативность: –вопросы задаются по электронной почте или через специализированный web- интерфейс (GNAT Tracker); –гарантированное время ответа – 2 рабочих дня, на практике 80% запросов получают ответ в течение одного рабочего дня. Техническая поддержка включает: –ответы на вопросы по языкам и стандартам, реализуемым компонентами GNAT Pro (Ада, ASIS, SPARK,...); –помощь в установке и настройке программных компонент GNAT Pro; –помощь в выборе наиболее эффективных способов использования GNAT Pro в том или ином проекте; –в случае обнаружения дефекта в технологии: –помощь в нахождении оперативных решений, позволяющих обойти дефект (workaround); –если это невозможно – предоставление версий компонент технологии с исправленными дефектами (wavefronts), такие компоненты всегда проходят стандартную процедуру контроля качества; Стоимость годовой подписки зависит от набора компонент и решений GNAT Pro, стоимость базового годового контракта сопоставима с годовой зарплатой одного разработчика.

Slide: 41 GNAT – если не Pro, то что (1)? Кроме GNAT Pro, AdaCore предлагает GNAT GPL: –набор основных компонент GNAT-технологии без каких-либо ограничений по функциональности; –проходит ту же процедуру контроля качества, что и GNAT Pro; –доступен (абсолютно бесплатно) для MS Windows, Microsoft.NET, Linux Mac OS, Solaris; –включает GNAT-on-MINDSTORMS (среда программирования роботов Lego MINDSTORMS) –распространяется полностью под GPL (позволяет создавать только GPL-программы); GAP (GNAT Academic Program): версия GNAT для университетов –GNAT GPL + (ограниченная) техническая поддержка + обмен информацией между участниками программы; –более 150 университетов из 25 стран; –Белоруссия – Высший государственный колледж связи; –РФ - Московский, Ярославский, Томский университеты; –Украина – Национальный технический университет (Киев), Черновицкий и Харьковский университеты);

Slide: 42 GNAT – если не Pro, то что (2)? GNAT из других источников? –Исходные тексты основных компонентов GNAT-технологии доступны; –Помимо AdaCore, GNAT собирается и распространяется другими людьми и организациями (в частности, FSF); –этим может заняться любой желающий ; –существуют модификации, разработанные вне AdaCore (например, есть реализации для архитектур, не поддерживаемых AdaCore); –На ваш страх и риск… –мы ничего не знаем о согласованности версий используемых компонент, процедуре сборки, применяемой процедуре контроля качества и т.п. –и поэтому мы не в состоянии не только осуществлять техническую поддержку подобных продуктов, но даже отвечать на какие-либо вопросы по ним –но мы принимаем к сведению и анализируем сообщения об обнаруженных ошибках…

Slide: 43 Хотите узнать больше: community.org : community.org –все по-русски, включая книгу по языку Ада-95; –много полезных ссылок; –помимо описания GNAT-технологии, богатый набор справочных материалов по языку и практических советов по его использованию; –стандарт Ады (все редакции + версии с комментариями), сопутствующие стандарты (ASIS), обоснование проектных решений, ссылки на учебники;

Slide: 44 Итак: Ада является существенным компонентом мировой программной индустрии; Ада активно и успешно используется в том числе и для разработки встроенных систем с критическими требованиями к надежности; Отечественные специалисты по ИТ должны иметь достаточно информации о современном состоянии Ада технологий, чтобы принимать осознанные решения относительно их использования или неиспользования в тех или иных проектах;