1. Пользуйтесь тегами кода. - [code] ... [/code] 2. Точно указывайте язык, название и версию компилятора (интерпретатора). 3. Название темы должно быть информативным.
В описании темы указываем язык!!!
GNAT 2011, (с поддержкой многих фич стандарта А2012)
Итак, 14 июня вышла наконец долгожданная версия GNAT GPL 2011.
Много улучшений, новая версия самой IDE (теперь это версия 5.0.1, вместо 4.3.1 из 2009-ой версии, и 4.4.1 из 2010), мне нравится больше, чем прежняя, одна возможность фильтрации результатов компиляции чего стОит (хотя это вроде было и в 2010, но мне сравнивать не с чем, я сразу перешел 2009 -> 2011, поэтому все нововведения будут относительно предпоследней версии).
Что говорит официальная страничка (комментарии - мои):
Улучшенная поддержка А2012 (да, это - главная причина, по которой я обновился. Теперь есть возможность использовать все те фичи, которые на настоящий момент утверждены для нового стандарта, а не просто наблюдать сообщение, что это будет доступно в 2012 году, как было в прежней версии GNAT. Это и "in out" параметры для функций, и условные выражения, и Case-выражения, работают Quantified expressions, дискриминанты для лимитированных тэговых типов, Pre/Post-условия, и многое другое из того, что уже внесено в окончательную редакцию стандарта)
Улучшенные версии (GPS 5.0 - расширенная поддержка С/С++, более мощный редактор, повышенное юзабилити, GtkAda - новые виджеты, интерфейс к граф. библиотеке Cairo). (От себя добавлю, что в редакторе наконец-то сделали выпадающий список Pragma, и список атрибутов типа: )
Более гибкий и эффективный менеджер проектов
Поддержка выгрузки плагинов
Улучшенная поддержка конструкций на .NET-платформе
Более детальные сообщения об исключениях (при использовании ключа -gnateE)
полная поддержка платформы Lego Mindstorms NXT, включая аудио и I2C-сенсоры (об этом есть ролик на youtube, англ.: вот он)
Как видно, много народу хочет попробовать новую среду/новый компилятор - я скачивал пакет размером 140Мб почти 12 часов, скорость иногда падала до 2-3Кб/сек. Но сейчас с этим вроде справились.
Сообщение отредактировано: IUnknown - 17.06.2011 14:40
Ну, вот такой пример отрабатывает в любом режиме, не только при полной оптимизации, надо будет только подумать, как запихать инициализацию пакета и получение из него Ret_Const в отдельную функцию:
Код(Показать/Скрыть)
with Ada.Text_IO; use Ada.Text_IO; with Ada.Real_Time; use Ada.Real_Time; with IntPack; with FuncPack;
procedure Test is
package P1 is new IntPack(7); Fs01 : access function return Integer := P1.Ret_Const; package P2 is new IntPack(8); Fs02 : access function return Integer := P2.Ret_Const; package P3 is new IntPack(5); Fs03 : access function return Integer := P3.Ret_Const; package P4 is new IntPack(6); Fs04 : access function return Integer := P4.Ret_Const; package P5 is new IntPack(48); Fs05 : access function return Integer := P5.Ret_Const; package P6 is new IntPack(2); Fs06 : access function return Integer := P6.Ret_Const; package P7 is new IntPack(3); Fs07 : access function return Integer := P7.Ret_Const; package P8 is new IntPack(6); Fs08 : access function return Integer := P8.Ret_Const; package P9 is new IntPack(9); Fs09 : access function return Integer := P9.Ret_Const;
package P10 is new FuncPack("*", Fs03, Fs04); Fs10 : access function return Integer := P10.Second_Order; package P11 is new FuncPack("*", Fs05, Fs06); Fs11 : access function return Integer := P11.Second_Order; package P12 is new FuncPack("+", Fs08, Fs09); Fs12 : access function return Integer := P12.Second_Order; package P13 is new FuncPack("*", Fs07, Fs12); Fs13 : access function return Integer := P13.Second_Order; package P14 is new FuncPack("+", Fs01, Fs02); Fs14 : access function return Integer := P14.Second_Order; package P15 is new FuncPack("-", Fs14, Fs10); Fs15 : access function return Integer := P15.Second_Order; package P16 is new FuncPack("+", Fs15, Fs11); Fs16 : access function return Integer := P16.Second_Order; package P17 is new FuncPack("-", Fs16, Fs13); Fs17 : access function return Integer := P17.Second_Order;
type TNodeKind is (nkConst, nkAdd, nkSub, nkMul);
type TNode is record Kind : TNodeKind; Value : integer; L, R : access TNode; end record;
Nodes : array (1 .. 17) of aliased TNode;
function Add (l,r : integer) return integer is begin return l+r; end; function Sub (l,r : integer) return integer is begin return l-r; end; function Mul (l,r : integer) return integer is begin return l*r; end;
function Get_Value (T: TNode) return Integer is begin case T.Kind is when nkConst => return T.Value; when nkAdd => return Add (Get_Value (T.L.all), Get_Value (T.R.all)); when nkSub => return Sub (Get_Value (T.L.all), Get_Value (T.R.all)); when nkMul => return Mul (Get_Value (T.L.all), Get_Value (T.R.all)); end case; end;
type TCommand is record proc: access function (l,r : integer) return integer; arg1, arg2, res: access integer; end record; Commands : array (1 .. 8) of TCommand; Data : array (1 .. 17) of aliased integer := (7, 8, 5, 6, 48, 2, 3, 6, 9, others => <>);
T: Time; Times: constant integer := 10_000_000;
begin -- вычисляем непосредственно -- 0.00 сек T := Clock; for j in 1 .. Times loop Data(17) := Sub ( Add (Sub (Add (7, 8), Mul (5,6)), Mul (48,2)), Mul (3, Add (6, 9))); end loop; Put_Line ("Plain => " & Duration'Image (To_Duration (Clock - T)));
T := Clock; for j in 1 .. Times loop Data(17) := Fs17.all; end loop; Put_Line ("Fs => " & Duration'Image (To_Duration (Clock - T)));
T := Clock; for j in 1 .. Times loop for i in Commands'Range loop Commands(i).res.all := Commands(i).proc(Commands(i).arg1.all, Commands(i).arg2.all); end loop; end loop; Put_Line ("Commands => " & Duration'Image (To_Duration (Clock - T))); end Test;
, но все равно скорость лямбд выше чем у ACT-дерева больше чем в полтора раза...
Теперь еще один вопрос: ты говорил, что у тебя сборка Optimize работала. А ты проверял, оно правильно считало (я про лямбды, разумеется)? Там точно получалось 36? Вообще, очень странно, если уж работать - то должно было как раз в дебаге, оптимизированная сборка наоборот не должна была отработать...