to post messages and comments.

У AdaCore обновилась страница загрузки GNAT
На один дебилизм стало меньше. Раньше у них выбор начинался с года, а потом шли платформы. Если в каком-то году нет платормы, то её даже в списке не было. Потом сделали, чтоб было, но серого цвета. Это касается всяких экспериментальных платформ типа LEGO NXT MindStorm, на смену которому пришёл ARM для голых досок. А также JVM и CLI, которые кроме гуглострадальцев (AppEngine) оказались почти никому не нужны, когда есть нормальные (нативные) компиляторы. Если всё же хочешь скачать, перебирай разные года, пока не найдёшь нужный. Сейчас, если зайти в more platforms, все платформы в списке можно выбрать, и сам выбирается наибольший год выпуска.

Я бы ещё SPARK до 2012го года включительно отдельно выделял, потому что в старом СПАРКе аннотации для верификатора в комментариях специального вида пишутся, и это совместимо с, например, MapuSoft AdaMagic, BTC ObjectAda, BTC Apex Ada, Janus Ada, Irvine и пр. застрявшими между Ada 95 и Ada 2005, а аннотации SPARK 2014 пишутся в аспектах, которые поддерживает только GNAT. Понятно, что AdaCore не сильно заинтересованы в поддержке конкурентов.

Ещё заметил, что на страницу загрузки теперь можно попасть, не оставляя свой email.

Теперь, наверное, самым ожидаемым был бы кроссплатформенный пакетный менеджер с онлайн базой данных. Это было бы логичным продолжением линии развития gnatmake => gprmake => gprbuild+gprinstall. Даже в Делфи свой уже появился.

Когда случился несчастливый релиз Delphi 8, несчастливый тем, что там был только .NET, меня бесили немутируемые строки. Раньше же как-то работало с мутируемостью, а вот теперь не работает, и всё тут, счётчика ссылок не хватает. Дополнить трассирующую сборку мусора счётчиком ссылок кому-то религия не позволила, и из-за этого теперь страдать.

Много лет спустя пишу на Аде и обращаю внимание на то, что пишу практически в стиле единственного присваивания, благо адский declare-begin-end позволяет, и благо, начиная с Ada 2012 всё больше вещей можно записать выражениями. В этом плане Делфи уступает даже 83ей Аде. По принципу наименьших прав большинство значений между declare и begin — константы, и строки — соответственно, тоже. Кроме того, хотя есть Делфи-подобные строки (Unbounded_String в стандартной библиотеке и Universal_String в Матрёшке Вадима Годунко) со счётчиком ссылок, быстрее всего работают строки, размещаемые на стеке. Это которые самый обычный type String is array (Positive range <>) of Character, по принципу действия похожий на вариадические массивы в C99 и alloca(). После размещения на стеке у них размер поменять нельзя, а, значит, и нет особого смысла им не быть константой. И так получилось разделение на де факто немутируемые обычные строки и мутируемые строки в динамической памяти, похоже на String и StringBuilder .NET.

В каком-то смысле вернулся к тому, с чего начинал, с поправкой на то, что Unbounded_String как значение вполне себе пригоден для хранения в записях, массивах и контейнерах, в отличие от.

Попробовал GNAT 2017. Пишут, что там Ada 2020 уже начата. Первое, что приходит в голову:
Current_Amount := @ + Amount_To_Read;… работает. Вроде там ещё был новый синтаксис агрегата для инициализации матриц функцией от индексов. Остальное либо уже сделано, либо не будет сделано в собственно языке по идеологическим причинам.

Что больше всего понравилось — так это то, что ASIS4GNAT, GNATCOLL, XMLAda и AWS предкомпилированы, а то как-то раньше тупо было. Раньше надо было ставить не входящий в комплект MSYS или MSYS2, ставить не входящий в комплект make, и на них собирать AWS, GNATCOLL и пр. И объяснять, как это делать, желающим пересобрать твою программу.

Почему-то компилятор жутко тупит над производными типами. Вот, например, type TDateTime = type Double. Логично сделать так:

TDateTime(SysUtils.StrToFloat(…))Ан нет, E2089 Invalid typecast. Может, проблема в том, что результат StrToFloat — Extended, а не Double?
TDateTime(Double(SysUtils.StrToFloat(…)))Всё равно E2089 Invalid typecast. Да как же так? Сам ты инвалид!

Что самое удивительное, работает, если приведение типа НЕ ДЕЛАТЬ:
SysUtils.FormatDateTime(…, SysUtils.StrToFloat(…))Вот так компилируется и само приводится сквозь все Extended, Double и TDateTime, хотя я бы сильно не хотел, чтоб число с плавающей точкой случайно могло стать OLE датой/временем.

Ещё это сильно мешает привязки делать. По привычке возьмёшь напишешь type TPluginItem = type Pointer, и начинает тебе компилятор мозг выедать на ровном месте, а на неровном — соответственно, не выедать. Плюнешь, переделаешь в указатель на пустую запись с уникальным именем. Вот теперь получился указатель, который «не похож» на произвольно взятый другой указатель, но, к сожалению, всё ещё похож на указатель, чего лишний раз не хотелось бы, и от чего производный тип должен был спасти. Гипотетически для непохожести можно завернуть ещё дополнительно в запись, но тогда может сломаться работа с внешней библиотекой, ибо Delphi получает запись-результат всегда через дополнительный указатель, даже если она меньше размера двух указателей, как предписано stdcall. И тем более результат с плавающей точкой таким образом не приедет через регистр сопроцессора.

А вот на Аде берёшь и пишешь type OLE_Date_Time is new Long_Float или type Plugin_Item_Type is new Address, и работает это именно так, как ожидаешь. Одно в другое случайно не сконвертируется, а по требованию — всегда пожалуйста, без этих дурацких непонятных ошибок. И, конечно, на Аде, когда пишешь пакет, можно просто написать в публичной части type Plugin_Item_Type is private, и всё, внутреннее устройство для внешнего мира становится непрозрачно. Если нужно, функции конвертации из/в Address можно написать в дочернем пакете, чтоб глаза не мозолило в родительском. А то в Delphi, C и C++ вечно свалка в пространстве имён, хочется закрыться руками от падающих отовсюду в пространство имён гор мусора.

Увидел среди новых TLD .ads, пока без возможности регистрации. Наверное, хорошо подходит для адских библиотек, там по широко принятому соглашению .ads = ADa Specification, человеческий аналог заголовочных файлов.

Почитал сорцы в linuxrtl, бросилось в глаза MarshaledAString вместо PAnsiChar. Открыл System.pas, нашёл там при включенном NEXTGEN такое:
_PAnsiChr = _PAnsiChar;
MarshaledAString = _PAnsiChr;
При этом _PAnsiChar не объявляется, то есть, он встроенный. Без NEXTGEN _PAnsiChr = привычному PAnsiChar. Напрашивается мнение, что из MarshaledAString пытаются лепить типа-не-указатель, который надо класть в System.TMarshal. Судя по тому, что WriteLn(X) и X[0] := '2' компилируются, природа этого типа пока ещё не совсем замаскирована.

Также огорчило, что до сих пор нет нормальных 32битных символов и строк. В языке Ада они уже 12 лет как появились как неотъемлемая часть стандарта. Как можно идти на Линукс без 32битных строк? В API открытых библиотек Юникод, сколько я видел, любой libidn возьми, всегда представлен 32битными строками. Открыл System.pas, увидел там type UCS4Char = type Cardinal для всех платформ, где Cardinal — это беззнаковое 32-битное целое, а type … = type … в Делфи делает новый тип, не совместимый со старым без приведения типа, аналог адского type … is new …

Ещё посмотрев по сторонам, нашёл StdDefTypes.inc , а в нём — type wchar_t = Int32

Ни методов TMarshal, ни попыток аналогично скрыть указатель вроде Marshaled32String, ничего такого. Высокопоставленные китайские чиновники с именами из иероглифов за пределами BMP, а также все причастные, которым текст с этими именами надо обрабатывать, не одобряют это.

Windows 10 Creators Update: что нового в Bash/WSL и Windows Console
В то время как Win10 Anniversary Update поставлялся с поддержкой Ubuntu 14.04, в новом обновлении Win10 CU теперь WSL поддерживает Ubuntu 16.04.То есть, если хочется писать на Аде под роутер на MIPSe, теперь не надо искать, как бы так обновить встроенную Ubuntu до 15, чтобы не сломать.

Главой целью создания WSL было уменьшить «разрыв» по ощущениям, когда запускаешь инструменты Windows рядом с инструментами командной строки и окружениями Linux. Когда мы выпустили WSL в Windows 10 AU, то поместили Linux и Windows рядом друг с другом, но всё ещё был большой «разрыв» между ними — хотя обе системы могли иметь совместный доступ к некоторым файлам, каждое из окружений было довольно сильно изолировано от другого. Пользователи часто говорили, что хотят иметь возможность запускать приложения Windows и консоли Bash, и запускать приложения Linux и Windows. Так что мы добавили эту функцию! В Windows 10 Creators Update вы можете запускать приложения и инструменты Windows из консоли Bash.
Как раз то, чего не хватало. А то хочется dcclinux64.exe вызвать из линуксовых скриптов, а никак, или хочешь прямо из ФАРа запускать mips-linux-gnu-gnatmake и не можешь, тоже не очень здорово. Да, я знаю, что можно через plink и XMing как минимум в одну сторону срастить, и у меня Windows 2003 и Debian в соседних доменах Xen так и живут. А тут-то из коробки теперь. Удивительно видеть, как Microsoft опережает Apple в том, чтобы поддерживать Linux.

Ещё одной частой просьбой сообщества была поддержка в консоли больше чем 16 цветов. Поддержка 256 цветов и более очень важна при работе с современными всё более сложными и насыщенными инструментами командной строки, шеллами и т. д. В Win10 Creators Update консоль обновилась и поддерживает полный, прекрасный 24-битный цвет!
Я даже побежал в MSDN смотреть, какое там новое Console API для этого дела. Но не увидел. Тут советуют начинать любить Escape-последовательности. Эм, а как же гасить панели во всяких ФАР Менеджерах, если мы не можем прочитать буфер и потом восстановить его? Или теперь предлагаете буфер на виртуальном экране ncurses хранить? Вот так поворот.

В общем, пошёл обновляться.

В Делфи нет встроенной безопасной функции, обратной Ord, для произвольных перечисляемых типов. Чтоб, если я поделал арифметику и намылился привести тип обратно, программа не тихо проглотила ошибку, а сразу настучала, куда следует.

TestValue := TCalDayOfWeek(20);Такой оператор молча проглотил ошибку, что меня как адиста, конечно, возмущает.
TestValue := dowMonday + 20;Такой оператор не компилируется, но направление мысли было верным. Ещё немного подумав, я нашёл ближайший аналог на Делфи:
TestValue := dowMonday;
Inc(TestValue, 20);
В этом случае бросается ERangeCheckError, что и требовалось.

На Аде я бы написал TCalDayOfWeek'Val (выражение) без необходимости во временной переменной.

Но в языке Ада, наоборот, нет такого всеядного Inc, как в Делфи. Как адаисту, мне кажется, что это чаще разумно, чем нет. Если перечисляемый тип гоняется в число и обратно, пусть это всё в явном виде будет написано. А вдруг написан бред? Когда всё потенциально бредовое требуется в явном виде расписать, заметить бредовость легче.

В обоих языках появились конструкции для удобного перебора коллекций. for-in-do в Делфи и for-of-loop в языке Ада. Но в языке Ада можно и нужно возвращать ссылочный тип, и под такой перебор не нужно объявлять переменную, а в Делфи — нужно, и нужно именно затем, что оно всё будет при переборе постоянно копироваться и уничтожаться, хоть там какой развесистый record внутри. Но зато при переборе стандартного System.Generics.Collections.TDictionary в Делфи перебираем пары ключ-значение, а при переборе стандартного Ada.Containers.Hashed_Maps — только сами значения.

Заметил, что новые формы вызовов событий содержат const перед Sender: TObject. Действительно, ведь так оно и должно быть при ARC. В Делфи при работе со сложными структурами итого получается 4 режима передачи параметра: «» (ничего), «const», «var», «out». Им условно соответствуют адские режимы «» (ничего), «in», «in out», «out», но «» (ничего) — это на самом деле пропущенное указание режима «in», а делфёвому «» (ничего) нет прямого аналога. Режим «» (ничего) в Делфи — это когда вызывающий передаёт параметр, а вызываемый может его по своему усмотрению поменять. Всё бы хорошо, но для счётчика ссылок это не очень здорово, в большинстве случаев лишний раз зря тревожить, а это строки, COM-интерфейсы, массивы, да много всего. И повелось перед такими параметрами ставить в Делфи «const», а в силу лени — не ставить, где не надо. Пока не было ARC, для ссылок на объекты как раз было не надо, а теперь раз, и стало надо. В старом коде во всяких TNotifyEvent этого уже не поменять, и без того совместимость поломали знатно. Только в новых сигнатурах обработчиков получается писать как правильно.

Взял для разнообразия новый проект. Вот никогда не фанател от упрощённого стиля Windows 10. В Мак ОС Десять до сих пор кажется эстетичной Аква, а безальтернативная упрощёнка — это что-то мимо. Но, поди ж ты, оказывается, это востребовано. Хотят в этом стиле. А ещё хотят, чтоб в этом стиле и на Семёрке работало. Всё указывает на выбор Делфи как инструмента реализации. Они там давно (кажется, в XE2) встроили стилизацию и научились мимикрировать под элементы управления, обычно наблюдаемые только в Метро. Решающий вклад тут вносит, что со времён Делфи 2006 возобновлена раздача базовой версии на шару. Без этого приходилось постоянно иметь дело с натленной Делфи Семь, как у легальных пользователей, так и у пиратов, и нового софта не появлялось, соответственно, интересных заказов — тоже.

По этому поводу получил возможность забуриться в свежий Делфи Токио. И сравнить с Адой. Первым делом зашёл в настройки проекта посмотреть, как там дела по умолчанию со включениям проверок времени выполнения. Негусто. Всё выключено. Никак видеокодеки опять пишем или на Розеттакоде секундами меряемся. Часы моего времени на отладку дороже, поэтому всё врубил. Во всяком случае, всё, что смог, а было там только три галочки. Но совсем как в Аде писать всё равно не получилось. Не хватило ещё проверки указателя на null-nil до того, как пытаться по нему пройти. На Аде я могу забуриться внутрь сложного JSON значения, а если где-то что-то не нашлось, вылететь по известному исключению в обработчик, который ничего не сделает. В Делфи, по крайней мере, в стандартной библиотеке, если не брать мои CVariants, такая история не работает. Ну или лучше не пользоваться. «X.Values['ObjectKey'] as TJSONString» запросто может оказаться nil, и если дальше у него получить Value, то вылетает исключение Access Violation с доступом к первым байтам виртуальной памяти. Чё-т как-то не очень такое ловить. Лучше б что-то языковое бросалось ДО попытки вызвать метод через такой указатель.

Освежил воспоминания, почему @akastargazer так радовался, что в Обероне не надо так париться управлением памятью. Как адаисту со стажем, мне это было не очень понятно, что там париться, и зачем решать эти проблемы таким изуверским способом, а тут вот оно всплыло. За каждый TJSONObject и TJSONPair трясёшься, чтоб он только не утёк, если на полпути исключение вылетит. Всё огораживаешь в try-finally-FreeAndNil-end, всем значениям, которые могли бы при прочих равных быть промежуточными, даёшь имя переменной. В GNATCOLL.JSON такого страха не было, и в моих делфёвых CVariants такого страха нет. Там RAII и счётчик ссылок внутри. Но столбовой дорогой это до сих пор не стало.

Небольшое объявление о моих услугах. Я умею делать хитрые прокси. Очень разной степени хитрости.

Один мой клиент раньше делал запросы к чужим сайтам с айпишки пользователя средствами Java, но ему не нравилось, как оно у людей тормозило. Я ему на Ada Web Server сделал JSONP-прокси на локалхосте, залоченный на его сайт, с установщиком для Windows, и чтоб сворачивалось в значок. Он через этот прокси получал валидный для айпишки посетителя прямой URL файлов на всяких OpenLoad и показывал их на своём сайте в HTML5 плеере.

Другой мой клиент промышляет тем, что хостит SmartDNS+прокси для обхода геоблокировок британских ТВ-сервисов. В собственно прокси тут особо много интеллекта не нужно, sniproxy справляется, но нужно отсекать халявщиков и как можно меньше раздражать плательщиков. Соответственно, если обнаруживается на первый взгляд левый запрос, его нужно кинуть в личный кабинет, а если там по кукисам вдруг резко стало понятно, что он свой, просто ему провайдер IP поменял, то нужно оперативно обновить IP и бросить обратно. Тут я на netfilter+ipset сделал такую систему, которая хороших бросает на sniproxy, а плохих — на веб-сервер, который отпинывает в личный кабинет, ну а попутно принимает запросы на синхронизацию из этого кабинета. При синхронизации нужно добавить и/или убрать IP из ipset, а чтоб пользователь не ждал две минуты, удалить объект conntrack. Это две разных сишных библиотеки. И личный кабинет написать надо было, чтоб запросы и на сервер, и в базу корректные делал. Получилось хорошо. У кого IP меняется, действительно оперативно туда-сюда бросает.

Общая платформа исполнения приложений как последний шанс для Delphi и Ada
В обстановке, когда всякие разработчики нет-нет, да и «забудут» то про Delphi, то про Аду, Платформа — это соломинка, за которую делфистам и адаистам нужно ухватиться и держаться. Платформа предполагает целый комплекс мер по мотивации разработчиков использовать именно её, а не что-то другое. Тут и импортозамещение, и экспорт в сценарные языки программирования, более лёгкий, чем в SWIG, и многое другое, и попутно такие компоненты становятся доступны в Delphi и Ada с относительно удобным программным интерфейсом.

IDL, Interface Description Language
Как это повелось, у патриотов разных языков программирования и непрограммерские языки начинают окрашиваться, чтобы быть подогнанными: Lola для Oberon, VHDL и PL/SQL (существует поверх PostgreSQL и Firebird) для Ada. Вот и IDL есть Делфёвый ( #2821917 ), а был вроде ещё какой-то адский, и не просто бывший неадский перекрашённый для Ады, а прямо такой, что у истоков стоял и был раньше всех других. И вo FreeNode на #ada видел отсылки к так называемому Wulf's IDL, благо, штука, похоже, действительно глубоко вросла во всё. Она даже с PL/SQL оказалась до сих пор связана.

Влад куда-то пропал, не отвечает мне. А тут мне наш общий знакомый сказал, что он искал программера, со знанием Ада. Вот Я и думаю, нафига?
А еще он интересовался, как заходить на линух, без пароля

Занимается человек саморазвитием. Администрирование Линукса осваивает. Идеями безопасного программирования проникся, даже учителя ищет. С головой в учёбу ушёл, некогда ответить.

10 причин освоить язык Ada, если вы уже знаете C++ или Java
В Харьковском национальном университете имени В.Н.Каразина раз в два года проходит международная конференция «Компьютерное моделирование в наукоёмких технологиях». На секциях этой конференции можно выступить с докладом.

Также на Украине ежегодно проводится англоязычная международная конференция Dependable Systems, Services & Technologies (DESSERT). В DESSERT имеется секция посвящённая применению языка программирования Ada и других языков для критических к безопасности и надёжности приложениям Workshop on Ada Technology and Language Diversity (AdaLanD WS).

Там бы ещё не скакали и СБУ в свои застенки не тащило, и замечательно. Такая бы продвинутая страна была.

При преобразовании в C++ адские контролируемые типы проецируются на struct, при этом у них нет ни деструктора, ни перегруженной операции присваивания. Вместо этого компилятор оставляет в локальных контекстах rts_master_record, на которые навешиваются все контролируемые типы. Полагаю, это такое тяжёлое наследие ATC, на который в последних версиях компилятора GNAT, допустим, уже забили. Однако, в браузере, даже если я сам не использую ATC, вдруг то, что я написал, долго работало, и юзер нажал «остановить скрипт» — вот, пожалуйста, случился ATC. И AdaMagic сможет из этого выпутаться, при возврате управления понять, что и где нужно освободить. А на обычных платформах современный GNAT скомпилирует без этих штучек.

Утверждается, что AdaMagic поддерживает Ada 95 и некоторое подмножество Ada 2005, и звучит это обнадёживающе, так, что каждый может домыслить своё наиболее желаемое. Ну сложно ли сделать 32-битные строки, если уже есть 8- и 16-битные? Не сложно. Значит, наверное, сделали. Сложно ли чуть посахарить вызов методов, чтоб было объект.метод, как у protected, а не только метод (объект), как в чистой Ada 95? Не сложно. Значит, сделали.

Проверил. Ни черта этого нету.

Что это за подмножество Ada 2005 такое, без документации так и остаётся загадкой.

Тяжело без документации. Вот, например, в конфиге для Win32 написано: ptr_align = 2. А что это такое? Это выравнивание указателя по двум байтам (???), по двойке во второй степени или номер какого-то режима? А какие ещё режимы? Или вот ищешь «offset_arith_type» и находишь в поиске зияющее ничего. А ведь конфиг EmScripten должен в чём-то отличаться. Там строгое выравнивание по 4м байтам. Как это выразить? В PDF от MapuSoft много такой информации не вошло. Там даже по аргументам утилит командной строки нет полной документации. Так, между прочим, напишут, что -ke заставляет сохранять сишные исходники, а -ga заставляет вставлять #line, чтоб установить соответствие между кодом на C и кодом на Ada. Также можно взглянуть в adacgen.exe и увидеть там внутри подряд все возможные ключи, но без их описания. И очень интересный вопрос, а чей это вообще компилятор. Ведь если знаешь, чей это компилятор, можно открыть Internet WayBack Machine, забить там адрес бывшего владельца, и, может быть, там обнаружатся PDF'ки, которые можно даже скачать. Строки "SofCheck AdaMagic" как бы намекают, что распутывать клубок надо оттуда. И, действительно, ещё в 2012м году можно увидеть страницу AdaMagic на сайте SofCheck. А потом SofCheck влился в AdaCore, но такого продукта, как AdaMagic, у них на сайте после этого не появилось. А вот ещё что я нашёл:
Intermetrics (now AverStar, Inc.)Там столько слияний, что чёрт ногу сломит.
Intermetrics merged with Whitesmiths Ltd. in December 1988. In 1997, Intermetrics merged with computer game developer Looking Glass Studios [1]. In 1998, Intermetrics acquired Pacer Infotec, and changed its name to 'AverStar'. AverStar merged with the Titan Corporation in March, 2000; Titan was acquired by L-3 Communications in 2005.
Sofcheck (spinoff from Avercom, formerly Averstar, formerly Intermetrics)
Вот оно как! Значит, надо ещё сайт avercom.net почекать. Почекал. Нашёл! Сдаётся мне, среднестатистическому адаисту ни AverCom, ни AverStar ни о чём не скажут, в отличие от Intermetrics и SofCheck, и тем не менее. Правда, PDF там нет.
Но я так и не почекал Intermetrics. Я пробовал intermetrics.com, в этом моя проблема. А надо было inmet.com. Действительно, по этому адресу тоже что-то нашлось. Но без документации. В самом деле, глупость какая! Кому она нужна, эта документация, давайте котами в мешках торговать. Но я тут заметил ещё кое-что:
Intermetrics developed AdaMagic both for use in our own compilers and tools and to license to other compiler and tool vendors.Таааак, значит, надо ещё почекать alsys.com, raytheon.com и других получателей лицензии. Вдруг хоть один из них нарушил режим строжайшей секретности и вот так вот просто взял и выложил документацию о своих компиляторах на сайт.

Экспериментирую с AdaMagic и emcc. За основу взят rtl.windows. Все скомпилированные файлы пришлось выкинуть, так как это не LLVM биткод. Настроил в %ADA_MAGIC%\SITE\config по аналогии:
be_exec_name = C:\Program Files\Emscripten\emscripten\1.35.0\emcc
linker_exec_name = C:\Program Files\Emscripten\emscripten\1.35.0\emcc
Выкинуть пришлось
be_required_flag = -mno-cygwin
linker_required_flag = -mno-cygwin

Перекомпиляция адского RTL запускается так:
cd C:\GNAT\AdaMagic-2016-07-22\AdaMagic\windows\rtl.emscripten
adacgen -ke -ga src\.bdy src\.spc
del *.tmp.bc

Результаты:
Total: 325 files compiled. 287 successful, 38 unsuccessful.
Те, что unsuccessful, содержат всякие платформозависимые штучки, их портировать надо вручную или обойтись без них. И ещё там есть несколько чисто сишных исходников. Надо ещё с этим поэкспериментировать. Может, за основу лучше rtl.linux взять? В Linux вместо kernel32 glibc, а в emscripten, предположительно, для libc аналоги функций будет проще найти, чем для kernel32.

Посмотрел, что нового попало в грядущий стандарт.
Для массивов появился инициализирующий for — это вдобавок к тестирующему for, который уже был в Ada 2012.
На подтипы стало можно навешивать предикаты. Это облегчит применение хороших практик написания кода и уменьшит количество проверок условий, если они включены (не знаю, как у других, а у меня в продакшене без разрешения никто не пукнет, все проверки включены, и не было пока повода что-то отключать). Лениво же для каждой процедуры писать пост- и предусловия, а так объявил часто требуемые ограничения подтипами, и принимаешь аргументы, возвращаешь результаты. Заодно, поскольку подтип может быть в правой части теста на принадлежность «expression in subtype | subtype | subtype», можно один и тот же expression пробивать по нескольким параметрам. Например, кодовую единицу Unicode по разным признакам.
Как видно, начиная с Ada2012, наметился уклон в сторону создания операторам двойников-выражений. Хотя в чём-то это ещё изначально, с Ada 83 было. В этом русле лежит появление выражений, бросающих исключение, заодно они используются в предикатах подтипов.
Ну и по-мелочи, сделали аналог +=, *=, …, но не так дебильно, как во Free Pascal, тупо калькой с не менее дебильного C, а индустриальненько. Выражение @ ссылается на левую часть присваивания, и эту штуку можно поставить в любое место выражения.

Был такой компилятор AdaMagic, умел транслировать Ada в C и C++. Там ещё и в Java компиляция была, но это и сейчас есть в GNAT. Потом SofCheck был куплен AdaCore, и этот компилятор пропал из поля зрения. Однако, его продают под другим брендом тут. Его там завернули в какой-то AppCOE на базе Eclipse, но всё это можно развернуть, выкинуть лишнее и докопаться до самых важных файликов, adacgen.exe и adabgen.exe. На них навешена типа защита. Типа — потому что там, во-первых, есть отладочная информация, во-вторых, неиспользуемые функции не выбрасываются. Очень пригодилась мне такая неиспользуемая функция, как write_license_file, например.

Файл license_key.txt генерить научился, зашифрованные DES файлы типа libadartl.a.enc, разшифровал, для PDF пароль нашёл, поставлю qpdf и тоже разшифрую, впрочем, PDF в открытом виде можно и так скачать с сайта. Сейчас пишу инструкции, чтобы мои действия можно было повторить со следующими версиями. Вообще, не похоже, чтобы новый владелец-индиец разбежался развивать этот компилятор, он, скорее, вокруг достраивает всякие OS абстракторы на C, так что смысла большого обновляться не вижу, но тем не менее. Если думать на тему использования вместе со всякими emscripten, то от libadartl.a толку не очень много, но на всякий случай оно есть. С самим компилятором надо ещё разбираться. Он по умолчанию работает в режиме Ada->C->GCC, но в GCC есть GNAT, который гораздо лучше, и если кто-то заинтересовался AdaMagic, как я, то сценарий изпользования у него будет позабористее, и надо читать доки.

Таким образом, теперь есть компилятор Ada->C/C++, с помощью которого можно целиться во всякие дурацкие, но иногда нужные платформы, хостится он либо на Windows, либо на Linux, а через эмуляторы можно потенциально запускать из ещё большего набора OS. По плану выложить на форум только для зарегистрированных пользователей. Раз и навсегда адвокаты языков программирования, для которых на всех платформах есть транслятор, уедят.

Поставил компилятор Ады через TDM web-установщик. Довольно просто установилось. Библиотека GMGPL, Win64 поддерживается, прикольно, но контейнеры в стандартной библиотеке старой версии, не поддерживают конкурентное чтение, как это было ещё в далёком GNAT GPL 2015. Ну и GNATCOLL, к которому я привык, тоже GPL, так что для не-GPL надо к чему-то другому привыкать.

Разобрался с конвертацией времени. Как выясняется, в GreyLink DC++ время хранится совсем не в том формате, в котором я подумал, а в FILETIME. Также выяснилось, что и FILETIME в Windows, и time_t в POSIX могут быть как с високосными секундами, так и без. FILETIME, похоже, с високосными секундами не встречается, но тут пишут, что это не исключено. time_t согласно POSIX.1 тоже не должен поддерживать их:
IEEE Std 1003.1-1988 (``POSIX.1'') legislates that a time_t value of 536457599 shall correspond to "Wed Dec 31 23:59:59 GMT 1986." This effectively implies that POSIX time_t's cannot include leap seconds and, therefore, that the system time must be adjusted as each leap occurs.… но я смотрю на маны posix2time и time2posix и вижу, что совместимость с POSIX где-то может быть сломана в угоду монотонности времени. Всегда надо уточнять, с високосными секундами время или нет, иначе будет разъезжаться на 25 секунд, и с каждым годом всё больше. Вот, допустим, MySQL поддерживает високосные секунды в полях TIMESTAMP, если работать с этими значениями через функцию UNIX_TIMESTAMP. Но как мы уже выяснили, подлинный UNIX time_t не содержит високосных секунд, значит, это может быть только модифицированный. И если вы создаёте значение инструментом, который не вставляет эти секунды, у вас время начнёт разъезжаться. Вот в JavaScript по стандарту временная шкала нелинейная, как и в POSIX.1. Но если POSIX.1 где-то нарушается, то, может быть, и EcmaScript тоже? Давайте проверим:

В GNAT Ada.Calendar.Time реализован как Long_Long_Integer в наносекундах, а 0 — это 2150й год. Правда, The Ada Epoch отсчитывается всё же от 1901го года, где ещё хватает разрядов для представления настолько малых чисел. И високосные секунды там учитываются (в отличие от времени UNIX и JavaScript), но мы, конечно, не можем знать, сколько их накопится к 2150му году, поэтому с их учётом адский «0» будет на несколько секунд позже Нового 2150го Года.

Untangling the Tale of Ada Lovelace
В сознании простого русского человека претензии «элиты» на «элитарность» всегда комичны. Как ни станет кто элитой, так это надо на газенвагенах, ой, то есть, я хотел написать, на гелендвагенах покататься. В царские времена — крепостных понасиловать и прочее, что там вытворяли те, кто стал прообразом Троекурова. Сейчас вот имеем неудовольствие посмотреть, как отдохнула природа на детях Гайдара, Михалкова, Райкина. Каждый раз, как включались социальные лифты, когда всю страну пылесосили, так имели рывок вперёд, а как возвращались в родоплеменной строй, так деградировали.

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

Мучился когда–то с определением языка программирования в дипломе. Стыренное из википедии определение без указания авторства благополучно совпало с чьим–то дипломом и дало пару процентов неоригинальности. Пришлось искать другое определение, где бы можно было найти первоисточник.

А меж тем, оказывается, целый ГОСТ есть, ГОСТ 28397-89 (ИСО 2382-15-85). «Язык, предназначенный для представления программ.»

Нашёл ещё ГОСТов на языки программирования:
ГОСТ 21551-76 Язык программирования АЛГАМС
ГОСТ 22558-89 Язык программирования Кобол
ГОСТ 23056-78 Язык программирования Фортран
ГОСТ 23057-78 Язык программирования Базисный Фортран
ГОСТ 27787-88 Язык программирования БЕЙСИК
ГОСТ 27974-88 Язык программирования АЛГОЛ 68
ГОСТ 27975-88 Язык программирования АЛГОЛ 68 расширенный
ГОСТ 27831-88 Язык программирования АДА
ГОСТ 28140-89 Язык программирования ПАСКАЛЬ

Я раньше знал, что стандарт на Аду 83 перевели на русский, но я не знал, что это было для ГОСТ и стало таковым. И действует.
Нашёл ещё такое: ГОСТ Р 34.1702.3-92 Связь ядра графической системы с языком программирования Ада.
Этакий unit Graph, но для Ады и по ГОСТу.

Обнаружил, что GNAT уже давно автоматически использует UTF-8 как однобайтовую кодировку, а не ANSI (управляется переменной среды GNAT_CODE_PAGE). В смысле, использует её для I/O, в частности, имён файлов, где и был камень преткновения, поскольку у таких модулей, как Ada.Directories, аргументы в однобайтовых String, а не двухбайтовых Wide_String или четырёхбайтовых Wide_Wide_String. Кодировка исходников управляется -gnatW, в юникодных кодировках можно давать идентификаторам имена не на латинице и писать строковые литералы, но такие литералы должны быть достаточно широкими, потому что String по стандарту жёстко Latin-1, а всё русское требует минимум Wide_String. Есть, правда, вариант, при котором компилятор думает, что он парсит исходник в Latin-1, а он — в UTF-8 или ANSI, но как–то это не правильно, мне кажется. Идентификаторы не получится юникодные написать, и широкие строковые литералы, наоборот, будут коцаться.
Восемь назад на Windows такие строки было особо некуда деть, кроме платформозависимого Win32Ada. Нет, можно, конечно, было подключить Ada.Wide_Wide_Text_IO и пошпарить Юникодом в тексте файла, но имя файла при этом будет ограничено ANSI. Эту дырку GNAT закрыл давно. Есть у процедур открытия файла строковый параметр Form, смысл которого по стандарту определяется компилятором, и в GNAT его можно было использовать для того, чтобы указать, что имя файла — в UTF-8, а не ANSI. Так что, сконвертировав имя файла в UTF-8, можно даже было и открыть его. А вот Ada.Directories было более проблемным, там никаких параметров Form не было, чтоб отказаться от этого проклятого ANSI. Понятно, что были и Матрёшки, где диктатура четырёхбайтовых строк, не дожидаясь, когда стандарт избавится от однобайтового наследия, но состояние стандартной библиотеки тоже важно.

Попутно, пока искал, поиск выдавал мне, как обстоят дела у других разработчиков
But the problem is MSVC only accept UTF8+BOM and MinGW only UTF8-BOM
note that MinGW use UTF-8 for sources, while VC8 use ANSI
Если этот «хорошо подходящий для Windows» компилятор до сих пор форсит ANSI в исходниках (кто будет ставить BOM для UTF-8?), сочувствую тем, кто вынужден этой пакостью пользоваться.

Было время, когда парился, а как же теоретически сделать так, чтобы сервак был на Аде, но чтоб перезагружать не надо было. Какие–нибудь перезагружаемые на горячую модули сделать. Сейчас, в глубокой практике, когда я даже померил на стрёмном железе, что перезагрузка длится 56 миллисекунд, всё это кажется таким неактуальным.

Началось соревнование «Make with Ada» для разработчиков встраиваемых систем
AdaCore организует новый конкурс для разработчиков. Как и в прошлые разы, на подготовку даётся существенно больше времени, чем в олимпиадах по иноформатике. Это как раз подходит тем, кому не нравятся соревнования по быстрому написанию страшного кода, который потом только выбросить.

Сегодня на повестке дня — разработка для ARM на голом железе и технологии верификации. Общий призовой фонд — более 8000€.

makewithada.org

Как бы отвечая на напрашивающийся вопрос, — да, я уже посмотрел на логотип через анаглиф очки.