【问题标题】:Are there modern compilers for high level languages on simple processors which produce self-modifying code?是否有用于生成自修改代码的简单处理器上的高级语言的现代编译器?
【发布时间】:2012-10-24 14:36:15
【问题描述】:

在缓存和分支预测之前的日子里,如果不鼓励为某些类型的优化制作自修改代码,那是相对普遍的。在 8 位到早期 32 位之间的时代,它可能最常见于用汇编程序编写的游戏和演示,例如 Amiga。

我不确定当时是否有任何编译器发出自修改汇编程序或机器代码。

我想知道是否有任何当前/现代编译器可以这样做。显然,在具有缓存的强大处理器上,这将是无用的或太难了。

但是嵌入式系统中使用的非常多的简单处理器呢?对于任何简单/8 位/嵌入式处理器,任何现代编译器都认为自我修改代码是一种可行的优化策略吗?


有一个类似标题的问题,“Is there any self-improving compiler around? ",但请注意,这不是同一个主题:

请注意,我说的是一个自我改进的编译器——而不是一个改进它所编译的代码的编译器。

【问题讨论】:

  • 这在 1960 年代可能通过 COBOL ALTER 动词更为常见。
  • 用于 8 位和 Amiga/Atari 的旧编译器根本没有生成非常高效的代码,所以我很确定他们没有使用这样的技巧。同样对于嵌入式系统,代码通常位于 ROM 中,因此不能进行自我修改。但这是一种有趣的技术:)
  • @VilleKrumlinde:哦,我忘记了 ROM 因素——谢谢。
  • 如果任何编译器生成自修改代码,即使作为选项,我都会感到惊讶。除了 ROM 问题,它不是中断/线程安全的。
  • @hippietrail - 如果您确实找到了使用这种可恶“优化”的编译器,请将其关闭或找到另一个编译器:)

标签: optimization compiler-construction embedded self-modifying 8-bit


【解决方案1】:

当今所有的嵌入式系统都使用闪存 ROM。我相信 Amiga 和类似的系统都是基于 RAM 的系统。嵌入式系统中存在“自我修改”的唯一方式是您拥有引导加载程序,根据应该使用的程序和/或功能对闪存的某些部分进行重新编程。

除此之外,程序在运行时修改自身是没有意义的。通常不鼓励从 RAM 运行代码,出于安全原因(可能由错误引起的意外修改)和电气原因(RAM 易失且对 EMC 比闪存更敏感)。

【讨论】:

  • 嗯,Amiga 有一个 ROM,其中包含的内容比 PC BIOS 更多,但不是整个操作系统,其中大部分在启动时加载到 RAM 中。我不记得职责是如何划分的。
猜你喜欢
  • 2011-03-04
  • 2013-07-18
  • 2013-09-14
  • 2020-12-13
  • 1970-01-01
  • 2013-05-10
  • 2014-09-17
  • 2023-03-22
  • 2023-03-13
相关资源
最近更新 更多