LLVM IR(中间表示)可用于创建跨平台(iPhone和Android)ARM可执行文件吗?

3
我正在寻找一种有效的方法,可以从同一代码库中为Android和iPhone创建应用程序,无论是使用C / C ++ / C#/ Objective-C还是Java(使用VMKit)。
LLVM看起来很有前途,但我对涉及不同ARM CPU实现的兼容性问题有些困惑,主要是从图形和声音代码如何被底层芯片组“解决”的方面(即我是否必须编写特定于ARM芯片组的代码,或者更高级别的API,例如OpenGL,是否足够?)。
我了解各种交叉开发产品(即Airplay SDK、MoSync(GPL-GCC)、Unity3d、XMLVM等),但我真正想做的是要么用Java编写,要么使用C / C ++引擎,发出LLVM IR并创建兼容的ARM可执行文件,如果可能的话。
如果上述任何内容含糊不清,请谅解。
谢谢
Rich
3个回答

3
LLVM与其他编译器没有什么不同,所以恐怕答案是否定的。LLVM IR通俗地说是“部分编译”的代码,并且可以用于在终端设备上编译其余部分。例如,如果您有一个图形密集型应用程序,您可以将IR中的部分内容发送到设备上进行编译,以获取最佳性能。对于您想要的内容,您需要使用您提到的产品之一,或者使用原生UI(使用Cocoa / VMKit),但可能在应用程序中共享数据/逻辑代码。

3

编译器并不是问题。为了同时开发两个平台,你需要创建一个抽象层,让你在该层上编写单个应用程序。然后,有两个抽象层的实现,一个调用Android API,另一个调用iPhone API。编译器无法帮助你做任何事情。

LLVM IR 在其可移植性方面可能会引起兴趣,例如以下程序:

int a,b;
a=7; b=a-4;

编译成IR,然后使用相同的IR为所有不同类型的处理器生成汇编代码,并检查差异。

对于实际的应用程序,例如需要在显示器上写入像素的应用程序,寄存器、显示器尺寸和许多其他差异都存在,这些差异在IR和汇编后端之间不暴露,但在C程序和平台库定义的API调用中暴露出来,因此您必须在C中解决问题,而不是在IR或汇编中。


2

对于标准应用商店的法律开发,针对原始操作系统设备,应用程序中的音频和图形代码与底层芯片组或特定的ARM CPU架构无关。所有用户输入输出(包括声音和图像)都是通过每个操作系统的平台相关API和库链接进行抽象处理的。您可以编写针对每个平台完全不同的API的代码,也可以在其上使用抽象层,例如Unity等。

LLVM可能允许您针对ARM架构(armv6、armv7、fp支持等)中的某些差异从中间代码优化到机器代码,但仅限于自包含代码,不涉及任何用户IO或其他需要使用更高级别接口与操作系统交互的情况。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接