24

我喜欢我读过的很多关于 D 的内容。

  • 统一文档(这将使我的工作更轻松。)
  • 语言内置的测试能力。
  • 调试语言中的代码支持。
  • 转发声明。(我一直认为两次声明同一个函数是愚蠢的。)
  • 内置功能替换预处理器。
  • 模块
  • Typedef 用于正确的类型检查而不是别名。
  • 嵌套函数。(咳嗽帕斯卡 咳嗽
  • 输入和输出参数。(这是多么明显!)
  • 支持低级编程 - 嵌入式系统,哦,是的!

然而:

  • D 可以支持不运行操作系统的嵌入式系统吗?
  • 它不支持 16 位处理器的明确声明是否完全排除了在此类机器上运行的嵌入式应用程序?有时你不需要锤子来解决你的问题。
  • 垃圾收集在 Windows 或 Linux 上非常有用,但不幸的是,嵌入式应用程序有时必须进行显式内存管理。
  • 数组边界检查,你喜欢它,你讨厌它。非常适合设计保证,但对于性能问题并不总是允许的。
  • 多线程支持对嵌入式系统(不运行操作系统)有何影响?我们有一个客户甚至不喜欢中断。少得多的操作系统/多线程。
  • 是否有适用于嵌入式系统的 D-Lite?

所以基本上 D 适合只有几兆字节(有时小于 1 兆字节)的嵌入式系统,不运行操作系统,其中最大内存使用量必须在编译时(根据要求)知道,并且可能在小于 32 位的东西上处理器?

我对其中的一些功能非常感兴趣,但我觉得它是针对桌面应用程序开发人员的。

具体是什么使它不适合 16 位实现?(假设 16 位架构可以处理足够数量的内存来保存运行时,无论是在闪存还是 RAM 中。)仍然可以计算 32 位值,尽管它比 16 位慢并且需要更多操作,使用库代码。

4

3 回答 3

12

我不得不说这个问题的简短回答是“不”。

  • 如果您的机器是 16 位的,那么将 D 装入其中会遇到很大的问题——它显然不是为它设计的。
  • D 本身并不是一种轻量级语言,它会生成大量运行时类型信息,这些信息通常会链接到您的应用程序中,而且类型安全的可变参数也需要这些信息(因此标准的格式化功能是 Tango 或 Phobos)。这意味着即使是最小的应用程序的大小也令人惊讶地大,因此可能会使 D 不符合低 RAM 系统的资格。此外,将运行时作为共享库的 D(可以缓解其中一些问题)几乎没有经过测试。
  • 所有当前的 D 库都需要在它下面有一个 C 标准库,因此通常还需要一个操作系统,因此即使这样也不能使用 D。但是,D 中确实存在实验性内核,因此这本身并不是不可能的。截至今天,它不会有任何图书馆。

我个人希望看到你成功,但怀疑这将是一件容易的事。

于 2009-07-30T17:28:05.417 回答
7

首先阅读larsivi 的回答。他在 D 运行时工作,并且知道他在说什么。

我只是想补充一下:你问的一些问题已经成为可能。它不会让你一路走好,错过在这里就像一英里一样好,但仅供参考:

垃圾收集在 Windoze 或 Linux 上非常有用,但不幸的是,嵌入式应用程序有时必须进行显式内存管理。

您可以关闭垃圾收集。那里的各种实验性 D OS 都可以做到这一点。请参阅std.gc模块,尤其是std.gc.disable. 另请注意,您不需要使用 分配内存new:您可以使用mallocfree。甚至可以使用它分配数组,您只需要使用切片在分配的内存周围附加一个 D 数组。

数组边界检查,你喜欢它,你讨厌它。非常适合设计保证,但对于性能问题并不总是允许的。

数组规范特别要求编译器允许关闭边界检查(参见“实现说明”)。 gdc提供-fno-bounds-check,并且在dmd使用中-release应该禁用它。

多线程支持对嵌入式系统(不运行操作系统)有何影响?我们有一个客户甚至不喜欢中断。少得多的操作系统/多线程。

这一点我不太清楚,但鉴于大多数 C 运行时允许关闭多线程,似乎可以让D 运行时也禁用它。尽管我不能告诉你,现在这是否容易或可能。

于 2009-07-30T17:57:03.533 回答
1

这个问题的答案已经过时了:

D 可以支持不运行操作系统的嵌入式系统吗?

D 可以针对 ARM Linux和ARM Cortex-M进行交叉编译。一些项目旨在为 Cortex-M 架构创建库,例如 STM32 的 MiniLibD或使用 STM32 的通用库的这个项目。(您可以在 ARM Cortex-M 上的 D 中实现自己的简约操作系统。)

它不支持 16 位处理器的明确声明是否完全排除了在此类机器上运行的嵌入式应用程序?有时你不需要锤子来解决你的问题。

不,请参见上面的答案......(但我不希望在不久的将来支持比 Cortex-M 更“小”的架构。)

垃圾收集在 Windows 或 Linux 上非常有用,但不幸的是,嵌入式应用程序有时必须进行显式内存管理。

您可以编写垃圾收集免费代码。(D 基金会的目标似乎是“兼容 GC”的标准库 Phobos,但这项工作正在进行中。)

数组边界检查,你喜欢它,你讨厌它。非常适合设计保证,但对于性能问题并不总是允许的。

(正如您所说,这取决于您的“个人品味”和设计决策。但由于 D 编译器开发人员的背景和 D 的设计目标,我认为边界检查的性能开销是可以接受的。)

多线程支持对嵌入式系统(不运行操作系统)有何影响?我们有一个客户甚至不喜欢中断。少得多的操作系统/多线程。

(问题是什么?可以使用 D 的语言功能实现多线程,例如在这个问题中解释。顺便说一句:如果你想使用中断,请考虑这个Cortex-M3 的“hello world”项目。)

是否有适用于嵌入式系统的 D-Lite?

D的SafeD 子集以嵌入域为目标。

于 2017-07-09T11:08:44.687 回答