8

最近一直在学习D语言。我一直对运行时感到困惑。

从我能收集到的关于它的信息中,(这不是很多)我知道它是一种有助于 D 的某些功能的运行时。像垃圾收集一样,它与您自己的程序一起运行。但是既然 D 被编译成机器码,如果我们的程序不需要的话,它真的需要垃圾回收等功能吗?

真正让我感到困惑的是以下陈述:

“你可以用 D 编写操作系统。”

我知道你不能真正做到这一点,因为操作系统比任何编译语言在不使用汇编的情况下所能提供的更多。但是如果你有一个调用 D 代码的内核,D 运行时会阻止 D 在这样的准系统环境中运行吗?还是 D 运行时比这更简单?是否可以将其简单地视为源文件/库的“自动”包含,当与您的应用程序一起编译时,与您自己编写该代码没有什么不同?

也许我只是看错了。但我确信有关该主题的一些信息可以使很多人受益。

4

2 回答 2

13

是的,确实,您可以在您的主模块(或任何地方)中实现编译器期望的 DRuntime 功能,无需运行时编译,它就可以正常工作(tm)。

如果您只是在没有运行时的情况下构建代码,编译器会在缺少它期望由运行时实现的符号时发出错误。然后你可以去看看 DRuntime 是如何实现它的,看看它做了什么,然后以你喜欢的任何方式实现它。这就是 XOmB,用 D 语言编写的内核(虽然是语言版本 1,但同样的交易)所做的:http://xomb.net/index.php?title= Main_Page

很多 DRuntime 实际上并没有被许多应用程序使用,但它是将 D 的运行时组件包含到应用程序中的最方便的方式,所以这就是为什么它作为静态库(希望将来成为共享库)完成的原因。

于 2012-11-09T10:14:36.820 回答
6

它与我期望的 C 和 C++ 几乎相同。该语言本身编译为本机代码并运行。但是有一些代码总是需要设置所有东西来运行你的程序,例如处理命令行参数。

通过调用一些标准代码而不是在使用它的任何地方生成代码,可以更好地实现一些更复杂的语言设施。例如抛出异常需要找到相关的处理函数。毫无疑问,编译器可以在任何使用它的地方插入代码,但在库中编写代码并调用它更明智。此外,标准库中有许多预先编写的库函数。

所有这些加在一起就是运行时。

如果您编写 C,您可以使用它来编写操作系统,因为您可以自己编写启动代码,您可以自己编写所有用于处理内存分配的代码,您可以自己编写标准函数(如 strcat)的所有代码,而不是使用在运行时提供的。但是你不想对任何应用程序这样做。

于 2012-11-09T10:15:26.570 回答