[00:02:33] <ada_ru> (I_vlxy_I) боинг небось
[00:09:10] <ada_ru> (I_vlxy_I) "We see here three Boing children in their early development feeding on the River."
[00:09:17] <ada_ru> (I_vlxy_I) https://www.youtube.com/watch?v=WdYGW2E9AXM
[08:20:05] <ada_ru> (Gourytch)  отвечает (Olesia) на <>
интересно, что именно новых людей привлекает в аде: строгая типизация, страндартизованная мнозозадачность или же возможность толкнуть спам в чатике? )
[08:52:34] <ada_ru> (Vinpuh)  отвечает (Gourytch) на <интересно, что именн…>
Все сразу.👍😎
[10:52:52] <ada_ru> (Denis) Подскажите, есть какие-нибудь подводные камни при использовании стека для больших переменных в declare блоках?
Исключительно из эстетических соображений не хочется new/Unchecked_Deallocation/Finalization использовать из-за пары здоровенных массивов.
Целевая система: Linux,x86_64,gnat
Лимит на стек отключён: ulimit -s unlimited
И вроде всё работает, но как-то нет уверенности...
[11:23:41] <ada_ru> (Максим) Ну это влияет только на размер стека. Если этот код будет испольняться в задаче, то стека задачи может не хватить. У каждой задачи свой же стек, размер которого можно задать через Storage_Size. Если количество задач большое, то можно упереться в ограничение размера виртуального пространства, особенно на 32 битах. Для однозадачной программы это не критично, просто нужно не упереться в ulimit.
[11:27:12] <ada_ru> (I_vlxy_I) А можно же через ulimit сделать бесконечный стек.
[11:36:04] <ada_ru> (anisimkov) Бесконечного ничего нету. Большие данные лучше распределять в памяти. Если в ломы освобождать, воспользуйся пакетом Ada.Finalization. Или есть еще попроще вариант. Если объявить access тип в блоке, ну или в процедуре, что то же самое, создать в этом блоке переменную этого типа, присвоить этой переменной значение через оператор new, то по завершению работы этого блока вся память указанная из этих переменных этого типа будет освобождена.
[11:43:14] <ada_ru> (I_vlxy_I) Стек будет такой же бесконечный как и хип
[11:43:31] <ada_ru> (I_vlxy_I) Чисто технически
[12:14:22] <ada_ru> (Лекс)  отвечает (Gourytch) на <интересно, что именн…>
Меня например привлек читаемый синтаксис и "инженерность" языка: семантика, синтаксис и типизация выглядят логически стройными и продуманными.

Хотя пару лет назад от Паскале синтаксиса я воротил головой😂
[12:31:48] <ada_ru> (I_vlxy_I) Да Паскаль ваще капец. Не то что Ада :-)
[12:32:11] <ada_ru> (I_vlxy_I) Ну, реально исходники сильно по разному выглядят.
[12:37:27] <ada_ru> (anisimkov)  отвечает (I_vlxy_I) на <Стек будет такой же …>
Если Ада task не пользоваться.
[12:37:37] <ada_ru> (anisimkov) да и то не уверен.
[12:38:17] <ada_ru> (anisimkov) найти себе оправдание использовать стек криво можно, только к улучшению качества программы это не имеет никакого отношения.
[12:41:18] <ada_ru> (I_vlxy_I)  отвечает (anisimkov) на <Если Ада task не пол…>
Ну, я хз что там в Аде, но в Си он точно будет бесконечным :-)
[12:41:33] <ada_ru> (I_vlxy_I) Плюс бывает segmented stack
[12:42:23] <ada_ru> (anisimkov) Раз за С программистов, не искренне
[12:42:34] <ada_ru> (I_vlxy_I) С чего все взяли, что место на стеке это что-то более дефицитное нежели место в куче я хз.
[12:48:09] <ada_ru> (Gourytch)  отвечает (I_vlxy_I) на <С чего все взяли, чт…>
вероятно со времён SS:SP =)
[12:48:25] <ada_ru> (I_vlxy_I) Жуть!
[12:48:41] <ada_ru> (anisimkov) большие данные в стеке еще неэффективно потому что при передаче их наверх приходится копировать полностью.
[12:49:48] <ada_ru> (I_vlxy_I)  отвечает (anisimkov) на <большие данные в сте…>
Э? Зачем их копировать полностью?
[12:49:55] <ada_ru> (I_vlxy_I) Почему ссылку не дать?
[12:52:13] <ada_ru> (Gourytch) передавая ссулку на данные в стеке можно огрести интересных ошибок )
[12:52:29] <ada_ru> (anisimkov) всяко бывает. или в контейнер например положить.
[12:52:30] <ada_ru> (anisimkov) если есть большие данные, надо че то с ними делать. А если создать и забыть, зачем тогда они вообще.
[12:52:52] <ada_ru> (anisimkov) ссылку можно передать только вниз, наверх нельзя.
[12:53:08] <ada_ru> (anisimkov) потому что это стек.
[12:53:22] <ada_ru> (I_vlxy_I)  отвечает (anisimkov) на <ссылку можно передат…>
Кажется у нас разное понимание верха и низа :-)
[12:54:49] <ada_ru> (I_vlxy_I) И я не уверен что тут нельзя в оптимизацию. Не для этого ли второй стек в Аде?
[12:55:16] <ada_ru> (anisimkov) возможно.
[12:55:17] <ada_ru> (anisimkov) в одну сторону, то есть.
[12:55:23] <ada_ru> (anisimkov) можно еще про вверх-вниз подискутировать. Для меня главная процедура вверху, и все вызовы вниз.
[12:55:42] <ada_ru> (anisimkov) Я почему то всегда так думал. и так говорил, и меня понимали всегда, А что есть другие мнения ?
[12:56:56] <ada_ru> (anisimkov) Второй стек в Ада есть, тем не менее, если попытаешься передать ссылку на строку вверх во первых тебе не дадут обычными средствами, а если выкрутишься хаками, просто уронишь программу.
[12:59:43] <ada_ru> (I_vlxy_I)  отвечает (anisimkov) на <Я почему то всегда т…>
Да. У меня обратная картина мира :-)

Даже в терминах стека - верхушка это самое свежее что туда положили
[13:00:02] <ada_ru> (anisimkov) ладно.
[13:00:18] <ada_ru> (I_vlxy_I) https://neerc.ifmo.ru/wiki/index.php?title=Стек
[13:00:25] <ada_ru> (I_vlxy_I) То есть head
[13:01:10] <ada_ru> (anisimkov) для меня программа это не стек а вызовы подпрограмм, которые ниже. такой вот у меня мир.
[13:01:21] <ada_ru> (anisimkov) а стек вторичен и вспомогателен
[13:02:05] <ada_ru> (I_vlxy_I) Ну, как бы стек вызовов...
[13:02:21] <ada_ru> (I_vlxy_I) Одно с другим тесно связано. Ну да ладно, разобрались.
[13:02:24] <ada_ru> (anisimkov) в общем это не принципиально. изображение на сетчатке глаза вверх ногами тоже,
[14:29:47] <ada_ru> (Denis) @anisimkov Я правильно понял про access, что имеется ввиду такое:
declare
  type T is array (Positive range <>) of Integer;
type Z is access T;
X : constant Z := new T'(1 .. 10 => 0);
begin
  null;
end;
При выходе из блока разве должна память высвободиться? В стандарте не смог найти такого.
[14:30:29] <ada_ru> (anisimkov) должна. Я пробовал.
[14:31:01] <ada_ru> (anisimkov) Я не помню где это в стандарте. Напиши тест, цикл и смотри на занятую память. не должна утекать.
[14:32:08] <ada_ru> (Denis) засунул это в бесконечный loop, программа сожрала всю память.
[14:32:20] <ada_ru> (anisimkov) странно. сейчас я попробую.
[14:35:41] <ada_ru> (anisimkov) И правда течет. Странно. Или я не прав, или это баг. Поразбираюсь.
[14:41:44] <ada_ru> (Denis) Надо разобраться, как соотносятся "у каждой задачи свой стек" и настройка в системе unlimited. Пробовал в нескольких задачах большие массивы создавать в стеках. Вроде память уходит линейно, как положено...
[14:49:32] <ada_ru> (Максим) Опять хотят нейронные сети на Аде! https://www.ada-ru.org/forum/p2600761075_1.html
[14:50:07] <ada_ru> (anisimkov) насчет access type в блоке я был не совсем прав. что бы так было надо Storage_Pool там объявить свой.
[14:51:05] <ada_ru> (anisimkov) хотя, я помню что память освобождалась. может че то потеряли в гнате.
[14:52:42] <ada_ru> (Максим)  отвечает (anisimkov) на <найти себе оправдани…>
Ну вот взять, к примеру, модуль в стандартной Адской библиотеке для матриц. Там произведение матриц сделано как функция, т.е. всё через стек. Видимо они тут ничего кривого не видят
[14:53:36] <ada_ru> (Максим)  отвечает (anisimkov) на <хотя, я помню что па…>
Да, так было раньше, кажется
[14:54:44] <ada_ru> (anisimkov) https://www2.adacore.com/gap-static/GNAT_Book/html/aarm/AA-13-11.html
2.a то есть зависит от реализации. похоже реализацию упростили что ли.
[15:01:33] <ada_ru> (Максим) Можно ещё через Storage_Size, если я правильно понимаю ARM 13.11 (18):

If Storage_Size is specified for an access type, then the Storage_Size of this pool is at least that requested, and the storage for the pool is reclaimed when the master containing the declaration of the access type is left.
[15:02:00] <ada_ru> (anisimkov) Во, тоже дело. попробую щас.
[15:05:40] <ada_ru> (Максим) да, так не растёт: https://pastebin.com/BPnfsdww
[15:07:38] <ada_ru> (anisimkov) Да, не растет
procedure Main is
  type T is array (0 .. 1000) of Integer;
begin
  loop
     declare
        type Z is access all T;
        for Z'Storage_Size use 2_000_000;
        X : Z;
     begin
        X := new T;
        delay 0.001;
     end;
  end loop;
end Main;
[15:14:12] <ada_ru> (anisimkov) только приходится размер пула задать. Ну взять пул из ГНАТ рантайма который без ограничений и его вставить в этот блок.
[15:14:19] <ada_ru> (Лекс)  отвечает (Максим) на <Опять хотят нейронны…>
Я тоже хочу 😏 Может кто-нибудь уже сделает? 😃
[15:14:23] <ada_ru> (Максим)  отвечает (Denis) на <Надо разобраться, ка…>
Я имел ввиду, что если ты для задачи ставишь стек в 1Мб, то ты не сможешь создать 4096 задач на 32-битной системе, просто потому, что там виртуальное пространство 4Гб
[15:15:00] <ada_ru> (Максим) Можем запилить виртуальную конференцию и выбрать того, кто запилит! 😋
[15:15:27] <ada_ru> (I_vlxy_I)  отвечает (Максим) на <Опять хотят нейронны…>
Надо его с Антоном из англоязычного чятика познакомить.
[15:16:16] <ada_ru> (Лекс) А что, Ада на llvm тоже есть?
[15:16:28] <ada_ru> (I_vlxy_I) Ещё нет
[15:16:35] <ada_ru> (I_vlxy_I) Но, вероятно, будет.
[15:17:24] <ada_ru> (Лекс) вероятно 😃
[15:17:52] <ada_ru> (Максим) Можно сказать, Ада на LLVM уже есть, но исходники пока ещё не открыли
[15:18:21] <ada_ru> (I_vlxy_I)  отвечает (Лекс) на <вероятно 😃>
Главное чтобы оно было не в виде пилота, который потом выкинут(как это было с jvm и с LEGO), а на постоянку
[15:18:36] <ada_ru> (Максим)  отвечает (Лекс) на <вероятно 😃>
вероятно уже в этом месяце 😊
[15:20:34] <ada_ru> (anisimkov) вот еще что есть 25
   A storage pool for an anonymous access type should be created at the point of an allocator for the type, and be reclaimed when the designated object becomes inaccessible.  Сейчас попробую.
[15:21:16] <ada_ru> (I_vlxy_I)  отвечает (anisimkov) на <вот еще что есть 25
…>
Вроде ж память должна освобождаться когда тип становится недоступным. Не?
[15:24:11] <ada_ru> (anisimkov) текёть
[15:24:57] <ada_ru> (anisimkov) можно это устроить с помощью отдельного Storage_Pool или Storage_Size, но по умолчанию они это не поддержали.
[15:26:16] <ada_ru> (I_vlxy_I) Хех. А нет ли тут бага?
[15:26:32] <ada_ru> (anisimkov) нет, это пожелание для реализации, а не требование.
[15:28:00] <ada_ru> (I_vlxy_I) :-(
[15:28:01] <ada_ru> (anisimkov) хотяя ... смотря как интепретировать should
[15:28:04] <ada_ru> (I_vlxy_I) Хреново
[15:28:25] <ada_ru> (I_vlxy_I)  отвечает (anisimkov) на <хотяя ... смотря как…>
should в rfc это обычно требование
[15:28:32] <ada_ru> (anisimkov) ну обойтись можно, одной или двумя доп строками на блок.
[15:29:36] <ada_ru> (I_vlxy_I)  отвечает (I_vlxy_I) на <should в rfc это обы…>
Не прав. Это настоятельная рекомендация
[15:29:44] <ada_ru> (anisimkov) Ну если кто желает, можете накатать требование, к заказчикам отношение более внимательное будет.
[15:29:57] <ada_ru> (I_vlxy_I) https://www.ietf.org/rfc/rfc2119.txt
[15:30:14] <ada_ru> (I_vlxy_I) 3. SHOULD   This word, or the adjective "RECOMMENDED", mean that there
  may exist valid reasons in particular circumstances to ignore a
  particular item, but the full implications must be understood and
  carefully weighed before choosing a different course.
[15:30:47] <ada_ru> (anisimkov) думаю для своих заказчиков фирма поспешит выполнить настоятельную рекомендацию RM
[15:40:43] <ada_ru> (I_vlxy_I) Посмотрел на тему IntelliJ Idea и Адских перспектив - кажется не реально сделать на связке Идея + плагин для Ады полноценную среду разработки для Ады.

Дебаггер и прочее реально сделать только для Clion. А он платный.

Таким образом, можно сделать отличную платную IDE на базе clion‘a если развивать тот плагин.
[15:40:54] <ada_ru> (I_vlxy_I) Но я не знаю стоит ли овчинка выделки.
[15:41:33] <ada_ru> (I_vlxy_I) Если отладчик и профайлер аде не нужны, то и на базе идеи конечно можно...
[15:44:57] <ada_ru> (I_vlxy_I) Вопрос: это имеет смысл вообще?
[17:08:18] <ada_ru> (I_vlxy_I) Максим а для еклипсы есть/будет что в свободном доступе?
[17:08:58] <ada_ru> (Максим) врядли, они же gnatbench не выкладывают 😕
[17:14:36] <ada_ru> (Максим) Есть gnatbench-2.8.1-bin.zip из gnat gpl 2014
[17:15:26] <ada_ru> (Максим) там и исходники есть...
[17:17:02] <ada_ru> (I_vlxy_I) Можно конечно через lsp попробовать что-то своё намутить...

Ещё, как вариант, можно аду подружить через lsp с Qt Creatorом
[17:17:38] <ada_ru> (Максим) Эх. Где время на всё найти
[17:18:58] <ada_ru> (I_vlxy_I) Ага
[17:19:52] <ada_ru> (I_vlxy_I) Либо писать на аде, либо пытаться допилить под Аду IDE. И это точно не на аде.
[21:22:12] <ada_ru> (I_vlxy_I) глянул исходники растового плагина к еклипсе (на базе lsp) вроде кода не много. И это радует.
[21:22:22] <ada_ru> (I_vlxy_I) вопрос в том, насколько это вообще юзабельно
[21:22:42] <ada_ru> (I_vlxy_I) чот растовики обосрали этот вариант для раста в растачате
[22:49:13] <ada_ru> (I_vlxy_I) попробовал eclipse - вспомнил всё за что я её ненавидел
[22:51:00] <ada_ru> (I_vlxy_I) эта офигенная идея, что давайте не дадим программисту явным образом запускать сборку проекта, давайте билдить в фоне! и давайте не показывать ему лог сборки - прогрессбара будет достаточно.
[23:39:38] <nordwind> Чё то современные погромиста напоминают мне игроков в майнкрафт
[23:40:58] <ada_ru> (I_vlxy_I) ы?
[23:43:37] <nordwind> Вместо того чтобы писать софт для решения задач прикладных, пишут инструменты для написания софта на языке n, инструменты для написания инструментов для написания софта, для написания инструментов... Ну и т. Д. Нафига переписывать на каждом языке одно и тоже. Возьми топор и сруби уже дерево наконец.
[23:44:00] <ada_ru> (Lieutenant_Commander_Data) Так ни одного дерева не останется
[23:44:39] <nordwind> Причем этим страдают поголовно  все погромисты на всех языках
[23:44:53] <ada_ru> (I_vlxy_I)  отвечает на <(nordwind) Вместо то…>
та не. я на работе деревья рублю.

а дома ковыряю всякое
[23:44:57] <ada_ru> (I_vlxy_I) хотя иногда снова деревья
[23:45:59] <nordwind> Может моя натура инженерная противится такому, я не знаю
[23:46:10] <ada_ru> (I_vlxy_I) хотя по работе у меня есть задачи по инструментарию, да. связанные с кодкавереджем и анализом работы программ
[23:47:01] <ada_ru> (I_vlxy_I)  отвечает на <(nordwind) Может моя…>
тебе в стан Го 🙂 там тебе сразу дают огромную кувалду и указывают на глыбу которую нужно превращать в мелкие осколки. альтернатив нету. только эта глыба и эта кувалда
[23:47:30] <nordwind> Но в целом мне пофиг на каком языке написана программа, если она выполняет свою задачу.
[23:49:27] <ada_ru> (I_vlxy_I) ну вот и я пытаюсь найти программу которая будет нормально выполнять свою задачу 🙂
[23:49:59] <nordwind> И я не понимаю зачем переписывать хорошо написанную и работающую вещь на языке x, кроме может учебных целей, да и то сознание того что твоя учебная штука никуда не применится в результате будет коробить
[23:50:41] <ada_ru> (I_vlxy_I) а кто-то переписывает?
[23:52:59] <nordwind> А вы выше не пытались растровый код на аде переписать?
[23:54:25] <nordwind> Почему gps не использовать? Чем он хуже идеи?
[23:55:31] <nordwind> Ну точнее, наверняка хуже. Но почему не улучшить его вместо идеи?
[23:56:18] <ada_ru> (I_vlxy_I) потому, что юзать 100500 разных IDE в работе не очень удобно
[23:56:45] <ada_ru> (I_vlxy_I) ну и да, это инициатива AdaCore
[23:57:05] <nordwind> Ну так для ады gps  хорош?
[23:57:42] <nordwind> Он же вроде универсален тоже
[23:57:53] <ada_ru> (I_vlxy_I) возможно. но я например пользуюсь еще несколькими языками. и для них для всех инфраструктура от jetbrains'a удобна и готова.
[23:58:02] <ada_ru> (I_vlxy_I) и всё унифицировано
[23:58:21] <nordwind> Кроме ады.
[23:59:03] <ada_ru> (I_vlxy_I) именно
[23:59:18] <nordwind> Вот я и пытаюсь сказать что для гвоздей молоток, а для болтов ключи.
[23:59:22] <ada_ru> (I_vlxy_I) напрашивается очевидный выход 😊
[23:59:31] <ada_ru> (I_vlxy_I) надо аду туда втащить
[23:59:50] <ada_ru> (I_vlxy_I) ну и GPS конкретно архаично смотрится по многим параметрам