什么是“运行时”?


403

我听说过诸如“ C运行时”,“ Visual C ++ 2008运行时”,“。NET公共语言运行时”等内容。

  • 究竟什么是“ 运行时 ”?
  • 它是什么做的?
  • 它如何与我的代码交互?或者更确切地说,我的代码如何受到它的控制?

在Linux上对汇编语言进行编码时,我可以使用INT指令进行系统调用。那么,运行时仅是一堆将低级功能包装为更多抽象和高级功能的预制功能吗?但这是否更像是库的定义,而不是运行时的定义?

“运行时”和“ 运行时库 ”是两个不同的东西吗?

加1

这些天,我在想运行时可能与所谓的虚拟机(例如JVM)有一些共同点。这是引出这种想法的语录:

该编译过程非常复杂,足以分解为几层抽象,并且通常涉及三个转换器:编译器,虚拟机实现和汇编器。--- 计算系统的要素(简介,通往硬件之路)

加2

专家C编程:C的深层秘密》一书。第6章“运行时数据结构”是对此问题的有用参考。


运行时包含runtime library一些控制代码和一些状态(由OS提供)。
马丁·约克

43
好问题,总是对此提出质疑。
contactmatt 2012年

我不会将INT称为函数。请参阅stackoverflow.com/questions/1817577/…了解更多详细信息。
Koray Tugay,2015年

2
我发现了一个姊妹网站可能有用的另一篇文章:programmers.stackexchange.com/questions/294346/...
CloudyTrees

我总是把它当作低级基础架构的沙箱。您在Unix套件上具有任务管理器/或进程,所有低级GUI库等。所有这些都是运行时的一部分。事物建立的基础。
JGFMK

Answers:


262

运行时描述了程序运行时执行的软件/指令,尤其是那些您没有明确编写但对于正确执行代码是必需的指令。

像C这样的低级语言,运行时非常小(如果有)。像Objective-C这样的更复杂的语言,其允许动态消息传递,具有更广泛的运行时。

您是正确的,运行时代码是库代码,但是库代码是一个更通用的术语,它描述了任何库产生的代码。运行时代码专门是实现语言本身功能所需的代码。


103

运行时是一个通用术语,指代您的代码在其上运行的任何库,框架或平台。

C和C ++运行时是函数的集合。

.NET运行时包含一个中间语言解释器,一个垃圾收集器等。


4
C ++标准库不仅包含函数,而且对于Matt Ball而言,C和C ++“运行时”是运行时库,.NET运行时是运行时库和运行时系统。
smerlin

1
我的问题是静态库也可以运行吗?我猜这个术语主要用于共享对象,不是吗?考虑在Linux中使用libc。平台和框架又如何呢?他们也分解成图书馆吗?
阿米尔扎德

3
但是我的代码实际上如何任何“ 库,框架或平台 ”上运行?它应在CPU或其他处理单元上运行。您能否提供更多详细信息以进行进一步说明?
n611x007 2012年

C和C ++运行时是函数的集合。->什么功能?
Koray Tugay,2015年

3
@KorayTugay:标准库中的函数,例如coutprintf
SLaks 2015年

80

根据Wikipedia:运行时库 / 运行时系统

在计算机编程中,运行时库是编译器使用的特殊程序库,用于在计算机程序的运行时(执行)实现内置于编程语言中的功能。这通常包括用于输入和输出或用于内存管理的功能。


运行时系统(也称为运行时系统或简称运行时)是旨在支持执行以某些计算机语言编写的计算机程序的软件。运行时系统包含基本低级命令的实现,并且还可以实现高级命令,并且可以支持类型检查,调试,甚至代码生成和优化。程序员可以通过应用程序编程接口访问运行时系统的某些服务,但可能无法访问其他服务(例如任务调度和资源管理)。


回复:您的edit,“运行时”和“运行时库”是同一事物的两个不同名称。


69
维基百科不是引号的好来源。这是一个开始寻找权威资源的好地方,但是它本身不应该被认为是权威的,因此引用它是不可靠的。(根据维基百科的创建者威尔士先生的陈述)。
马丁·约克

5
第一个引号中的“运行时期间”(据说是关于运行时库)指的是什么?一种简单的[mis]解释如下:“在执行程序时,编译器并行地(本身)使用一个库来实现(即在运行时生成附加代码)“已承诺”(根据语言规范) )程序的功能”。这可能是错误的,并且/或者很容易随运行时系统而改变。
n611x007

2
要从Loki离开的地方继续,尤其是当这两篇文章都未提供任何参考(不是引述时,我想我最好说这句话)
arsaKasra 2013年

1
@MartinYork,不仅不是权威性的百科全书,它还关注文档而不是说明。这些可能会大不相同。
罗伊·普林斯

59

运行时执行环境是一个语言实现,其执行码和存在于的部分运行时 ; 实现的编译时部分在C标准中称为转换环境

例子:

  • Java运行时由虚拟机和标准库组成

  • 通用的C运行时由加载程序(是操作系统的一部分)和运行时库组成,该运行时库实现C语言的未由编译器内置到可执行文件中的部分;在托管环境中,这包括标准库的大部分内容


2
谢谢,我认为这是该主题的最佳答案。
Koray Tugay 2015年

1
我赞赏命名“执行环境”,但我认为仅使用“运行时”作为前者的别名是个坏主意(根据我的观察,许多程序员所做的事情),“运行时环境”更为准确。我同意@MichałTrybus的观点,“运行时”是指“程序运行的时间”。
WloHu

32

在我的理解中,运行时的确切含义是程序运行的时间。您可以说在运行时 / 运行时或编译时发生了某些事情。

我认为运行时运行时库应该是(如果不是)两个独立的东西。“ C运行时”对我来说似乎不合适。我称它为“ C运行时库”。

回答其他问题:我认为运行时一词可以扩展为还包括程序运行时的环境和上下文,因此:

  • 它包含程序运行时可以称为“环境”的所有内容,例如其他进程,操作系统和使用的库的状态,其他进程的状态等
  • 它在一般意义上不与您的代码交互,它仅定义您的代码在什么情况下工作,在执行过程中可用的代码。

这个答案只是在某种程度上扩展了我的观点,而不是事实或定义。


29

马特·鲍尔回答正确。我会举例说明。

考虑运行用Turbo-Borland C / C ++(1991年版本3.1)编译的程序,并使其在32位版本的Windows(如Win 98/2000等)下运行。

这是一个16位编译器。您会看到所有程序都有16位指针。当您的操作系统为32位时,为什么会这样?因为您的编译器设置了16位执行环境,并且32位版本的OS支持该环境。

所谓的JRE(Java运行时环境)为Java程序提供了可能需要执行的所有资源。

实际上,运行时环境是虚拟机思想的产物。虚拟机实现硬件与程序可能需要执行的操作之间的原始接口。运行时环境采用这些接口,并提供给程序员使用。编译器开发人员将需要这些工具来为其程序提供执行环境。


虚拟机实现硬件与程序可能需要执行的操作之间的“原始”接口。->我不确定。
Koray Tugay,2015年

7

在代码生效的确切时间运行,您会看到代码要做的许多重要事情。

运行时负责使用操作系统的子系统(例如,文件服务,IO服务,网络服务等)分配内存,释放内存。

您的代码将被称为“理论上的工作”,直到您实际运行代码为止。Runtime是帮助实现这一目标的朋友。


3

运行时可以表示程序生命周期的当前阶段(运行时/编译时间/加载时间/链接时间),也可以表示运行时库,该库形成与执行环境对接的基本低级操作。否则可能意味着运行时系统,它与执行环境相同。

在C程序的情况下,运行时是设置C环境期望的设置堆栈,堆等的代码。它实质上建立了语言所承诺的环境。(它可能具有运行时库组件crt0.lib或类似的C语言)


3

我发现以下文件夹结构为理解什么提供了非常有见地的上下文runtime

Mozilla XulRunner的运行时

您会看到有“ ”,有“ SDK ”或“软件开发套件”,然后有Runtime,例如。正在运行的东西-在运行时。它的内容就像:

运行时的文件夹内容

Win32 zip包含.exe -s和.dll -s。

因此,例如。C运行时就是这样的文件-C运行时库,.so-s或.dll -s-您在运行时运行,它们的定义(或它们的内容或目的)使其与众不同。 C语言(在“纸上”),然后由您选择的C实现来实现。然后,您将获得该实现的运行时,以对其进行使用并在其上进行构建。

也就是说,基于C的新程序的用户将需要使用一些可运行的文件,但需要两极分化。作为基于C的程序的开发人员,您也是如此,但是您也需要C编译器和C库标头。用户不需要这些。


1
一个又一个的背景情况运行时,这是不相关的文章蟒蛇神话的部分神话6,在这里你可以看到的区分运行时编程语言,神话6的第一款
n611x007

3

运行时基本上是指程序与计算机的硬件和操作系统进行交互的时间。C没有自己的运行时,而是从操作系统(基本上是ram的一部分)中请求运行时以执行自身。


1

如果我从阅读以上答案中得出的理解是正确的,那么运行时基本上就是“后台进程”,例如垃圾回收,内存分配,基本上是由编写代码的库/框架间接调用的任何进程,尤其是那些应用程序运行时在编译后发生的进程。


-1

MSDN文档的以下部分讨论您的大多数问题: http //msdn.microsoft.com/zh-cn/library/8bs2ecf4(VS.71).aspx

我希望这有帮助。

谢谢,达米安


3
实际上,事实并非如此。他不仅在问.Net。
SLaks 2010年

@Matt:再次正确。但是,.Net支持了他2/3的运行时,.NET处理了他的标签的1/2,我只是认为链接会很有用。
Damian Schenkelman 2010年

我会说“ 3/4种语言支持.NET”。.NET并没有提供很多支持,它旨在在中间件级别上保持Unix和Windows之间的裂痕牢固。
马特·乔纳

@MattJoiner-在2010年可能是正确的,但是对于.NET Standard和.NET Core等开放源代码实现而言,今天确实是不正确的
rory.ap

-2

运行时是一个实例,您不知道其在执行期间会创建哪种类型的对象,而对象的创建是基于特定条件或某些计算工作的。相反,编译时是您在执行之前定义所需对象的实例。


-3

运行时与设计时和编译时/链接时有些相反。从历史上看,它来自于大型机环境缓慢,而机器时间昂贵。


1
这不能回答问题,并使问题进一步复杂化。
cglotr
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.