什么是“运行时”?

时间:2010-10-10 13:49:15

标签: terminology

我听说过“C Runtime”,“Visual C ++ 2008 Runtime”,“.NET公共语言运行时”等等。

  • 究竟什么是“运行时”?
  • 它是由什么构成的?
  • 它如何与我的代码交互?或者更准确地说,我的代码是如何由它控制的?

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

“运行时”和“runtime library”是两回事吗?

ADD 1

现在,我想 Runtime 可能与所谓的虚拟机有共同之处,例如JVM。这是导致这种想法的引文:

  

这个编译过程非常复杂,无法分解   几层抽象,这些通常涉及三层   翻译器:编译器,虚拟机实现和   汇编。 --- The Elements of Computing Systems(简介,   通往硬件土地的道路)

ADD 2

这本书Expert C Programming: Deep C Secrets。第6章运行时数据结构是对此问题的有用参考。

16 个答案:

答案 0 :(得分:184)

运行时描述在程序运行时执行的软件/指令,尤其是那些未明确写入但是正确执行代码所必需的指令。

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

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

答案 1 :(得分:91)

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

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

.NET运行时包含intermediate language解释器,垃圾收集器等。

答案 2 :(得分:69)

根据维基百科:runtime library / run-time system

  

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


  

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


Re:您的编辑,“运行时”和“运行时库”是同一事物的两个不同名称。

答案 3 :(得分:47)

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

<强>示例:

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

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

答案 4 :(得分:28)

在我的理解中 runtime 正是它的意思 - 程序运行的时间。您可以说运行时 / 运行时或编译时发生的事情。

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

您的其他问题的答案: 我认为术语 runtime 可以扩展为在运行时包含环境和程序的上下文,所以:

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

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

答案 5 :(得分:26)

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

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

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

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

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

答案 6 :(得分:6)

准确地运行代码生成的时间,您可以看到代码所做的许多重要事情。

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

在您实际运行代码之前,您的代码将被称为“在理论中工作”。 和Runtime是一个帮助实现这一目标的朋友。

答案 7 :(得分:5)

我对这里的其他答案并不着迷;它们对我来说太模糊和抽象了。我想更多的故事。这是我对更好答案的尝试。

一个基本的例子

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

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

到目前为止,您的程序只是源代码。它没有运行,我们会说它不涉及“运行时”。

但现在我运行它:

] RUN

它实际上是如何运行的?它如何知道如何将字符串参数从 PRINT 发送到物理屏幕?我当然没有在我的代码中提供任何系统信息,而且 PRINT 本身对我的系统一无所知。

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

编译和运行时的类型

已编译的二进制语言

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

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

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

字节码语言

其他语言将您的代码编译成操作系统无法直接读取的语言,但特定的运行时程序可以读取您编译的代码。这种编译后的代码通常被称为“字节码”。

这个运行时程序越复杂,它在您的代码未包含的方面(甚至在您使用的库中)可以做的额外事情就越多——例如,Java 运行时环境(“JRE”)可以跟踪不再需要的内存分配,并告诉操作系统将该内存重用于其他用途是安全的,并且它可以捕获您的代码尝试向操作系统发送非法请求的情况,而不是退出可读错误。

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

脚本语言

还有其他语言根本不预编译您的代码;运行时执行逐行读取代码、解释和执行代码的所有工作。这使得它们比“字节码”语言更慢,但也更加灵活;在某些情况下,您甚至可以在源代码运行时摆弄它!尽管这也意味着您的代码中可以有一个完全非法的语句,并且它可以在您的生产代码中存在而不引起注意,直到有一天它运行并导致崩溃。

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

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

答案 8 :(得分:3)

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

在C程序的情况下,运行时是设置堆栈,堆等的代码,这是C环境所期望的要求。它本质上建立了语言所承诺的环境。 (它可以有一个运行时库组件,crt0.lib或类似的东西,如果是C)

答案 9 :(得分:3)

我发现following folder structure为理解runtime的内容提供了非常有见地的背景:

Runtimes of Mozilla XulRunner

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

runtimes' folder contents

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

所以,例如。 C运行时将是这样的文件 - C运行时库,.so-s或.dll -s - 您在运行时运行,由于它们(或其内容'或目的')包含在定义中而变得特殊。 C语言(在“纸上”),然后由您选择的C实现实现。然后,您将获得该实现的运行时,使用它并在其上构建。

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

答案 10 :(得分:2)

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

答案 11 :(得分:1)

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

答案 12 :(得分:-1)

MSDN文档的这些部分可以解决您的大部分问题: http://msdn.microsoft.com/en-us/library/8bs2ecf4(VS.71).aspx

我希望这会有所帮助。

谢谢, 达米安

答案 13 :(得分:-1)

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

答案 14 :(得分:-1)

运行时是您不知道对象在执行过程中创建的对象的实例,对象创建基于特定条件或某些计算工作。 相反,编译时是在执行之前由您定义所需对象的实例。

答案 15 :(得分:-4)

执行程序期间经过的时间。但这太笼统了。比如说,在程序编译之后的持续时间,当OS向程序员展示配方以进行交互或看到他开发的结果时,称为运行时。运行时不会出现语法错误等。即逻辑是正确的(技术上不是商业上的持久性)。所以在某种程度上,我们可以说compileTime是主要级别,而运行时是次级。