Могу ли я сослаться на библиотеку Ada в приложении Swift? - PullRequest
0 голосов
/ 01 июня 2018

Я относительно новичок в Swift (в прошлом я работал с Python и HTML), но в настоящее время я работаю над приложением с группой.

Это приложение уже существует в качестве рабочего столапрограмма написана на Ada, и мы надеялись перенести ее на Swift и выпустить приложение для iPhone.

Насколько я понимаю, я могу (вероятно?) превратить Ada в C с помощью конвертера, а затем сослаться на Cв Свифте?Это правильно, или я что-то упустил из-за того, что не был знаком с языками?

Если правильно, как бы я мог выполнить это на самом деле, поскольку у меня мало опыта в Swift и C?

Это довольно загруженный вопрос, так что спасибо за любую помощь или понимание!редактировать: указанное настольное приложение с открытым исходным кодом и доступно для любого использования - я не собираюсь воровать чью-либо работу

Ответы [ 4 ]

0 голосов
/ 17 июня 2018

Мне известны только два компилятора Ada to C, самый мощный из которых (AdaMagic) теперь известен как MapuSoft Ada-to-C / C ++ Changer.Вам понадобится среда выполнения Windows или Linux для запуска транслятора (Wine, Docker и т. Д. На macOS).Кроме того, вам нужно ограничиться Ада 95. Говорят, что AdaMagic поддерживает «подмножество Ады 2005», но я еще не наткнулся на это подмножество.Также вам нужно будет портировать среду выполнения или ее часть.Если вы отключите проверки времени выполнения, количество времени выполнения, требуемое для порта, станет меньше, поэтому вам решать, сколько времени вы готовы потратить на него.

Он имеет два режима работы, либо нацеленный на C,или C ++, я рекомендую C ++, потому что throw-catch лучше подходит для современной среды выполнения Objective C (с использованием C ++ ABI за кулисами), чем для C setjmp / longjmp.

С некоторыми усилиями вы получите что-то иработает.

Жаль, что разработчики Ada так не знают об этой опции.Может быть, кто-нибудь найдет время для переноса AdaMagic на EmScripten, iOS, Elbrus или любую другую необходимую для человечества цель, чтобы начать массовое принятие Ada.

Другие посоветовали создавать привязки Swift из мостовых заголовков, но IMO победной стратегией будетнаписать код клея в Objective-C ++ гибрид.Objective-C ++ будет иметь доступ как к коду Swift (который рассматривается как внешние классы Objective-C), так и к переведенному коду Ada-to-C ++.Например, он сможет отлавливать исключения C ++ из Ada и генерировать исключения Objective-C или наоборот.

Другой компилятор - GNAT CCG aka SPARK2C.Он предназначен для встраиваемых устройств, не имеющих другого компилятора Ada.Он поддерживает последние стандарты Ada, но очень ограничен в отношении функций, требующих времени выполнения.В основном, нет времени выполнения.Нет времени выполнения, нет проблем.Нечего портировать.В этом компиляторе можно вернуть ограниченную запись из функции (функция Ada 2005+), но не может иметь RAII, задачи и т. Д. Я предполагаю, что это гораздо более строгие требования, чем Ada 95. GNAT CCG еще не является общедоступным, но я ожидаюон должен появиться перед ежегодным Make с Ada, иначе это будет очень глупая ситуация.

Другие варианты - Ada-to-Java или Ada-to-.NET, возможно, они могут работать для вашего приложения лучше, чем другие..

0 голосов
/ 01 июня 2018

Я предполагаю, что вы можете легко извлечь те части программы Ada, которые вы хотите использовать в программе iPhone.Если код, который вы хотите перенести, имеет другие зависимости, то вы должны убедиться, что вы можете получить все эти зависимости и для iOS.Это может быть чрезвычайно сложно для UI-инструментариев, если вы используете один из них.

Для вызова сторонних функций в Swift вам обычно нужно использовать bridging header .Мостовой заголовок вашей цели содержит объявления классов C, Objective-C и классов, функций и переменных, которые Swift должен вызывать.Пока язык, на который вы хотите вызывать, может экспортировать C-совместимые привязки (что должно быть в случае с Ada), вы сможете вызывать эти привязки, объявив их в заголовке моста.

Если ту часть настольной программы Ada, которую вы хотите использовать, можно легко изолировать в библиотеке (статической или динамической), и вы можете создать эту библиотеку как библиотеку ARM Mach-O, тогда это просто вопрос объявленияфункции, которые вы хотите использовать из библиотеки в заголовке моста вашего приложения.Вы можете обратиться к Руководству пользователя GNAT для собственных платформ: Интерфейс к C , чтобы узнать, как использовать директивы для представления функции Ada для C, и, выставив ее для C, вы также выставите ее для Swift.Я бы попробовал это в первую очередь, поскольку поддерживать почти неизмененный исходный код Ada почти наверняка будет проще, чем поддерживать механически переведенную C-версию исходного кода Ada.

Если это не сработает, тогда даперевод исходного кода Ada в код C также позволит вам ссылаться на него из Swift.Вам также необходимо убедиться, что функции, которые вам нужно вызвать, объявлены в заголовке моста.

0 голосов
/ 05 июня 2018

К сожалению, в настоящее время не существует компилятора Ada, предназначенного для iOS, доступного для общественности.

Если у вас есть деньги, которые можно потратить, вы можете связаться с AdaCore, но не ожидайте, что это будет дешево.

Поверьте, некоторые из нас хотели бы настроить iOS наАда.

0 голосов
/ 01 июня 2018

Похоже, что раньше можно было скомпилировать Ada в Xcode, когда Xcode все еще поддерживал компилятор GCC.Это было удалено некоторое время назад.

Если есть переводчики, которые будут переводить Ada в C, вы можете использовать C изначально в приложении Objective-C для iOS.(Objective-C - это чистый надмножество C, означающий, что весь код на C также является допустимой целью-C.)

Swift "хорошо играет" с C и Objective-C, если вы ограничиваете себя типамии классы, которые C и Objective-C понимают, но взаимодействие между Swift и C / Objective-C несколько сложно и утомительно.У вас было бы немало возможностей для чтения и изучения, чтобы научиться создавать приложение, которое использует оба, помимо всего прочего, что вам нужно будет изучить.

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

...