1. Пользуйтесь тегами кода. - [code] ... [/code] 2. Точно указывайте язык, название и версию компилятора (интерпретатора). 3. Название темы должно быть информативным. В описании темы указываем язык!!!
Был давно такой интересный компилятор у производителя SofCheck. 5 лет назад SofCheck и AdaCore слились, а компилятор куда-то потерялся. У AdaCore его даже не купить. Он, конечно, поддерживает более старый стандарт Ada 95 с подмножеством Ada 2005, но иногда даже и такой компилятор может пригодиться.
Этот компилятор неожиданно был найден у другого производителя, который у адаистов вообще не на слуху: MapuSoft. У них можно запросить демку и скачать, потом они впаривают какой-то AppCOE на базе Eclipse, а если оно не нужно, то приходится распаковывать архив из архива из архива. Я постарался вытащить из AppCOE собственно AdaMagic и отбросить шелуху. Не имея представления о том, как он должен был выглядеть, возможно, не во всём корректно. И некоторых файлов вроде adabgen.inf и adacgen.inf просто нет.
Замечание от 13 июня 2018: нет, всё же IDE полезно иметь, см. тему дальше.
Таким образом, это компилятор Ada -> C, C++, запускается он на Windows и Linux, а через эмуляторы — и на других платформах. Сценарий использования из коробки — это Ada -> C, C++ -> GCC, но в GCC есть GNAT, который лучше, а AdaMagic интерес, как я понимаю, представляет, когда нужно собирать под платформы, не поддерживаемые GNAT, вроде Asm.js и Эльбрус, соответственно, научиться им пользоваться нетривиально и зависит от потребностей. Может понадобиться писать свой рантайм или не использовать те возможности языка, под которые рантайм не написан.
Сейчас, когда начинают появляться деньги, возник вопрос, а по карману ли AdaMagic (aka AdaChanger)? Delphi по карману, GNAT Developer по карману, даже, может быть, с iOS всякими, если действительно захотеть.
Ответ от производителя получил
Цитата
I am sorry but we are not selling this product into Russia at this time. I will let you know if that changes.
Даже при желании мы на их финансовое состояние не повлияем никак. Можно не париться.
Тем временем обнаружил, что в adacgen.exe всё это время была довольно исчерпывающая информация, но IDA её не подхватывала, потому что плагин для чтения информации требует очень редкую msvcp100d.dll, с буквой d на конце, что значит debug, а debug версии этих библиотек не входят в состав перераспространяемых пакетов визуалки, вот и нет этого файла. После того, как скачал и подложил этот файлик, наступило прозрение. Там есть типы данных с именами полей, локальные переменные, и в IDA видно, что в таком-то регистре такая-то локальная переменная. Смысл всех ключей стал более менее понятен. В частности, загадочный -cppa банально значит включить всё, что связано с C++ (то же, что все остальные три ключа).
Что касается собственно использования транслятора, удалось научиться делать некоторые трюки. Например, если просто делать объявленной процедуре pragma Import, то она и в Си выводе импортируется при помощи extern, но, возможно, под другим именем, ведь в Си нельзя одно от другого отвязать. А если написать Import с соглашением Intrinsic, то в Си не выводится extern, а транслятор начинает верить, что такая фунция всё же существует и генерирует код, ссылающийся на неё. Но если это всё же не настоящий intrinsic, то к тому, чтобы он появился, надо предпринять усилия. Написав pragma Import с оглашением Intrinsic для типа, можно дополнительным параметром указать строку "#include", которая будет вставляться в сишный вывод каждого модуля, зависящего от того, где такой хитрый тип объявлен. Сам тип использовать не обязательно, он может в private быть спрятан. Что-то другое, кроме #include, не работает, но и этого достаточно. Через эту щель удалось, например, подцепиться к atomic intrinsic для счётчиков ссылок. С ними возникла проблема, что AdaMagic указатели приводит к void*, а у этих atomic instrinsic поведение определяется именно тем, какой указатель передаётся. То есть, перегрузка по типу аргумента, не смотря на то, что в Си такого нет. Решилось тем, что я завернул atomic intrinsic в макрос, приводящий обратно к нужному типу. И написал для сишного макроса адское строго типизированное объявление. Строго типизированное объявление для того, что по сути является сишным макросом. Это ли не чудо. Используя этот трюк, я реализовал System.Atomic_Counters с тем же API, как в GNAT. Работает. Посмотрел все промежуточные файлы. Через AdaMagic, через сишный препроцессор всё проходит до уровня ассемблера, вся эта луковица разбирается до кочерыжки, и остаются машинные инструкции, делающие только то, что нужно.