ЭВМHISTORY
Статьи. Обзоры. Истории

Программирование | Ada



История языка
Особенности языка
Синтаксис
Примеры программ


ada, ада, язык, программирование

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

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


История языка

Данный язык программирования высокого уровня назван в часть Августы Ады Байрон, графини Лавлейс и дочери английского поэта лорда Байрона. Она была ассистентом, коллегой и сторонницей Чарльза Бэббиджа, математика и изобретателя вычислительной машины, названной аналитической машиной. С помощью Ч. Бэббиджа в 1830 г. она написала практически законченную программу на аналитической машине для вычисления чисел Бернулли. Поэтому графиню можно назвать первым в мире программистом на вычислительной машине.

Ада, язык, носящий имя графини, был разработан по инициативе и при содействии министерства обороны США. Исследования, предпринятые в начале и середине 70-х годов, показали, что можно получить огромную экономию средств на программное обеспечение (около 24 млрд. долл. за период 1983 — 1999 гг.), если министерство обороны воспользуется единым языком программирования для решения всех своих задач вместо примерно 450 языков программирования и несовместимых диалектов, используемых программистами. Финансы поют романсы. Всё как всегда.

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

Несмотря на то, что побудительные мотивы создания нового языка программирования первоначально были чисто экономическими, на него оказало заметное влияние и желание иметь язык программирования, направленный на решение важных проблем разработки программного обеспечения. Требования к новому языку содержали такие технические особенности, как простота и полнота языка, надежность, правильность и переносимость программ, простота поддержки, возможность разработки больших программ, программирование в реальном масштабе времени и обнаружение и исправление ошибок. Для разработки языка, удовлетворяющего перечисленным требованиям, был организован международный конкурс. Семнадцать фирм подали свои предложения, четыре из них были отобраны как полуфиналисты. Интересно, что все полуфиналисты в качестве основы для своих языков взяли язык Паскаль. Победителем конкурса стал язык программирования, разработанный группой ученых под руководством Ж. Ишбиа фирмы CII Honeywell Bull. Претерпев некоторое число изменений, этот язык был назван Ада. Через некоторое время доработанный язык Ада становится стандартом ANSI; дальнейшие изменения в языке были направлены на его упрощение и устранение несоответствий. Язык Ада был принят как стандарт ANSI в феврале 1983 г.

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

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

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


Особенности языка

  • одним из требований при разработке языка была максимально лёгкая читаемость текстов программ, даже в ущерб лёгкости написания. Результатом такого подхода стал несколько «тяжеловесный» синтаксис: ключевые слова и операторы (за исключением арифметических) используют слова английского языка без сокращений.
  • строгая типизация. Работа с объектами, не имеющими типов, невозможна, а автоматические преобразования типов сведены к абсолютному минимуму.
  • механизм модульности включает три типа программных единиц: задания (единицы параллельного выполнения), пакеты (единицы модульной структуры, использующиеся, например, для реализации абстрактных типов данных) и процедуры.
  • динамическая работа с памятью, без обобщенных указателей, зато с объявленными в явном виде типами доступа (access types). Семантика языка позволяет реализовать автоматический сбор мусора, но большинство реализаций по умолчанию не поддерживают его.
  • богатый инструментарий отслеживания и обработки ошибок как на этапе компиляции, так и во время выполнения программы. Язык построен таким образом, чтобы как можно большее количество ошибок обнаруживалось на этапе компиляции. Сообщения компилятора об ошибках сделаны максимально информативными. Механизм исключений позволяет обрабатывать ошибки, возникающие на этапе выполнения программы.
  • поддержка обобщенного программирования.
  • параллельное программирование реализовано через механизм рандеву (rendezvous).
  • В настоящее время существуют компиляторы Ada под практически любую операционную систему, плюс компиляторы в Java и .NET байткод. Язык Ada используется в США и Европе при разработке сложных больших проектов, требующих повышенной безопасности и надежности, причём не только в военных, а в любых критических приложениях.


Синтаксис


Комментарий до конца строки --
Регистрозависимость нет
Регулярное выражение идентификатора переменной [a-zA-Z](_?[a-zA-Z0-9])*
Присваивание значения переменной :=
Объявление переменной variable: type
Группировка выражений ( ... )
Блок begin ... end или foo ... end foo where foo in { if, do, ... }
Тождественное равенство =
Тождественное неравенство /=
Сравнение < > <= >=
Определение функции function f(p1 : type1; p2 : type2; ... ) return returntype is begin ... end f;
Вызов функции f(a, b, ...)
Вызов функции без параметров f
Последовательность ;
Если - то if condition then ... end if
Если - то - иначе if condition1 then ... elsif condition2 then ... else ... end if
Бесконечный цикл loop ... end loop
Цикл с предусловием while condition loop ... end loop
Цикл с постусловием loop ... exit when condition end loop
Цикл for - next для диапазона целых чисел с инкрементом на 1 for i in 1 .. 10 loop ... end loop
Цикл for - next для диапазона целых чисел с декрементом на 1 for i in reverse 1 .. 10 loop ... end loop


Примеры программ


1) Hello, World!

with Ada.Text_IO;

procedure HelloWorld is
begin
Ada.Text_IO.Put_Line("Hello, World!");
end HelloWorld;

2) рекурсивное определение факториала

with Ada.Text_IO, Ada.Integer_Text_IO, Ada.Long_Long_Integer_Text_IO;

procedure Factorial is
begin
     declare
           function Fact (N: Integer) return Long_Long_Integer is
           begin
                 if N=0 then
                 return 1;
           else
                 return Long_Long_Integer(N)*Fact(N-1);
           end if;
     end Fact;
 i: Integer := 0;
 begin
     loop
           Ada.Integer_Text_IO.Put (Item => i, Width => 1);
           Ada.Text_IO.Put ("! = ");
           Ada.Long_Long_Integer_Text_IO.Put (Item => Fact(i), Width => 1);
           Ada.Text_IO.New_Line;
           i := i + 1;
     exit when i=17;
     end loop;
 end;
end Factorial;

Команда put в общем случае принимает несколько аргументов, изменяющих формат вывода: Item — это число, которое выводится на печать, Width — количество позиций, которые следует использовать при выводе, Fore и Aft — количества десятичных цифр, которые следует вывести до и после запятой и т.д. Если передается только один аргумент, он считается значением Item. Установив Width равным 1 или другому числу, меньшему, чем количество цифр в выводимом числе, можно вывести его без пробелов в начале.

Кроме того, отметим, что Ada не поддерживает неявные преобразования типов, так что для вычисления N*Fact(N-1) сначала следует явно преобразовать N к типу Long_Long_Integer.

3) Решение квадратных уравнений

Ada предоставляет тип данных для работы с комплексными числами, который требует использования пакетов Generic_Complex_Types и Generic_Complex_Elementary_Functions с предварительной инициализацией их типом данных для хранения комплексных чисел (в данном случае — Float). Ada не поддерживает неявные преобразования типов, поэтому все преобразования выполняются в явном виде.

with Ada.Text_IO,
     Ada.Integer_Text_IO,
     Ada.Float_Text_IO,
     Ada.Numerics.Elementary_Functions,
     Ada.Text_IO.Complex_IO,
     Ada.Numerics.Generic_Complex_Types,
     Ada.Numerics.Generic_Complex_Elementary_Functions;
use Ada.Text_IO, Ada.Integer_Text_IO, Ada.Float_Text_IO;

procedure QuadraticEquation is
     package Complex_Types is new Ada.Numerics.Generic_Complex_Types (Float);
     package Complex_Functions is new Ada.Numerics.Generic_Complex_Elementary_Functions(Complex_Types);
     package Complex_IO is new Ada.Text_IO.Complex_IO (Complex_Types);

     use Complex_Types, Complex_Functions, Complex_IO;

     A,B,C,D: Integer;
     A2f, Bf, S: Float;
     Dc: Complex;
begin
     Put("A = ");
     Get(Item => A);
     if A = 0 then
           Put_Line("Not a quadratic equation.");
           return;
     end if;
     Put("B = ");
     Get(B);
     Put("C = ");
     Get(C);
     A2f := Float(2*A);
     Bf := Float(B);

     D := B*B-4*A*C;
     if D = 0 then
           Put("x = ");
           Put(-Bf/A2f);
      elsif D > 0 then
           S := Ada.Numerics.Elementary_Functions.Sqrt(Float(D));
           Put("x1 = ");
           Put((-Bf+S)/A2f);
           Put_Line("");
           Put("x2 = ");
           Put((-Bf-S)/A2f);
     else
           Dc := Compose_From_Cartesian (Re => Float(D), Im => 0.0);
           Put("x1 = ");
           Put((-Bf+Complex_Functions.Sqrt(Dc))/A2f);
           Put_Line("");
           Put("x2 = ");
           Put((-Bf-Complex_Functions.Sqrt(Dc))/A2f);
     end if;
end QuadraticEquation;

4) рекурсивное определение чисел Фибоначчи

with Ada.Text_IO, Ada.Integer_Text_IO;

procedure Fibonacci is
begin
     declare
           function Fib (N: Integer) return Integer is
           begin
                 if N<3 then
                       return 1;
                 else
                       return Fib(N-1) + Fib(N-2);
                 end if;
                 end Fib;
     i: Integer := 1;
      begin
           loop
                 Ada.Integer_Text_IO.Put (Item => Fib(i), Width => 1);
                 Ada.Text_IO.Put (", ");
                 i := i + 1;
                 exit when i=17;
           end loop;
           Ada.Text_IO.Put ("...");
     end;
end Fibonacci;

© kool

Источники:

Progopedia.Ru,
Bourabai.Ru


В начало


История языка
Особенности языка
Синтаксис
Примеры программ

Программирование | Ada



Рейтинг@Mail.ru Яндекс.Метрика