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

时间:2010-12-24 13:19:13

标签: iphone android embedded arm llvm

我正在寻找从相同代码库有效创建Android和iPhone目标应用程序的可能方法,无论是在C / C ++ / C#/ Objective-C还是Java(使用VMKit)。

LLVM看起来很有前景,但是我对于围绕不同ARM CPU实现的兼容性问题略感混淆,主要来自底层芯片组如何“解析”图形和声音代码(即我必须编写特定的ARM代码)芯片组,或者更高级别的API,如OpenGL,是否足够?)。

我对各种Cross Dev产品(即Airplay SDK,MoSync(GPL-GCC),Unity3d,XMLVM等)知之甚少,但我真正想做的是用Java编写或使用C语言/ C ++引擎,如果可能,发出LLVM IR并创建兼容的ARM可执行文件。

如果上述任何内容含糊不清,请致歉。

由于

3 个答案:

答案 0 :(得分:3)

LLVM与你需要的任何其他编译器没什么区别,所以我担心答案是否定的。

LLVM IR用外行的术语来说是一个“部分编译”的代码,可以用来编译终端设备上的其余代码。例如,如果您有一个图形密集型应用程序,您可以在IR中发送部分内容,然后在设备上进行编译以获得特定硬件的最佳性能。

根据您的需要,您需要使用您提到的产品之一,或者使用本机UI(使用Cocoa / VMKit),但可以在应用程序中共享数据/逻辑代码

答案 1 :(得分:3)

编译器不是问题。要为两者进行开发,您需要创建一个允许您在该层上编写单个应用程序的抽象层。然后有两个抽象层实现,一个是进行Android api调用,另一个是进行iPhone api调用。编译器无法帮助您。

LLVM IR在其可移植性方面可能很有意思,例如:

int a,b;

a=7;
b=a-4;

编译为IR然后采用相同的IR并为所有不同的处理器类型生成汇编程序并检查差异。

对于需要在显示器上写入像素的实际应用程序,存在寄存器,显示器的大小和其他差异的大量存在,并且IR和汇编器后端之间不会暴露这些差异但是暴露在主C程序和平台库定义的api调用中,所以你必须解决C中的问题而不是IR或汇编程序。

答案 2 :(得分:2)

对于库存OS设备的标准应用程序商店合法开发,应用程序中的声音和图形代码都与底层芯片组或特定ARM CPU架构无关。声音和图形(以及所有其他用户IO)由每个操作系统通过平台相关的API和库链接进行抽象。您可以为每个平台的完全不同的API编写代码,也可以在顶部使用抽象层,例如Unity等。人

LLVM可能允许您针对ARM体系结构中的某些差异(armv6,armv7,fp支持等)从中间代码优化到机器代码,但仅限于不包含用户IO或其他要求的自包含代码任何更高级别的界面都用于操作系统。