GNAT 2011, (с поддержкой многих фич стандарта А2012) |
1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!
GNAT 2011, (с поддержкой многих фич стандарта А2012) |
IUnknown |
17.06.2011 13:31
Сообщение
#1
|
a.k.a. volvo877 Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: 627 |
Итак, 14 июня вышла наконец долгожданная версия GNAT GPL 2011.
Много улучшений, новая версия самой IDE (теперь это версия 5.0.1, вместо 4.3.1 из 2009-ой версии, и 4.4.1 из 2010), мне нравится больше, чем прежняя, одна возможность фильтрации результатов компиляции чего стОит (хотя это вроде было и в 2010, но мне сравнивать не с чем, я сразу перешел 2009 -> 2011, поэтому все нововведения будут относительно предпоследней версии). Что говорит официальная страничка (комментарии - мои):
Сообщение отредактировано: IUnknown - 17.06.2011 14:40 |
TarasBer |
21.07.2011 19:22
Сообщение
#2
|
Злостный любитель Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: 62 |
Дизассемблер работает?
Кстати, где-то был полный список новых возможностей языка на русском, я потерял. Правда JIT-компиляции там так и нет... -------------------- |
IUnknown |
22.07.2011 0:19
Сообщение
#3
|
a.k.a. volvo877 Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: 627 |
Цитата Дизассемблер работает? Всегда работал, и в 2009 и в 2010 Pro, 2011 - в обоих версиях работает прекрасно, и в Pro и в GPL.Цитата где-то был полный список новых возможностей языка на русском, я потерял. Какое отношение JIT/AOT имеет к возможностям языка - непонятно... В лучшем случае - возможности компилятора.Правда JIT-компиляции там так и нет... |
TarasBer |
22.07.2011 9:41
Сообщение
#4
|
Злостный любитель Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: 62 |
> Всегда работал, и в 2009 и в 2010 Pro, 2011 - в обоих версиях работает прекрасно, и в Pro и в GPL.
Странно, что же у меня не то... А про стандарт есть что почитать? Спойлер (Показать/Скрыть)
-------------------- |
IUnknown |
22.07.2011 10:45
Сообщение
#5
|
a.k.a. volvo877 Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: 627 |
Вот основное, что добавилось в Стандарт:
1. AI-0176 Quantified expressions (Показать/Скрыть)
2. AI-0128 Inequality is a primitive operation (Показать/Скрыть)
3. AI-0008 General access to constrained objects (Показать/Скрыть)
4. AI-0214 Defaulted discriminants for limited tagged (Показать/Скрыть)
5. AI-0102 Some implicit conversions are illegal (Показать/Скрыть)
6. Preconditions/Postconditions (Показать/Скрыть)
7. Conditional expressions/Case expressions (Показать/Скрыть)
8. In-out parameters for functions (Показать/Скрыть)
Насчет второй части вопроса - чуть позже... |
TarasBer |
22.07.2011 10:59
Сообщение
#6
|
Злостный любитель Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: 62 |
По пункту 1 - фича интересная, правда пока её применение слишком узкое. Ну вот поиск какого-нибудь ненулевого элемента в массиве с её помощью организовать можно? Чтобы она не только сообщала о наличии такого элемента, но и возвращала индекс.
По пункту 7 - как-то конструкцию обрезали, не хватает end if и end case, единообразия нету. В качестве операторных скобок сделали круглые. -------------------- |
IUnknown |
22.07.2011 12:04
Сообщение
#7
|
a.k.a. volvo877 Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: 627 |
Цитата Ну вот поиск какого-нибудь ненулевого элемента в массиве с её помощью организовать можно? Внимательно название фичи прочел? Quantified expressions - это вообще-то кванторы. То есть, предусловие для определения упорядоченности выглядит практически так:(∀x ∈ Arr'Range) P(x) , где P - предикат "Arr(i - 1) меньше Arr(i)" Это высказывание может быть истинным или ложным. Можешь написать высказывание, которое будет определять, есть ли в массиве ненулевой элемент, и кроме этого возвращать его индекс? |
TarasBer |
22.07.2011 12:45
Сообщение
#8
|
Злостный любитель Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: 62 |
> Внимательно название фичи прочел? Quantified expressions - это вообще-то кванторы.
Ну мало ли. То есть нельзя, понятно. > Можешь написать высказывание, которое будет определять, есть ли в массиве ненулевой элемент, и кроме этого возвращать его индекс? Через костыли могу.
Да, порядок обхода не гарантирован, но в j вернётся любой индекс нужного элемента. -------------------- |
IUnknown |
23.07.2011 12:56
Сообщение
#9
|
a.k.a. volvo877 Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: 627 |
https://ideone.com/xUM1j ?
Сразу скажу насчет зачем понадобилось описывать функции Plus и Mult, почему бы не сделать "+"'Access и "*"'Access - потому что prefix of "Access" attribute cannot be intrinsic. Вот такое ограничение в языке... Цитата Через костыли могу. Костыли можно чуть-чуть выпрямить:function Just_Test (arr : Vector; Index : in out Integer) return Boolean is |
TarasBer |
25.07.2011 9:46
Сообщение
#10
|
Злостный любитель Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: 62 |
По пункту 5 - то есть раньше стандарт разрешал через указатель менять константу?! Странно, что только сейчас исправили.
По поводу кода, я пытаюсь его осмыслить. Я решил поэкспериментировать, насколько большую свободу даёт эта возможность:
Ограничений пока не вижу. Если так, то надо попробовать рисовалку графиков с этой фичей переписать, сравнить, насколько будет быстрее. Так вот, у меня вопрос. Что представляют собой объекты A,B,C? Простого указателя на функцию для их представления явно недостаточно, то есть в них также сидит и информация о параметрах, с которыми конструировали функцию. Каково, например, время жизни этих параметров? -------------------- |
TarasBer |
25.07.2011 13:34
Сообщение
#11
|
Злостный любитель Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: 62 |
В общем, решил я проверить скорость "лямбда-функций". Результаты оказались удручающие. По скорости они оказались ничуть не лучше, чем АСТ-дерево, а "байткоду", сделанному в формате массив данных вида "указатель на операцию, на левый аргумент, на правый аргумент, на результат", они сливают в два раза. Необходимость использовать в случаях, в которых важно время, такой массив очень неприятна - генерация этого массива из АСТ-дерева не так проста, как генерация лямбда-функции, а условные операторы очень геморны.
Самое плохое, на самом деле не это. Самое плохое тут то, что этот код работает только при полной оптимизации, иначе... переполнение стека (ОТКУДА): Спойлер (Показать/Скрыть)
Добавлено через 2 мин. Кстати, мне непонятно ограничение, запрещающее брать указатель от встроенных функций. Компилятор не может сам сделать то, что мы делаем руками - функцию-прокладку? -------------------- |
IUnknown |
26.07.2011 13:10
Сообщение
#12
|
a.k.a. volvo877 Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: 627 |
Цитата Самое плохое, на самом деле не это. Самое плохое тут то, что этот код работает только при полной оптимизации, иначе... переполнение стека Самое плохое - это то, что на некоторых ОСях это вообще работает, хотя не должно. Мне, скажем, под Debian-ом, не удалось заставить твою программу работать ни при каких настройках. Вообще, в Аде очень странное понятие "замыкания", откуда все эти проблемы и происходят. Как будет побольше времени - напишу подробнее о том, что делать можно, а чего нельзя, и как поступать в том случае, когда нельзя, но очень хочется...Сообщение отредактировано: IUnknown - 26.07.2011 13:10 |
IUnknown |
27.07.2011 2:05
Сообщение
#13
|
a.k.a. volvo877 Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: 627 |
Ну, вот такой пример отрабатывает в любом режиме, не только при полной оптимизации, надо будет только подумать, как запихать инициализацию пакета и получение из него Ret_Const в отдельную функцию:
Код (Показать/Скрыть)
Доп. пакеты прикрепил в архиве: Closures.zip ( 965 байт ) Кол-во скачиваний: 353 У меня на машине в Debug-сборке способ "с лямбдой" рвёт все остальные, кроме прямого подсчета: Plain => 0.384574123 При сборке Optimize картина становится вот такой: Plain => 0.000000443 , но все равно скорость лямбд выше чем у ACT-дерева больше чем в полтора раза... Теперь еще один вопрос: ты говорил, что у тебя сборка Optimize работала. А ты проверял, оно правильно считало (я про лямбды, разумеется)? Там точно получалось 36? Вообще, очень странно, если уж работать - то должно было как раз в дебаге, оптимизированная сборка наоборот не должна была отработать... |
TarasBer |
27.07.2011 9:40
Сообщение
#14
|
Злостный любитель Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: 62 |
> А ты проверял, оно правильно считало (я про лямбды, разумеется)? Там точно получалось 36?
Да, точно. А при отладочной сборке облом наступал при первой же попытке вычислить значение первого же Ret_Const. И я не могу точно назвать все комбинации галочек, которые дают выполняющийся код. Просто их в среде слишком много (перекинуть проект из отладочного в оптимизированный надо нажать 20 галочек на 3 вкладках, как вы работаете? Может у вас есть фирменная строка в gpr-файле, позволяющая перекидывать изменением одной директивы?). Так что можно написать баг-репорт. > package P1 is new IntPack(7); > надо будет только подумать, как запихать инициализацию пакета и получение из него Ret_Const в отдельную функцию: Я вот тоже не уверен насчёт того, что я смогу на пакетах, инициализируемых локально, создать экземпляр функции, который я смогу сохранить в глобальный объект. К тому же предполагается, что порядок действий и значение констант должны как бы вводиться пользователем, то есть порядок инициализации пакетов не должен быть мёртво вшит в код. Например, для моего варианта хоть порядок создания функций и задан руками, но я могу спокойно запихать создание функций в условный оператор, сделать массив функций итд. А массив пакетов создать я не могу. (И да, тему о всяких замыканиях, кажется, надо отделить). -------------------- |
IUnknown |
28.07.2011 19:17
Сообщение
#15
|
a.k.a. volvo877 Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: 627 |
Цитата К тому же предполагается, что порядок действий и значение констант должны как бы вводиться пользователем, то есть порядок инициализации пакетов не должен быть мёртво вшит в код. Например, для моего варианта хоть порядок создания функций и задан руками, но я могу спокойно запихать создание функций в условный оператор, сделать массив функций итд. В таком случае - только вот это:
Очень похоже на дерево, по скорости тоже почти одинаково, хотя все-таки этот способ чуть-чуть быстрее. |
Текстовая версия | 17.05.2024 15:29 |