什么是所谓的“无开销”系统语言的运行时环境?

 2020-05-24 

What is a runtime environment for supposedly “no-overhead” systems languages?

具体来说,我谈论的更多是C ++和Rust,而不是其他。在Java和C#具有运行时的意义上,我不明白C ++如何具有"运行时",而Java和C#在具有自己的封装抽象的虚拟机之上运行,因此,我不了解C ++可能有一个。

以C ++的虚拟表为例。我们是否将dynamic_cast视为C ++运行时功能的一部分,还是我们一般在谈论C ++的vtables结构?我们可以认为newdelete是C ++运行时环境的一部分吗?究竟什么构成运行时?

例如,这里我们在自己的运行时上提供了Rust文章,其描述为:

The Rust runtime can be viewed as a collection of code which enables
services like I/O, task spawning, TLS, etc. It's essentially an
ephemeral collection of objects which enable programs to perform
common tasks more easily.

但这不是标准库的功能或语言功能,不是实际的运行时吗?是什么构成这个非常稀薄但存在的运行时?甚至Bjarne都表达了他的思想,即C ++具有"零开销抽象",但是,如果C ++具有运行时,这是否意味着C ++确实具有某种"后端"代码来编排自己非常轻便但仍然存在的抽象?

TL; DR:在像C ++和Rust这样的语言中,所谓的"零开销"并且没有像Java或C#这样的"繁重"的运行时,什么是运行时和/或运行时环境?

编辑:我怀疑我只是在这里缺少一些语义...


C ++需要一些C不需要的东西。

例如,它通常涉及一些异常处理开销。尽管可能不是严格要求的,但是大多数系统至少都有一小部分顶级异常处理程序来告诉您,如果引发了异常但未在任何地方捕获到异常,则程序将关闭。

值得怀疑的是,它是否符合"运行时环境"的条件,但是编译器还会生成代码,以在堆栈中搜索并在抛出异常时查找特定异常的处理程序。

一方面,与诸如完整的JVM之类的东西相比,这是极其微小的(可以忽略不计)。另一方面,相对于诸如JVM或Microsoft的CLR之类的默认情况而言,它相当庞大和复杂。

至于零开销...嗯,这取决于您的观点。异常处理代码通常可以从代码的主流中移出,因此,只要不引发异常,就不会在执行速度方面造成任何开销。但是,它确实需要额外的代码,因此如果您查看可执行文件的大小,可能会(通常是)有很多开销。例如,快速浏览一下" hello world"程序,看起来好像关闭异常处理后,使用VC ++可以将可执行文件的大小减少大约2 KB。

诚然,2K并不是很多额外的代码-另一方面,这实际上是人类最琐碎的程序中添加的内容。对于一个实际上能做某事的程序来说,无疑更多。

最后,仅仅大多数人真正有理由要照顾是不够的,但是它确实存在。

至于处理方式,它涉及从标准库链接到的代码和由编译器生成的代码的组合(但是具体细节随实现而有所不同,例如,大多数32位Windows编译器使用Microsoft的Structured Exception处理(在这种情况下,操作系统提供了部分代码),但对于64位Windows,我相信它们全部都是自己处理异常处理(这增加了可执行文件的大小,但降低了速度方面的开销)。