我对Swift相对较新(过去我曾使用Python和HTML进行修改) - 但我目前正在开发一个有小组的应用程序。
此应用程序已作为用Ada编写的桌面程序存在,我们希望将其移植到Swift并推出iPhone应用程序。
我的理解是我可以(可能?)用转换器将Ada转换为C,然后在Swift中引用C?这是正确的,还是因为不熟悉这些语言而忽略了什么?
如果正确,我将如何实际执行此操作,因为我在Swift和C方面经验不足?
这是一个非常复杂的问题,所以感谢您的帮助或见解! 编辑:所说的桌面应用程序是开源的,可供所有人使用 - 我不打算窃取任何人的工作
答案 0 :(得分:2)
我假设您可以轻松删除要在iPhone程序中使用的Ada程序部分。如果您想要移植的代码具有其他依赖项,那么您必须确保您也可以获得iOS的所有这些依赖项。如果使用UI工具包,这对于UI工具包来说可能非常困难。
要在Swift中调用外部函数,通常需要使用bridging header。你的目标的桥接头包含Swift应该能够调用的类,函数和变量的C和Objective-C声明。只要你想调用的语言可以导出C兼容的绑定(应该是Ada的情况),那么你就可以通过在桥接头中声明它们来调用这些绑定。
如果要使用的桌面Ada程序的一部分可以很容易地在库中隔离(静态或动态),并且您能够将该库构建为ARM Mach-O库,那么这只是一个问题在应用程序的桥接标题中声明要从库中使用的函数。您可以参考GNAT User's Guide for Native Platforms: Interfacing to C获取用于将Ada函数暴露给C的指令,并通过将其暴露给C,您也将它暴露给Swift。我首先尝试这个,因为保持几乎未经修改的Ada源几乎肯定比维护机械翻译的Ada源C版更容易。
如果这不起作用,那么是的,将Ada源代码转换为C代码也允许您从Swift引用它。您还必须确保在桥接标头中声明需要调用的函数。
答案 1 :(得分:0)
当Xcode仍然支持GCC编译器时,看起来以前可以在Xcode中编译Ada。那是在不久前删除的。
如果有译员将Ada翻译为C,那么您可以在Objective-C iOS应用程序中本地使用C. (Objective-C是C的纯超集,意味着所有C代码也是合法目标-C。)
只要您将自己限制在C和Objective-C理解的类型和类中,Swift“就可以很好地”使用C和Objective-C,但是Swift和C / Objective-C之间的互操作有点棘手和乏味。您需要进行大量的阅读和学习才能学习如何构建一个同时使用这两者的应用程序,以及您需要学习的所有其他内容。除非你要处理成千上万行的Ada代码,否则最好找一个知道Ada和Swift的人为你翻译代码,或者让你学习Swift然后自己翻译。
答案 2 :(得分:0)
不幸的是,目前还没有针对iOS的Ada编译器可供公众使用。
如果您有现金支出,可以联系AdaCore,但不要指望它便宜。
相信我,我们中有些人想用Ada定位iOS。
答案 3 :(得分:0)
我只知道两个Ada to C编译器,最强大的编译器(AdaMagic)现在被称为MapuSoft Ada-to-C / C ++更换器。您需要Windows或Linux执行环境来运行翻译器(MacOS上的Wine,Docker等)。此外,你需要将自己限制在Ada 95.据说AdaMagic支持“Ada 2005的子集”,但我还没有偶然发现这个子集。您还需要移植运行时或其中的一部分。如果禁用运行时检查,端口所需的运行时间会变得更低,因此您可以花多少时间在其上花费。
它有两种操作模式,无论是目标C还是C ++,我推荐使用C ++,因为throw-catch与现代Objective-C运行时(在幕后使用C ++ ABI)比C setjmp / longjmp更好地匹配。
通过一些努力,你可以获得一些东西并继续运行。
遗憾的是,Ada的开发人员并未意识到这一选择。也许有人可以抽出时间将AdaMagic移植到EmScripten,iOS,Elbrus或人类缺少什么基本目标来开始大规模采用Ada。
其他人建议从桥接头生成Swift绑定,但IMO的获胜策略是在Objective-C ++ hybrid中编写粘合代码。 Objective-C ++可以访问Swift代码(被视为外部Objective-C类)和Ada-to-C ++代码。例如,它将能够从Ada捕获C ++异常并抛出Objective-C异常,反之亦然。
另一个编译器是GNAT CCG又名SPARK2C。它旨在针对没有其他Ada编译器的嵌入式设备。它支持最近的Ada标准,但在需要运行时的功能方面非常有限。基本上,没有运行时。没有运行时,没问题。什么都没有移植。在这个编译器中,可以从函数(Ada 2005+特性)返回有限的记录,但是不能有RAII,任务等等。我想,这比Ada 95要严格得多.GNAT CCG尚未公开,但我希望它出现在年度Make with Ada之前,否则这将是一个非常愚蠢的情况。
另一个选择是Ada-to-Java或Ada-to-.NET,也许它们可以比其他选项更适合您的应用程序。