【问题标题】:Languages suited for development without dynamic memory allocation适合在没有动态内存分配的情况下开发的语言
【发布时间】:2013-06-02 15:58:02
【问题描述】:

除了 C 和 C++ 之外,是否还有其他语言可以在没有动态内存分配(即堆)功能的情况下显式使用。在某些关键任务嵌入式系统中,禁止使用堆以消除可能连续运行多年的软件的内存泄漏问题。一些特殊用途的编译器还明确禁用 newmalloc 以强制执行此做法。

我查看了一些函数式语言,即 TimberErlang 的嵌入式重点,但它们似乎都使用带有垃圾收集器的堆。 OCamlHaskell 尽管静态类型也使用垃圾收集器,显然 Python、Ruby 和其他动态类型语言严重依赖垃圾收集和堆空间。

  • 任何高级语言都支持这种不动态分配内存的要求吗?
  • 考虑到它们的语言语义,功能性静态类型语言的编译器是否可以这样做?

【问题讨论】:

  • 我会考虑 C++ 模板 very 高级别的(例如,可以在模板中编译 Logic)。但它比其他语言要难学得多。
  • 您认为Forth 是一种高级语言吗?
  • 我想找到比 Forth 更“高级”的东西。我知道 C++ 模板 support all kinds of crazy capabilities,但我一直觉得模板元编程更像是一种语言的发现技巧,而不是有意的用例。
  • 动态分配有点误称。即,仅仅禁止mallocnew 是不够的。它们只是其他功能。使用 Java 或更具体的 垃圾收集,您可以有非故意引用。像 alloca() 这样的东西允许从 stack 进行运行时分配,就像 C/C++ Variable length arrays 一样。甚至这也可能被禁止,因为您对 动态内存 的定义可能与其他人不同。我相信您想要在编译时预先确定最大内存使用量的东西。
  • FragmentPoolCat U-Utah。另一个镜头与tlsf.baisoku.org 的时间有关

标签: memory-management embedded heap-memory


【解决方案1】:

程序本质上是数据结构及其通过使用合适的算法进行的操作。数据必须保存在内存中的某个地方。它可以在全局、堆栈或堆内存中。

仅仅因为没有使用堆并不能保证全局或堆栈不会被错误代码破坏。

如果一个系统设计得很好,那么它应该具有执行所需功能所需的所有必要资源,即 cpu、内存、操作系统、带宽、电源、冷却等。

可以通过管理全局内存而不是堆内存来实现,但这会使许多使用指针的库变得无用。

我认为最好的方法是保持简单,在运行/调试时获得系统的大量动态可见性,并确保在宣布适合部署之前彻底执行单元测试、代码覆盖测试和系统边界测试。

如果它的设计、设计和测试都很好,那么它应该做好它应该做的所有事情,而不是做它不应该做的任何事情。

有些编译语言没有指针,例如Fortran,但我不知道有任何嵌入式系统专门使用 Fortran 来实现系统。

【讨论】:

  • 这似乎不是基于对问题中的关注点或所提到概念之间的差异的理解。例如,指针并不意味着动态分配。
  • 此外,即使系统没有内存泄漏——堆内存也可能由于堆碎片而意外耗尽,尤其是在连续运行的受限系统中年...
  • 我不只是在寻找一种不同的管理内存分配的方法,而是一种可以编译成纯静态分配内存的语言,并带有用于函数调用的堆栈。因此,在 Sylvain 看来,碎片化是不可能的。内存应在编译时完全分配,并保留一些堆栈空间。
  • 是的,但请注意,如果您的程序正在由操作系统加载,则编译器所做的“分配”仍然必须由操作系统动态实现(作为一个块)。如果您正在编写一个裸机程序,或者您已经为任何内核进行了静态内存预留的程序,那么实现编译器(和链接器)编写的代码是一个更具确定性的过程。
【解决方案2】:

你可以看看 ADA。几年前,我一直在嵌入式平台上使用 ADA83。它根本不需要动态分配,它和 C 一样高级(在我看来,它甚至比 C 更好)。当然,问题是为您的平台获取 ADA 编译器。也许GNAT 对你有用。

【讨论】:

  • 从我目前发现的情况来看,Ada 似乎确实是满足这一特定要求的最佳当前可用语言。
猜你喜欢
  • 2010-10-10
  • 1970-01-01
  • 2017-05-25
  • 2015-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-06
  • 1970-01-01
相关资源
最近更新 更多