【问题标题】:Differences when writing code for ARM vs x86?为 ARM 与 x86 编写代码时的差异?
【发布时间】:2014-07-29 18:43:04
【问题描述】:

我最近购买了 Raspberry Pi。

我希望开始使用 C 或 Python 为其编写代码。

我知道 ARM 与 x86 架构之间的区别,即。 RISC vs CISC,但我不知道我需要编写的实际代码是否有任何特殊考虑。

如果我在桌面上编写代码并在那里编译,然后在我的 Raspberry Pi 上使用相同的代码并编译,它会编译相同还是会崩溃?

【问题讨论】:

  • 什么都没有,除非您需要编写特定于平台的代码或疯狂优化。这些情况都不适用于您。
  • @closevoters 尽管您可以声称这个问题“太宽泛”(尽管我向您保证不是),但在地狱中没有办法“主要基于 opinion ”。有人对代码是否在两个平台上都编译的意见与是否编译无关
  • @Veedrac 我很惊讶我没有投票结束这个。如果问题只是python,那么答案就很清楚了。没人理会mention char 和其他问题。例如,如果性能是一个需要考虑的问题,那么在编码风格上会有几十个差异,这些差异可能会编译成更好的 ARM 汇编器。
  • 我表示这个问题是不清楚你在问什么,而不是在征求意见。可能有一些代码只适用于其中一个。最好问一个关于具体代码的问题。
  • 为了避免编译 C 或 C++ 时的内存或性能限制,一些开发人员设置了交叉编译器。代码在他们的 x86 桌面上编译,但交叉编译器被配置为为 ARM 生成目标代码。我不熟悉确切的细节,记得除了设置一些 gcc 标志之外还有更多。但是了解更多关于交叉编译的知识可能是值得的。

标签: python x86 arm raspberry-pi raspbian


【解决方案1】:

如果您使用 python 编写代码,它可以直接在您的桌面和树莓派上完美运行。

C,你必须重新编译,但仅此而已。如果您开始直接将数据结构写入文件,然后在不同平台上使用相同的文件,也可能会出现一些问题——您通常希望使用可移植的数据格式,其中数据以字符串(JSON、XML、或类似的...)

【讨论】:

  • +1,尽管可能值得指出需要注意的 C 的一些具体实现定义的区域(这可能会影响代码的行为,例如右移有符号的 int 是执行算术移位还是逻辑移位)。还有很多未定义的行为恰好在 x86 上起作用,但在其他平台上不起作用,但这不算数,因为这意味着代码无论如何都是错误的。
  • @notlikethat 好吧,你说的是真的这意味着无论如何代码都是错误的,这并没有真正的帮助(即,一个完整的答案)。任何用过 lint 的人都会明白我的意思。 ARM 和 x86 之间存在关键的可移植性差异。它们是完全可移植代码的子集。这对于像 Python 这样的 虚拟机解释器 来说是一个加分项。
  • @artlessnoise 我认为不需要过多强调,因为“不要依赖未定义的行为,因为您的代码可能无法在另一个平台上运行”远远落后于“不要依赖未定义的行为,因为您的代码可能无法与下一版本的编译器一起使用”,并且“不要依赖未定义的行为,因为您的代码甚至可能无法在您的机器上运行,您只是还没有看到它失败”。跨度>
  • @Notlikethat 是的,这也是事实。但是有很多人认为,因为代码已经在 x86 上运行了许多编译器版本、选项、构建等,所以它应该在 ARM 上运行(至少 OP 已经意识到这可能不是真的)。与“C”标准一致的 ARM EABI 给出了一些答案,例如对齐等。在启用所有编译器警告(并通过static analysis 检查器)的情况下干净编译的代码应该很少有问题;尤其是在几乎没有演员阵容的情况下。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-08
  • 1970-01-01
  • 2014-03-24
  • 2018-10-24
  • 1970-01-01
  • 1970-01-01
  • 2013-10-21
相关资源
最近更新 更多