gnat
Реализация языка программирования AdaGNAT — один из самых популярных компиляторов языка Ada. Изначально его название было аббревиатурой GNU NYU Ada Translator, но сейчас это потеряло смысл. Фронтэнд и библиотека времени исполнения написаны на Аде. GNAT поддерживает все три диалекта языка — Ada 83, Ada 95 и Ada 2005.
Проект был начат в 1992, когда ВВС США заключили контракт с университетом Нью Йорка (NYU) на создание компилятора Ады с открытыми исходниками, чтобы помочь стандартизировать Ada 9X. Контракт на 3 миллиона долларов требовал использования GNU GPL для всех разработок и признания копирайта за FSF. Первая официальная проверка GNAT была проведена в 1995 г.
В 1994 и 1996 создатели GNAT организовали две родственные компании, Ada Core Technologies в Нью–Йорке и ACT-Europe в Париже, с целью обеспечить продолжение разработки и коммерческую поддержку GNAT. Обе компании были объединены и переименованы в AdaCore в 2004 г.
GNAT изначально выпускался отдельно от исходных текстов GCC. 2 октября 2001 исходные тексты GNAT были отправлены в репозиторий GCC CVS. Последней версией, выпущенной отдельно, был GNAT 3.15p, на базе GCC 2.8.1, 2 октября 2002. Начиная с GCC 3.4, на основных платформах официальные выпуски GCC проходят 100% тестов Ada ACATS, включённых в набор тестов GCC. В GCC 4.0 более экзотические платформы тоже проходят 100% ACATS.
Компилятор лицензируется на условиях GNU General Public License. Библиотека времени выполнения лицензируется либо под GNU General Public License (“GNAT GPL Edition” от AdaCore), либо GNAT Modified General Public License (GCC, GNAT Pro). GNAT — часть большинства дистрибутивов GNU/Linux и BSD.
Ссылки:
Примеры:
Hello, World!:
Пример для версий gnat 3.4.5with Ada.Text_IO;
procedure HelloWorld is
begin
Ada.Text_IO.Put_Line("Hello, World!");
end HelloWorld;
Факториал:
Пример для версий gnat 3.4.5В этом примере используется рекурсивное определение факториала.
Следует отметить, что для вывода на печать текста, целых и длинных целых чисел используются разные пакеты. Команда put в общем случае принимает несколько аргументов, изменяющих формат вывода: Item — это число, которое выводится на печать, Width — количество позиций, которые следует использовать при выводе, Fore и Aft — количества десятичных цифр, которые следует вывести до и после запятой и т.д. Если передается только один аргумент, он считается значением Item. Установив Width равным 1 или другому числу, меньшему, чем количество цифр в выводимом числе, можно вывести его без пробелов в начале (что является умолчательным способом для языка Ada).
Кроме того, отметим, что Ada не поддерживает неявные преобразования типов, так что для вычисления N*Fact(N-1) сначала следует явно преобразовать N к типу Long_Long_Integer.
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;
Числа Фибоначчи:
Пример для версий gnat 3.4.5В этом примере используется рекурсивное определение чисел Фибоначчи.
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;
Комментарии
]]>blog comments powered by Disqus
]]>