D语言是否完全依赖于D运行时?

8

最近,我一直在学习D语言。我一直对运行时有些困惑。

从我能够收集到的信息来看(并不是很多),我理解它是一种帮助D语言某些特性的运行时环境。比如垃圾回收机制,它会随着你的程序一起运行。但既然D语言被编译成机器码,如果我们的程序不需要垃圾回收等功能,那么它是否真的需要这些功能呢?

令我困惑的是像这样的说法:

"你可以用D语言编写操作系统。"

我知道这并不可能,因为除非使用一些汇编语言,任何编译语言都无法完整支持一个操作系统所需的所有特性。但是如果你有一个调用D代码的内核,那么D运行时会阻止D在这样一个裸机环境中运行吗?或者说D运行时比这更简单吗?它可以被视为源文件/库的"自动"包含,当与你的应用程序一起编译时,它与自己编写该代码的区别不大吗?

也许我看待问题的角度不太对。但我相信一些关于这个主题的信息对很多人都有好处。

2个回答

13

是的,确实可以在主模块(或任何地方)实现编译器所期望的 DRuntime 函数,编译而不需要运行时,它会正常工作 (tm)。

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

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


2
谢谢!非常棒的信息。我对D语言的整体看法提高了几分。我不明白为什么D语言没有更多的发展。它是一门很棒的语言。 - kbzombie
3
因为它仍然存在很多漏洞。 - user541686
5
我做了一个小文件,它可以在没有运行时的情况下工作,只是为了看看我们能多小:http://arsdnet.net/dcode/minimal.d你可以在Linux上编译它(请参见文件顶部的注释),并得到一个不需要Druntime即可运行的微型程序。然而,如果你使用D语言的更多功能,就必须引入越来越多的运行时函数。但是,如果你花时间去实现,你可以用非常少的东西走得相当远。 - Adam D. Ruppe
4
这是一个提供了更多功能、命令行参数、环境变量和结构体的示例:http://arsdnet.net/dcode/minimal.zip - Adam D. Ruppe
1
有没有人愿意给一个快速课程,教如何在Windows上设置和编译一个基本的D语言应用程序?然后我们可以继续添加实现。Adam D. Ruppe有一个很好的例子。但我在这里刚开始就遇到了困难。 - kbzombie

6

我想它与C和C++基本相同。该语言本身编译成原生代码并直接运行。但是,总有一些必须的代码来设置所有内容以运行程序,例如处理命令行参数。

某些更复杂的语言功能更好地通过调用一些标准代码来实现,而不是在使用每个代码时都生成代码。例如,抛出异常需要找到相关的处理程序函数。毫无疑问,编译器可以在它被使用的任何地方插入执行此操作的代码,但最明智的做法是编写一个库并调用它。此外,在标准库中还有许多预写的库函数。

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

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


更棒的信息!谢谢! - kbzombie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接