【发布时间】:2016-03-26 05:44:18
【问题描述】:
我真的很想将 swift 用于嵌入式编程,因为我觉得它是 c++ 更好的替代品,我使用的处理器是 ARM Cortex-M4F(http://www.ti.com/tool/ek-tm4c123gxl)。查看 swift 编译器page,它说您可以从 swift 源生成 LLVM IR,然后我希望与 LLVM 交叉编译。这可能吗?
【问题讨论】:
标签: swift arm llvm llvm-clang llvm-ir
我真的很想将 swift 用于嵌入式编程,因为我觉得它是 c++ 更好的替代品,我使用的处理器是 ARM Cortex-M4F(http://www.ti.com/tool/ek-tm4c123gxl)。查看 swift 编译器page,它说您可以从 swift 源生成 LLVM IR,然后我希望与 LLVM 交叉编译。这可能吗?
【问题讨论】:
标签: swift arm llvm llvm-clang llvm-ir
用 Swift 生成机器码绝对是可能的。事实上,当你在 Xcode 或 swiftc 命令行编译器编译 Swift 程序时,默认情况下,生成的可执行文件是由机器码组成的。
LLVM 字节码是在构建过程中的某个时间点生成的,但生成的最终可执行文件是机器码。如果需要,有一些编译器选项允许您仅生成 LLVM 字节码,但 LLVM 字节码通常不直接执行,例如 Java 字节码由 Java 运行时运行。
至于 ARM 的交叉编译,我不确定它如何与 swiftc 工具配合使用,但如果您构建一个 Xcode iOS 项目,它会生成一个 ARM 可执行文件。我确信 swiftc 编译器具有生成 ARM 可执行文件所需的所有选项。
但是,我能想到的一个问题是 Swift 的许多功能都依赖于 Apple 的框架。不过,现在 Swift 已经开源了,各种东西的纯 swift 库也逐渐多了起来。
【讨论】:
我正在探索这种可能性(将 Swift 用于嵌入式应用程序)。由于 Swift 需要一个运行时,在静态编译“Hello, World!”之后(在使用最新 Swift 3.0.2 的 Ubuntu、x86-64 上)结果二进制大小超过 5 MB,这可能是“小型”ARM 控制器(如 Cortex-M0)的问题。
【讨论】:
我也对这个话题很感兴趣——在裸机上运行一个纯 swift 程序,因为 swift 语言有很多现代语言特性。最近 Madmachine.io 发布了一款名为 SwiftIO 的基于 ARM M7 内核的板。它可以运行由 GCC for ARM 编译的纯 swift 代码。他们还开发了一个集成所有工具链的 IDE。
他们使用了一种聪明的方式来利用完整的语言特性,而不是像 Tiny Go 那样重写特殊版本的语言编译器,他们使用 gcc-arm 将纯 swift 代码编译成二进制文件。如上所述,如果没有 swift 编译器团队更强大的支持,处理底层问题并不容易。 SwiftIO 只是简单地移植了带有外部 32M ram 的 Zephyr RTOS 并将二进制文件保存到外部 MicroSD 卡中,而不是像通常在其他嵌入式板上所做的那样将它们刻录到片上闪存中。所有底层功能——GPIO、I2C、SPI、UART、显示和网络等驱动程序都是由RTOS用C代码实现的。 SwiftIO 框架只是将它们移植到 swift 中。芯片内部的 Bootloder 从 SD 卡中获取二进制文件并将其放入内存中然后运行它。就这样。完美!
【讨论】: