В 1979, МО США создало первый черновой вариант документации по Аде, затем язык был стандартизован в 1983 году. Сейчас этот стандарт принято называть "Ада83", первоначально он находился под полным контролем со стороны МО США, и ни кто не мог создать компилятор с языка без авторизации оного со стороны Министерства Обороны.
Однако все изменилось в 1987 году, когда МО США предоставило Аду в публичное распоряжение, и на язык был создан стандарт Международного Института по Стандартизации (International Standards Organization (ISO)). К 1990 году появилось более 200 проверенных на соответсвие стандарту компиляторов с этого языка, еще познее в 1995 году появился новый стандарт назваемый Ада95. Ада в редакции 95го года стала полностью объектно-ориетированым языком, а также оснащена очень удобными средствами взаимодействия с кодом написаным на Си, Фортране, Коболе и прочих языках.
Где взять Аду?
Скорее всего вы думаете, что компилятор для такого мощного как Ада языка стоит очень и очень дорого, однако вы заблуждаетесь, вы наверное удивитесь, но один из наиболее мощных и популярных компиляторов с Ады95, GNAT (Gnu/New york University Ada Translator) не будет стоить вам ни копейки (за исключением технической поддержки, но только в том случае если вы захотите ее иметь).
GNAT можно скачать с FTP-сервера Нью-Йоркского Университета ftp://cs.nyu.edu из каталога /pub/gnat. В нем содержатся различные версии GNAT'а для различных ОС например Unix, включая SunOS/Solaris, Linux, NetBSD, SGI IRIX, IBM's AIX, DEC's Digital Unix.
Так же там существуют версии GNAT'a для WinNT, Win95, MacOS, и даже версия для DOS называемая "EZ2Load".
Учебник
Итак, Я думаю пора приступать к настоящему обучению. Конечно это не законченый учебник, это просто краткое введение, которое покажет вам базовую структуру программы на языке Ада и даст вам несколько готовых к компиляции примеров.
Сперва Я хочу чтобы читатель узнал что же такое Ада. Так же как и ее предшествинник Паскаль и ее кузен Си, Ада это структурый язык. Другими словами, программа на Аде это организованная последовательность различных секций, в то время как в неструктурных языках таких как Бейсик, вы можете писать что угодно и где угодно.
Также, Аде присуща своя собственная терминология, и Я далее буду использовать несколько таких слов, со значением которых вы возможно не знакомы:
· пакет (package), файл искодного кода программы в котором хранится определенный набор связанных по смыслу команд, которые делают например такие вещи как печать текста, математические вычисления, и т.д. Они в чем-то похожи на заголовки в языке Си, но не являются прямой аналогией.
(прим перев: они ближе к модулям в Турбо Паскале (хотя точнее на оборот, они слизаны с Ады)
· переменная (variable), это именованая область памяти в которой может хранится некоторое значение, например число, символ, или слово.
· предложение или инструкция (statement), команда для выполнения специфического действия.
Все программы на Аде имеют следующую базовую структуру:
with Имя_Пакета; use Имя_Пакета;
procedure Имя_Процедуры
Переменная : Некоторый_Тип_Значений;
begin
Предложение_1;
Предложение_2;
end Имя_Процедуры;
Имя_Процедуры часто является и именем программы.
(прим перев: В отличие от Паскале здесь нет выделенного блока begin - end, программой может считатся любая процедура библиотечного уровня (т.е. не вложеная в другую процедуру/функцию) без параметров).
Место где написано Переменная : Некоторый_Тип_Значений является объявлением переменной. Возможно вы спросите, а что значит "Некоторый_Тип_Значений"? Это означает какого типа значения могут хранится в переменной. Другими словами, если вы хотите иметь переменную для целых чисел вам необходимо написать Variable : Integer;. Если вам нужны числа с пляавающей запятой, то Variable : Float; и т.д.
Точки с запятой используются для завершения объявления переменной или в более общем случае любого предложения программы, позволяя вам разместить на одной строке более одного объявления переменной или предложения.
(прим перев: в Паскале они разделяют предложения, в результате имеется несколько исключений из правил! А в результате выбранного подхода в Аде их размещение производится на более интуитивном уровне).
Инструкция begin начинает последовательность настоящих команд программы.
Предложение_1; и Предложение_1; на самом деле ни чего не значат в Аде; в реальной программе на их месте будут настоящие команды, которые и будут выполнять необходимые нам действия.
Предлоджение end Имя_Процедуры; завершает последовательность команд программы. Теперь Я могу сказать вам, что эта маленькая "демо" програмка была нужна, чтобы просто показать вам структуру программы, но теперь мы можем посмотреть и на настоящую рабочую программу. По традиции ей будет, можно сказать, классическая ;-) программа выводящая "Hello World", которая обычно и используется при первом знакомстве с новым языком.
with Ada.Text_IO; use Ada.Text_IO;
procedure Hello_World is
-- А переменные нам здесь не нужны :)
begin
Put ("Hello world!");
end Hello_World;
Пакет "Text_IO" содержит множество функций для операций ввода/вывода;
он используется программами которым необходим вывод и получение текста.
(прим перев: как и в Си по множеству причин здесь нет "встроенных" операций для ввода/вывода, но есть стандартный пакет таких операций).
Так же Я должен заметить за чем нужно писать "Ada." перед "Text_IO". Поскольку Ада может взаимодествовать со множеством языков -- например вы можете связать со своей программой процедуры на Си или Коболе -- и может случится так что у вас будет множество библиотек с сотнями пакетов, поэтому необходимо указывать откуда их брать.
(прим перев: в Аде можно организовать набор пакетов в определенную иерархическую структуру со взаимными связями между кодом в них. В данном случает Text_IO это дочерний пакет от пакета Ada).
Процедура (и программа в данном случае) называется "Hello_World." Предложения "with" и "use" позволяют использовать команды из них в нашей программе. Если вы хотите запустить эту программу, вы можете сохранить ее под именем hello_world.ada. Замечание: если вы используете GNAT вы должны сохранить ее как hello_world.adb.
Поскольку эта программа не делает ничего кроме печати нескольких слов на экране, нам не потребовалось объявлять ни каких переменных, поэтому место в котором это обычно делается осталось пустым. Обратите так же внимание на двойной прочерк (--) перед "А переменные нам здесь не нужны :)". Эти прочерки говорят компилятору, что эта строка комментарий. Комментарий это строка текста программы которую компилятор проигнорирует. Поэтому если вы хотите добавить строку "А переменные нам здесь не нужны :)" в программу и затем запустить ее, вы обязаны добавить перед ней двойной прочерк, иначе компилятор подумает, что вы хотели использовать "А переменные нам здесь не нужны :)" как описание переменной, естесственно ничего не поймет и выдаст вам сообщение об ошибке. Предложение Put ("Hello world!"); служит собственно для печати текста на экране.
Даже если вам кажется, что использование скобок усложняет дело, они все равно нужны. Вы неможете просто взять и написать "Put "Hello world!";"!
Так же заметте, что многи имена начинаются с заглавных букв Notice also that many of the names begin with capital letters ("Text_IO" например). Это-го не требуется делать в обязательном порядке, но все же желательно делать так для удобства чтения ваших исходников.
Следующая программа несколько сложнее предыдущей. Она спрашивает у пользователя его/ее имя и затем печатает его на экране наряду с другим текстом:
with Ada.Text_IO; use Ada.Text_IO;
procedure Get_Name is
Name : String (1..80);
Length : Integer;
begin
Put ("Введите ваше имя> ");
Get_Line (Name, Length);
New_Line;
Put ("Привет ");
Put (Name (1..Length));
Put (", Я думаю вам понравиться изучать Аду!");
end Get_Name;
Как это все работает? Мы уже знаем, что такое Text_IO, а предложение procedure Get_Name is говорит само за себя
Переменная Name содержит имя введенное пользователем, а тип String (1..80) говорит компилятору о том, что Name это строковая переменная с длинной до 80 символов. Вторая переменная, Length, это целое число используемое для хранения действительной длинны строки введенной пользователем.
А теперь об остальном: когда программа выполняется, она печатает "Введите ваше имя> ", а затем ждет его ввода от пользователя. после того как он введет имя и нажмет Enter программа пропускает строку (New_Line;) и печатает "Привет [имя пользователя], Я думаю вам понравиться изучать Аду!".
Визуальное программирование на Аде?
Возможно у вас возник вопрос "А есть ли к Аде графическая среда разработки программ (IDE)?". Да, такие есть, одна из них, под названием ObjectAda, поставляется компанией Aonix, www.aonix.com (Прим. перев: Данный продукт построен в духе IDE от Microsoft для Visual С++)
ObjectAda существует в двух вариантах как для MS Windows, так и для X-Windows (X-Windows это стандартная оконная графическая система ОС Unix.)
Однако учтите, что это коммерческий продукт, правда он доступен для свободного скачивания в облегченном варианте и весит около 60~70Mb.
Ada -- это доведенный до логического завершения ( на данном этапе развития _науки_ программирования ) Pascal. Ada -- универсальный язык программирования и мощнейшее средство для software engineering. В равной степени пригодна для написания "зубочисток" из 50 строк на один-два прогона и для огромных особо надежных систем реального времени. Жестко определена стандартом языка. В язык встроены средства параллельного программирования, поддержка разноязыковых модулей, обработка исключительный ситуаций. Разговоры о ее чрезмерной сложности -- бред, вызванный тем, что она опередила свое время лет этак 6..10. Мощный инструмент не может быть простым -- "Дубли у нас простые" ( (с) "Понедельник...", Стругацкие ), но и слишком уж сложной я ее назвать не могу. Ada'е присущи строгость, логичность, ортогональность, симметричность. Она по-хорошему консервативна, несмотря на то, что в нее были введены революционные концепции, не понятые и не принятые серыми fortran-кодерами начала '80-ых годов, чем и объясняется ее сравнительно малое распространение. Первый стандарт вышел в '83, в '95 вышел второй стандарт, расширивший и симметризовавший язык. Для Ada'ы характерно очень жесткое следование стандарту, что делает программы на ней сравнительно легко переносимыми с платформы на платформу. !) Аналогии: Ada -- это Парфенон среди языков программирования, она величественна, изящна, строга и прекрасна. Если считать, что Pascal это МиГ-21, то Modula-2 это ( ранние версии ) МиГ-29 и ( нынешнее состояние ) МиГ-33, а Ada'83 -- Су-27, и Ada'95 -- Су-37, и, продолжая аналогию, C -- F-104, C++ -- F-117 ( much noise about nothing |) ). > Q 2: А чем Ada95 отличается от Ada83? Насколько я понял, > Q 2: в Ada95 есть ООП? Вот еще отличия: - иерархические библиотеки (child units); - пассивные мониторы наряду (protected records) с активными (tasks); - дополнительные средства управления паралеллизмом (асинхронная передача управления); - стандартные библиотеки для важнейших областей (системное программирование, системы реального времени, распределенные системы, информационные системы, численные рассчеты); - "мелочевка" типа ссылок на подпрограммы и возможность связывать сообщение с возбуждаемым исключением; > Q 3: Насколько я понял, в Ada95 есть ООП? А как оно > Q 3: реализуется? Подлинное там ООП (как на функциональных > Q 3: языках) или паскале-си подобное? "Паскале-си-подобное", хотя по форме на первый взгляд сильно отличается.