Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/118.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 我可以在Swift应用程序中引用Ada库吗?_Ios_Swift_Ada - Fatal编程技术网

Ios 我可以在Swift应用程序中引用Ada库吗?

Ios 我可以在Swift应用程序中引用Ada库吗?,ios,swift,ada,Ios,Swift,Ada,我对Swift还比较陌生(我在过去修改过Python和HTML),但我目前正在和一个团队一起开发一个应用程序 这个应用程序已经以Ada编写的桌面程序的形式存在,我们希望将它移植到Swift并推出一个iPhone应用程序 我的理解是,我可以(可能?)用转换器将Ada转换成C,然后在Swift中引用C?这是正确的,还是因为我不熟悉这些语言而忽略了什么 如果正确的话,由于我在Swift和C方面的经验很少,我将如何实际执行这一点 这是一个非常复杂的问题,因此感谢您的帮助或见解! 编辑:所说的桌面应用程序

我对Swift还比较陌生(我在过去修改过Python和HTML),但我目前正在和一个团队一起开发一个应用程序

这个应用程序已经以Ada编写的桌面程序的形式存在,我们希望将它移植到Swift并推出一个iPhone应用程序

我的理解是,我可以(可能?)用转换器将Ada转换成C,然后在Swift中引用C?这是正确的,还是因为我不熟悉这些语言而忽略了什么

如果正确的话,由于我在Swift和C方面的经验很少,我将如何实际执行这一点

这是一个非常复杂的问题,因此感谢您的帮助或见解!
编辑:所说的桌面应用程序是开源的,可供所有人使用-我不打算窃取任何人的作品

看起来,在Xcode仍然支持GCC编译器的情况下,以前可以在Xcode中编译Ada。这是前一段时间删除的

如果有翻译器将Ada翻译成C,那么您可以在Objective-C iOS应用程序中本机使用C。(Objective-C是C的纯超集,意味着所有C代码也是法定的Objective-C。)

Swift与C和Objective-C“玩得很好”,只要您将自己限制在C和Objective-C理解的类型和类上,但是Swift和C/Objective-C之间的交互操作有些棘手和乏味。你将有大量的阅读和学习要做,以学习如何建立一个应用程序,既使用这两个,最重要的是你需要学习的一切


除非你要处理成千上万行的Ada代码,否则最好找一个既懂Ada又懂Swift的人帮你翻译代码,或者让你学习Swift,然后自己翻译

我假设你可以很容易地取出你想在iPhone程序中使用的Ada程序的部分。如果要移植的代码具有其他依赖项,那么您必须确保也可以获得iOS的所有这些依赖项。如果您使用UI工具包,这对于UI工具包来说可能非常困难

要在Swift中调用外部函数,通常需要使用。您的目标的桥接头包含Swift应该能够调用的类、函数和变量的C和Objective-C声明。只要您要调用的语言可以导出与C兼容的绑定(Ada就是这种情况),那么您就可以通过在桥接头中声明这些绑定来调用它们

如果您想要使用的桌面Ada程序部分可以很容易地在库中隔离(静态或动态),并且您能够将该库构建为ARM Mach-O库,那么只需在应用程序的桥接头中声明您想要从库中使用的函数即可。您可以参考以获取用于将Ada函数公开给C的指令,通过将其公开给C,您也将其公开给Swift。我会先尝试一下,因为维护几乎未修改的Ada源代码几乎肯定比维护机械翻译的Ada源代码的C版本要容易


如果这不起作用,那么是的,将Ada源代码翻译成C代码也将允许您从Swift引用它。您还必须确保需要调用的函数在桥接头中声明。

不幸的是,目前还没有面向公众iOS的Ada编译器

如果你有现金可以花,你可以联系AdaCore买一个,但不要指望它便宜


相信我,我们中有一些人想用Ada来瞄准iOS

我只知道两个Ada-to-C编译器,其中最强大的一个(AdaMagic)现在被称为MapuSoft Ada-to-C/C++转换器。您需要Windows或Linux执行环境来运行translator(macOS上的Wine、Docker等)。此外,您需要将自己限制在Ada 95。据说AdaMagic支持“Ada2005的子集”,但我还没有偶然发现这个子集。您还需要移植运行时或其一部分。如果禁用运行时检查,则移植所需的运行时数量将降低,因此,您愿意在其上花费多少时间取决于您

有两种操作模式,即针对C或C++,我建议C++,因为抛出catch与现代Objy-C运行时(利用C++后台ABI)比C SETJMP/LIJMP更匹配。 通过一些努力,你会得到一些东西并开始运行

遗憾的是,Ada开发人员没有意识到这个选项。也许有人可以抽出时间将AdaMagic移植到EmScripten、iOS、Elbrus或人类缺少的任何基本目标,开始大规模采用Ada

其他人建议从桥接头生成快速绑定,但我认为获胜的策略是用Objective-C++hybrid编写粘合代码。Objective-C++可以访问Swift代码(视为外部Objective-C类)和Ada-to-C++翻译代码。例如,它能够捕获艾达的C++异常,并抛出Objul-C C,反之亦然。 另一个编译器是GNAT CCG,也称SPARK2C。它的设计目标是没有其他Ada编译器的嵌入式设备。它支持最新的Ada标准,但对于需要运行时的特性来说非常有限。基本上,没有运行时。没有运行时,没有问题。没有什么可供移植的。在这个编译器中,可以从函数(ADA2005+功能)返回有限的记录,但不能有RAII、任务等。我想,这些要求比ADA95严格得多。GNAT CCG尚未公开,但我希望它能在Ada年度制作之前出现,否则这将是一个非常愚蠢的情况


另一个选项是Ada到Java或Ada到.NET,也许它们比其他选项更适合您的应用程序。

我对Ada一无所知,但我想我的问题是,为什么您不只是人工翻译程序