IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> Компилятор AdaMagic, Ada -> C, C++
сообщение
Сообщение #1


Большевик–концептуал
**

Группа: Пользователи
Сообщений: 141
Пол: Мужской
Реальное имя: Иван Левашев
Jabber: octagram@jabber.ru
Skype: i.levashew
QQ: 3152538431
WeChat
Ада: Сторонник
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик
Turbo Pascal: Установлен

Репутация: -  1  +


Был давно такой интересный компилятор у производителя SofCheck. 5 лет назад SofCheck и AdaCore слились, а компилятор куда-то потерялся. У AdaCore его даже не купить. Он, конечно, поддерживает более старый стандарт Ada 95 с подмножеством Ada 2005, но иногда даже и такой компилятор может пригодиться.

Этот компилятор неожиданно был найден у другого производителя, который у адаистов вообще не на слуху: MapuSoft. У них можно запросить демку и скачать, потом они впаривают какой-то AppCOE на базе Eclipse, а если оно не нужно, то приходится распаковывать архив из архива из архива. Я постарался вытащить из AppCOE собственно AdaMagic и отбросить шелуху. Не имея представления о том, как он должен был выглядеть, возможно, не во всём корректно. И некоторых файлов вроде adabgen.inf и adacgen.inf просто нет.

Таким образом, это компилятор Ada -> C, C++, запускается он на Windows и Linux, а через эмуляторы — и на других платформах. Сценарий использования из коробки — это Ada -> C, C++ -> GCC, но в GCC есть GNAT, который лучше, а AdaMagic интерес, как я понимаю, представляет, когда нужно собирать под платформы, не поддерживаемые GNAT, вроде Asm.js и Эльбрус, соответственно, научиться им пользоваться нетривиально и зависит от потребностей. Может понадобиться писать свой рантайм или не использовать те возможности языка, под которые рантайм не написан.

Для скачивания требуется регистрация на форуме.

AdaMagic.2016-07-22.7z (191 Мб)


--------------------
If you want to get to the top, you have to start at the bottom
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Большевик–концептуал
**

Группа: Пользователи
Сообщений: 141
Пол: Мужской
Реальное имя: Иван Левашев
Jabber: octagram@jabber.ru
Skype: i.levashew
QQ: 3152538431
WeChat
Ада: Сторонник
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик
Turbo Pascal: Установлен

Репутация: -  1  +


Немного о том, как установить:
Распаковать куда-нибудь, далее обозначено многоточием.
Добавить в PATH …\AdaMagic\windows\bin
Установить переменную среды ADA_MAGIC=…\AdaMagic\windows
Подредактировать …\AdaMagic\windows\SITE\rts_path и …\AdaMagic\windows\SITE\config

Дальше тяжело без документации. В PDF мало. Решал эту проблему. Вот, что удалось выяснить:

AdaMagic умел работать в 3х режимах, промежуточное представление, которое нужно компилировать дальше в машинный код собственными усилиями, либо в C/C++, либо в Java. И всё это — AdaMagic. Один поставщик (Intermetrics, AverStar, SofCheck) раздавал лицензии разным компаниям под разные условия, и когда мы берём чей-то компилятор, это адаптация AdaMagic.

Вот у MapuSoft именно второй сценарий, а у ObjectAda — первый и третий, но нет второго. ObjectAda однажды устроил раздачу бесплатных версий своего компилятора (ObjectAda 7.2 Special Edition), я себе такой сохранил, впрочем, в Интернете ещё можно найти, архив называется oa71sped.zip , и вот он пригодился. Свет проливается на то, как всё устроено. В частности, обнаруживается, что adacgen.exe — это переименованный adacomp.exe, а adabgen.exe — это переименованный adabuild.exe. А ещё в ObjectAda можно найти adacomp.inf и adabuild.inf, и если их переименовать и положить в …\AdaMagic\windows , то утилиты командной строки перестают ругаться. Правда, справка не вполне подходит. Так, в ObjectAda есть ключ -asm, что имеет смысл для компилятора для Windows, но не имеет смысла для конвертера в C/C++. Более правильная «документация» нашлась здесь: http://www.ada-auth.org/cpl/reports/ACATR048.txt Это отчёт на проверку соответствия стандарту языка Ада 95, а заодно он включает искомую документацию, хоть и старую, но сойдёт. Кстати, там всплывают ещё одни возможные имена: adacsrc и adacbuild, соответственно. Также частично удалось восстановить смысл новых ключей, глядя в код AppCOE.

Итого ключи adacgen (как представляющей наибольший интерес утилиты) получаются:

Сильно не понятные ключи (Показать/Скрыть)


Относительно понятные ключи (Показать/Скрыть)


Также оказалось полезно, что компилятор запоминает, с какими ключами собирались файлы, и пишет в файлы info. Например, Ada RTL для Windows собрана так:

COMPSW: adacomp SRC -m a -config ./config -config ./config -ke -xr -gc -O none -trace -eo +mr e -translate -pB -IXIL



Здесь по идее должен быть adacgen, а не adacomp, но не везде имя поменяли, и в данном случае в файлики штампуется оригинальное имя утилиты.

А вот ключи для компиляции демки судоку, собранной средствами AppCOE:

COMPSW: adacomp SRC -m a -config ./config -config ./config -ke -xr -gc -O none -trace -eo +mr e -translate -pB -IXIL



Поскольку AppCOE ставить не хочется, вот так вот и достаётся оттуда информация.

Экспериментировал с emscripten. Собралось 287 из 325 файлов Ada RTL. Остальное нужно портировать вручную. Там всякие функции получения системного времени, аргументов командной строки и т. п.

Так как заморачиваться этим на первых порах не хочется, хотелось предоставить какую-нибудь заглушку, чтоб компилятор сам не вызывался, и чтоб можно было с неполным рантаймом собирать. Оттранслировать в C++ и не дать автоматически транслировать дальше. Посмотреть в исходник, что там вызывается и написать заглушки.

Нашёл, как это делать:
Сначала каждый исходник нужно обработать adareg:
adareg Hello_World_2.ads


Звёздочки (adareg *.ads *.adb) тоже понимаются.

Потом конвертировать:

adacgen -c -cppn -cppe -ke -ki Hello_World_2.ads



Это сконвертирует исходник Ada в C++. Так нужно и для тел, и для спецификаций сделать. Чтобы в C, надо убрать "-cppn -cppe". Чтобы убрать проверки, можно добавить -s. Это уже становится не Ada, но всё ещё хотя бы язык с нормальной системой типов и модулей. Всё это нужно, чтобы хоть что-то запустить на момент, пока рантайм ещё не портирован и даже заглушек ещё нет.


--------------------
If you want to get to the top, you have to start at the bottom
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Большевик–концептуал
**

Группа: Пользователи
Сообщений: 141
Пол: Мужской
Реальное имя: Иван Левашев
Jabber: octagram@jabber.ru
Skype: i.levashew
QQ: 3152538431
WeChat
Ада: Сторонник
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик
Turbo Pascal: Установлен

Репутация: -  1  +


Такер Тефт, основоположник этого компилятора, любезно поделился файлами .inf. Там не все ключи, но судя по дате (2012й год), лучше уже ничего не будет. А внутри там дата из системы контроля версий 2008й год, так что, может быть, есть и поновее, а может быть, интересных мне ключей вроде «-cppa» и «-cppc» там никогда не было. Но это явно получше, чем брать файлы из ObjectAda Special Edition, где компилятор в машинные коды, а не в C.

Файлы распаковываются в ADA_MAGIC, то есть, в …\AdaMagic\windows


Прикрепленные файлы
Прикрепленный файл  adamagic_info.zip ( 5.53 килобайт ) Кол-во скачиваний: 172


--------------------
If you want to get to the top, you have to start at the bottom
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Большевик–концептуал
**

Группа: Пользователи
Сообщений: 141
Пол: Мужской
Реальное имя: Иван Левашев
Jabber: octagram@jabber.ru
Skype: i.levashew
QQ: 3152538431
WeChat
Ада: Сторонник
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик
Turbo Pascal: Установлен

Репутация: -  1  +


В блоге AdaCore с прошлого года появляются уже разные посты про новую технологию SPARK-To-C, она же GNAT CCG, Common Code Generator, тоже транслятор в C. Коммерческим клиентам AdaCore эта технология уже доступна, можно ожидать, что в ближайшие пару месяцев выложат в открытый доступ одновременно с обычными компиляторами, как это делается каждый год.

Код
gprbuild --target=c


AdaCore, судя по всему, чтобы избегать ассоциаций с «древним» языком Ада пытается чаще называться SPARK'ом, попутно пользуясь путаницей с другим Spark, более поздним, а SPARK-то как бы тоже не вчера появился, но более известным.

Меня же как разработчика такие названия скорее пугали. Ведь я открывал SPARK RM и видел, что, например, того нет, другого нет. По динамической памяти сильный удар, так как это дело тяжело верифицировать. Если на Аде функции возвращают строки в динамической памяти, то в Спарк, скорее всего (я сильно не владею), пришлось бы вызывающему заранее выделить буфер, а вызываемому — писать в него и отчитываться, сколько занято. Ближе к Си стиль написания кода становится. Если многие программы на Делфи или на Си плюс плюс я могу условно один к одному переписать на Аду, то СПАРК ставит более жёсткие рамки допустимого.

Я знаю, что в SPARK нельзя использовать стандартные адские контейнеры. Впрочем, в GNAT 2012 я видел какие-то другие, так называемые формальные контейнеры, которые в СПАРК использовать можно. Если я правильно понимаю ситуацию, обычные контейнеры используют динамическую память, а формальные — статически (или динамически на стеке) сразу занимают столько места, сколько в них максимум можно будет записать.

Обычному программисту, чтоб писать хороший код, надо чувствовать процессор, чувствовать, как то, что пишешь, отобразится на самом нижнем уровне. Если писать под СПАРК, то отвечаешь сразу в двух инстанциях: и перед процессором, и перед верификатором. Нужно чувствовать верификатор, понимать, что как записать, чтобы это было можно верифицировать. Чувствовать, как можно помогать верификатору. И, самое главное, понимать, что поддаётся верификации. Меня этому не учили, самому в последнее время нет предпосылок, чтоб мог посвятить этому время.

Так что SPARK2C звучал страшно. Как будто сил хватило реализовать только сильно урезанное подмножество Ады, которое в SPARK, а для привычных удобств вроде контейнеров и динамической памяти придётся откатиться к AdaMagic, а это значит Ada 95. И представлялось, будто эти компиляторы будут сосуществовать, так как ни один не является объемлющей заменой для другого.

Чем больше постов, тем больше я вижу, что это не так. Не придётся выбирать между Ada 95 и SPARK 2014. GNAT CCG (SPARK2C) поддерживает всю Аду, а это сейчас Ada 2012, но всё ближе и ближе Ada 2020. Там общий код с обычным GNAT. И это, получается, полностью заменит AdaMagic.

Почти полностью. AdaMagic может генерировать код и для C, и для C++, и чёткой границы нет, можно отдельно настраивать исключения или setjmp, структуры с тегами или классы C++, пространства имён или подчёркивания. AdaMagic генерирует читабельный код, а SPARK2C — нет. По этим причинам AdaMagic продвигался как инструмент не только компиляции, но и портирования адского кода на C++. То есть, вот есть прогресс. Стрелка компаса показывает: сюда — назад, туда — вперёд.

FAT — назад, NTFS — вперёд.
DBF — назад, PostgreSQL — вперёд.
C++ — назад, Ada — вперёд.

Для мудаков, идущих против прогресса, AdaMagic всё ещё остаётся «полезен». Что характерно, они там все проверки в коде перед портированием отключают «для повышения читаемости». Стоит этот код начать долго активно редактировать, как былое качество программного кода становится бесповоротно утеряно.

А все остальные неумолимо вкатываются в будущее, где всё меньше оправданий писать некачественный код на C++. Какой ни взять Texas Instrument, под него можно писать на Аде. Причём, компилятор C может быть древний, но в старые меха можно влить новую Ада 2020.


--------------------
If you want to get to the top, you have to start at the bottom
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 




- Текстовая версия 25.05.2018 21:44
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"