什么是“运行时间”?

我听说过“C运行时”、“Visual c++ 2008运行时”等。NET通用语言运行时等。

  • 什么是“运行时"到底是什么?
  • 它是用什么做的?
  • 它如何与我的代码交互?或者更准确地说,我的代码是如何被它控制的?

在Linux上编写汇编语言时,我可以使用INT指令进行系统调用。那么,运行时只是一堆将低级函数包装成更抽象和高级函数的预制函数吗?但这看起来更像是库的定义,而不是运行时的定义吗?

是“runtime"和“# EYZ0"两种不同的东西?

加1

这些天,我在想也许运行时与所谓的虚拟机有一些共同之处,比如JVM。下面这句话引出了这样的想法:

这个编译过程非常复杂,很难破解 有几个抽象层,这些抽象层通常包括三个 翻译器:编译器、虚拟机实现和 汇编程序。——计算系统的要素(介绍, 通往硬件之地的道路)

加上2

这本书专家C编程:C语言的深层秘密。第6章运行时数据结构是对这个问题的有用参考。

加3 - 2021年2月28日上午7:31

以下是我对处理器设计有所了解后的一些看法。整个计算机只是抽象的多个层次。它从基本的晶体管一直到运行的程序。对于任何level N抽象,它的运行时是直接的level N-1抽象,在它下面。是上帝给了我们抽象的0级。

208109 次浏览

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

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

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

根据维基百科:运行时库/运行时系统

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


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

回复:你的编辑,“运行时”和“运行时库”是同一个东西的两个不同的名称。

在我的理解中,运行时就是它的意思——程序运行的时间。您可以说在运行时 / 运行时或编译时发生了一些事情。

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

你其他问题的答案: 我认为术语运行时可以扩展到还包括环境和程序运行时的上下文,因此:

  • 它由程序运行期间所有可以称为“环境”的东西组成,例如其他进程、操作系统和已使用库的状态、其他进程的状态等
  • 在一般意义上,它不与你的代码交互,它只是定义你的代码在什么情况下工作,在执行过程中什么是可用的。

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

运行时描述了你的程序运行时执行的软件/指令,尤其是那些你没有显式地写的指令,但对正确执行你的代码是必要的。

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

运行时代码是库代码,这是正确的,但库代码是一个更通用的术语,描述了由任何库生成的代码。运行时代码是实现语言本身特性所需的代码。

运行时正是你的代码出现的地方,你可以看到你的代码做了很多重要的事情。

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

你的代码将被称为“WORKING IN THEORY”,直到你实际运行你的代码。 Runtime是一个帮助实现这一目标的朋友

运行时执行环境是执行代码的语言实现的一部分,出现在运行时;实现的编译时部分在C标准中称为翻译环境

例子:

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

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

马特·鲍尔答对了。我会举例说明。

考虑运行一个用Turbo-Borland C/ c++(1991年的3.1版本)编译器编译的程序,并让它在32位版本的windows(如Win 98/2000等)下运行。

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

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

实际上,运行时环境是虚拟机思想的大脑产物。虚拟机实现了硬件和程序可能需要执行的内容之间的接口。运行时环境采用这些接口,并将它们呈现给程序员使用。编译器开发人员需要这些工具为其程序提供执行环境。

运行时在某种程度上与设计时和编译时/链接时相反。从历史上看,它来自缓慢的大型机环境,在那里机器时间非常昂贵。

运行时可以表示程序生命的当前阶段(运行时/编译时间/加载时间/链接时间) 或者它可能意味着一个运行时库,它形成了与执行环境交互的基本低级操作。 或者它可能意味着运行时系统,这与执行环境相同

在C程序中,运行时是建立堆栈、堆等的代码,这是C环境所期望的要求。它基本上建立了语言所承诺的环境。(它可以有一个运行时库组件crt0。lib或类似的C)

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

 Mozilla XulRunner的运行时间

你可以看到有“”,有“SDK”或“软件开发工具包”,然后有Runtime,例如。在运行时运行的东西。内容如下:

runtimes'文件夹内容”></p>


<p>win32压缩包包含。exe -s和。dll -s。</p>


<p>所以如。C运行时应该是这样的文件——C运行时库,.so-s或.dll -s——你在运行时运行,通过它们(或它们的内容或目的)包含在C语言的定义中(在“纸上”)而变得特别,然后由你选择的C实现实现。然后你得到那个实现的运行时,使用它并在它的基础上进行构建。</p>


<p>也就是说,稍微分化一下,你的新的基于c语言的程序的用户将需要的可运行文件。作为一个基于C的程序的开发者,你也需要,但是你也需要C编译器和C库头文件;用户不需要这些。</p></div>
                                                                            </div>
                                </div>
                            </div>
                        </div>
                                                <div class=

运行时基本上是指程序与机器的硬件和操作系统交互的时间。C语言没有自己的运行时,相反,它从操作系统(基本上是ram的一部分)请求运行时来执行自己。

如果我阅读上述答案的理解是正确的,运行时基本上是“后台进程”,如垃圾收集,内存分配,基本上任何间接调用的进程,由你的代码编写的库/框架,特别是那些编译后发生的进程,而应用程序正在运行。

我对其他答案不太感兴趣;它们对我来说太模糊太抽象了。我更喜欢讲故事。下面是我试图给出的一个更好的答案。

一个BASIC的例子

假设现在是1985年,你在Apple II上写了一个简短的BASIC程序:

] 10 PRINT "HELLO WORLD!"
] 20 GOTO 10

到目前为止,您的程序只是源代码。它没有运行,我们会说没有“运行时间”;参与其中。

但现在我运行它:

] RUN

它是如何运行的?它如何知道如何将字符串参数从PRINT发送到物理屏幕?我当然没有在代码中提供任何系统信息,PRINT本身也不知道关于系统的任何信息。

相反,RUN实际上是一个程序本身——它的代码告诉它如何解析我的代码,如何执行它,以及如何向计算机的操作系统发送任何相关请求。RUN程序提供&;运行时&;作为操作系统和我的源代码之间的层的环境。操作系统本身是这个“运行时”的一部分,但我们在谈论“运行时”时通常并不打算包括它。比如RUN程序。

编译和运行时的类型

编译二进制语言

在某些语言中,必须先编译源代码才能运行。有些语言将你的代码编译成机器语言——它可以由你的操作系统直接运行。这种编译后的代码通常被称为“二进制”。(即使所有其他类型的文件也是二进制的:)。

在这种情况下,仍然有一个最小的“运行时间”;涉及到——但运行时是由操作系统本身提供的。编译步骤意味着在代码运行之前检测到许多可能导致程序崩溃的语句。

C语言就是这样一种语言;当你运行一个C程序时,它完全可以向操作系统发送非法请求(比如,“让我控制计算机上所有的内存,并将其全部删除”)。如果一个非法请求被命中,通常操作系统只会杀死你的程序,而不告诉你原因,并在程序被杀死时将其内存中的内容转储到一个很难理解的.dump文件中。但有时你的代码中有一个命令,这是一个非常糟糕的想法,但操作系统并不认为它是非法的,比如“擦除这个程序正在使用的随机内存”;;这可能会导致非常奇怪的问题,很难弄清真相。

字节码的语言

其他语言(如Java、Python)将代码编译成操作系统不能直接读取的语言,但特定的运行时程序可以读取编译后的代码。这种编译后的代码通常被称为“字节码”。

这个运行时程序更复杂的是,额外的东西它可以做在你的代码不包括(即使在您所使用的库)——例如,Java运行时环境(“JRE")和Python运行时环境可以跟踪不再需要的内存分配,并告诉操作系统安全重用的内存,它可以捕捉你的代码的情况下将试图发送一个非法请求操作系统,并以可读错误退出。

所有这些开销使它们比编译的二进制语言慢,但它使运行时强大而灵活;在某些情况下,它甚至可以在开始运行后引入其他代码,而不必重新开始。编译步骤意味着在代码运行之前检测到许多会导致程序崩溃的语句;强大的运行时可以防止你的代码做一些愚蠢的事情(例如,你不能“擦除这个程序正在使用的随机内存”)。

脚本语言

还有一些语言根本不会预编译你的代码;运行库执行逐行读取代码、解释代码并执行代码的所有工作。这使得它们比“bytecode”还要慢。语言方面,还更加灵活;在某些情况下,您甚至可以在源代码运行时对其进行修改!尽管这也意味着您可以在代码中使用完全非法的语句,并且它可以在您的生产代码中不引起注意,直到有一天它运行并导致崩溃。

这些通常被称为“脚本”。语言;它们包括Javascript、Perl和PHP。其中一些提供了你可以选择编译代码以提高其速度的情况(例如,Javascript的WebAssembly项目)。所以Javascript可以让网站上的用户看到正在运行的确切代码,因为他们的浏览器提供了运行时。

这种灵活性还允许在运行时环境中进行创新,如node.js,它既是一个代码库,也是一个运行时环境,可以将Javascript代码作为服务器运行,这涉及到与试图在浏览器上运行相同代码的行为非常不同。

Runtime的完全限定名称似乎是为非web应用程序软件提供运行时所需的编程语言相关功能的附加环境。

运行时实现与编程语言相关的功能,这些功能对任何应用程序域都是一样的,包括数学运算、内存操作、消息传递、OS或DB抽象服务等。

运行时必须以某种方式与正在运行的应用程序连接起来才有用,例如作为共享动态库加载到应用程序内存空间中,作为应用程序在其中运行的虚拟机进程,或者作为与应用程序通信的服务进程。