Мы не собираемся оспаривать это или доказывать, что Ада лучше, чем, например, Си (для этого есть конференции в Internet), а просто расскажем об опыте использования этого языка при реализации одного проекта.

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

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

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

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

Вопрос с обучением решился довольно просто: с сервера SimTel (oak.oakland.edu) была переписана интерактивная программа по обучению языку Ада, которая вкупе с очень хорошей книгой О.Н. Перминова2 составила базу для первоначального обучения языку. Уровень знаний, на который вывел участников проекта интерактивный курс, оказался достаточным, чтобы начать работу. Далее мы уже осваивали язык в основном опытным путем, пользуясь книгой в качестве справочного пособия.

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

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

В поиске информации об имеющихся в наличии компиляторах нам помогла все та же Internet. Коммерческие пакеты, с которыми можно работать (не студенческие варианты), стоят, даже по западным меркам, очень дорого - от 1000 долл. (все, что дешевле, подходит только для изучения Ады и создания простеньких программ), следовательно, их приобретение отпадало само собой. Вследствие непопулярности языка невозможно было найти и "пиратский" CD-ROM с достаточно современным (выпущенным не ранее 1995 г.) компилятором. Оставалось рассчитывать на бесплатно распространяемые программы. Проведя дополнительные изыскания, мы обнаружили разработанный в рамках проекта GNU многоплатформный компилятор GNAT (GNU New-York Ada Translator, cs.nyu.edu), который и выбрали в качестве основного. В силу сложившихся обстоятельств мы пользовались версией GNAT 2.0 for DOS, которая впоследствии была заменена на 3.01.

Компилятор GNAT работает в режиме командной строки, что может привести в ужас программистов, привыкших к интегрированным средам разработки Borland, Microsoft и т. д. Однако на самом деле пользоваться им не так уж трудно, если найти хороший текстовый редактор - этого вполне достаточно для реализации большинства возможностей среды разработки. Компилятор GNAT поддерживается утилитой GCC. Это надстройка над всеми GNU-трансляторами, которая анализирует расширение имени файла - параметра запуска - и вызывает соответствующий транслятор: для .adb - gnat, для .c - cc1 и т. д. В комплект поставки GNAT входят сам транслятор GNAT (gnat), транслятор языка Си (cc1), стандартная библиотека для языка Ада, некая библиотека Си, транслятор с языка ассемблера (gas), компоновщик (ld) и отладчик (gdb). Все инструментальные средства функционируют в среде DOS при поддержке программы-расширителя GO32, обеспечивающей до 128 Мбайт виртуальной памяти.

Отладчик GDB по первому впечатлению напоминает программу debug из MS-DOS (работает в диалоговом режиме), но в действительности он довольно удобный, достаточно мощный (позволяет устанавливать точки прерывания, следить за значениями избранных переменных) и практически никогда не зависает. Следует отметить надежность работы пакета в целом: как правило, любая задача легко снималась комбинацией клавиш +. Особо хотелось бы сказать о выдаче ошибок - с такой квалифицированной, точной и корректной системой анализа ошибок встречаешься нечасто. Если в Borland C одна ошибка в исходном тексте нередко приводит к множественным сообщениям об ошибках в разных местах, то GNAT очень точно определяет местонахождение ошибки и ее влияние на последующий текст. Текст выдаваемых сообщений об ошибках отличается ясностью и информативностью (это совсем не то же, что многословие!), позволяет быстро понять причину ошибки и исправить ее.

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

Дело в том, что компоновщик строит exe-файл, состоящий из трех частей: модуля, выполняющего запуск GO32, собственно исполняемой программы в формате COFF и отладочной информации. Размер последней подчас обескураживает: скомпонованная программа Hello World занимает около 150 Кбайт. Удаляется отладочная информация довольно хитрым способом: exe-файл конвертируется в формат COFF, обрабатывается не входящей в состав GNAT утилитой STRIP (она есть в поставке GCC) и снова преобразуется в exe-файл (который можно скомпоновать с GO32 - это около 80 Кбайт).

За 128 Мбайт виртуальной памяти приходится платить: GNAT - довольно прожорливое существо, и с ним можно работать (а не вечно ждать подкачки) минимум на 486DX-33 с 8 Мбайт оперативной памяти, причем чем больше памяти, тем лучше (тактовая частота не так важна). Подводя общий итог, можно сказать, что "бесплатно" не значит "плохо", особенно если программа разработана в рамках проекта GNU. Пакет GNAT может показаться непривычным, своеобразным (после интегрированных сред Borland), но это, несомненно, очень качественная разработка.

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

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

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


Евгения Михайловна Фрейдер и Михаил Юрьевич Фрейдер - студенты пятого курса Челябинского государственного технического университета. E-mail : adaman@prima.tu-chel.ac.ru

1 Джехани Н. Язык Ада. М.: Мир, 1988.

2 Перминов О.Н. Введение в язык программирования АДА. М.: Радио и связь, 1991.