【问题标题】:What is "runtime"?什么是“运行时”?
【发布时间】:2011-04-23 11:13:28
【问题描述】:

我听说过诸如“C Runtime”、“Visual C++ 2008 Runtime”、“.NET Common Language Runtime”之类的东西。

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

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

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

添加 1

这些天来,我在想也许 Runtime 与所谓的 Virtual Machine 有一些共同点,例如 JVM。这是导致这种想法的引文:

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

添加 2

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

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

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

【问题讨论】:

  • 运行时包含runtime library 以及一些控制代码和一些状态(由操作系统提供)。
  • 很好的问题,一直质疑这个。
  • 我在姐妹网站上发现了另一个可能有用的帖子:programmers.stackexchange.com/questions/294346/…
  • 我总是把它当做一个沙箱到较低级别的基础设施。你有 Unix 工具包上的任务管理器/或进程,所有低级 GUI 库等。所有这些都是运行时的一部分。构建事物的基础。

标签: terminology


【解决方案1】:

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

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

运行时代码是库代码是正确的,但库代码是一个更笼统的术语,描述了由 any 库生成的代码。运行时代码具体是实现语言本身功能所需的代码。

【讨论】:

  • 我认为“尤其是那些你没有明确写的指令”不是一个有用的区别;无论是你自己写了一行代码,还是编译器从别人写的库中引入,都与编译时间和运行时间的区别无关。
【解决方案2】:

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

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

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

【讨论】:

  • C++标准库不仅仅包含函数,参照Matt Ball,C和C++的“runtime”是runtime library,.NET runtime是runtime library和runtime system。跨度>
  • 我的问题是静态库也是运行时的吗?我猜这个词主要用于共享对象,不是吗?考虑linux中的libc。那么平台和框架呢?它们也被分解成库?
  • 但我的代码如何才能真正任何“库、框架或平台”上运行?它应该在 CPU 或其他处理单元上运行。您能否提供更多详细信息以进行更多说明?
  • C 和 C++ 运行时是函数的集合。 -> 什么功能?
  • @KorayTugay:标准库中的函数,如coutprintf
【解决方案3】:

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

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


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


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

【讨论】:

  • 维基百科不是引用的好来源。这是开始寻找权威来源的好地方,但它本身不应该被认为是权威的,因此引用它是不可靠的。 (根据维基百科创建者威尔士先生的声明)。
  • 第一个引号中的“运行时期间”(据说是关于运行时库)指的是什么?一个简单的[错误]解释可能如下:“当程序执行时,编译器并行地使用一个库(为自己)来实现(即在运行时生成额外的代码)“承诺”(由语言规范) 程序的功能”。这可能是错误的和/或很容易被运行时系统的 def 扭曲。
  • 从 Loki 离开的地方继续,尤其是当这两篇文章都没有提供任何参考时(这不是引用,只是我认为我最好说的话)
  • @MartinYork,百科全书不仅不权威,它还专注于文档而不是解释。这些可能非常不同。
【解决方案4】:

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

示例:

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

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

【讨论】:

  • 谢谢,我认为这是本主题中最好的答案。
  • 我很欣赏命名“执行环境”,但我认为只使用“运行时”作为前者的别名是一个坏主意(根据我的观察,许多程序员都是这样做的),“运行时环境”是更准确的。我同意@MichałTrybus 的观点,“运行时”的意思是“程序运行的时间”。
【解决方案5】:

在我的理解中 runtime 正是它的意思——程序运行的时间。你可以说某些事情发生在runtime / run time 或编译时。

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

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

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

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

【讨论】:

    【解决方案6】:

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

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

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

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

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

    【讨论】:

    • 虚拟机实现硬件和程序可能需要执行的内容之间的“原始”接口。 -> 我不确定。
    【解决方案7】:

    我不喜欢这里的其他答案;它们对我来说太模糊和抽象了。我在故事中思考更多。这是我尝试更好的答案。

    一个 BASIC 示例

    假设现在是 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】:

    运行时正是您的代码开始运行的地方,您可以看到您的代码所做的许多重要事情。

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

    在您实际运行您的代码之前,您的代码将被称为“WORKING IN THEORY”。 Runtime 是帮助实现这一目标的朋友。

    【讨论】:

      【解决方案9】:

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

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

      【讨论】:

        【解决方案10】:

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

        【讨论】:

          【解决方案11】:

          我发现following folder structure 为理解​​runtime 是什么提供了一个非常有见地的上下文:

          你可以看到有'source',有'SDK'或'Software Development Kit',然后有Runtime,例如.运行的东西 - 在运行时。内容如下:

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

          例如。 C 运行时将是这样的文件——C 运行时库、.so-s 或 .dll -s——您在运行时运行,它们(或它们的内容'或目的')包含在C 语言(在“论文”上),然后由您选择的 C 实现来实现。然后你得到那个实现的运行时,使用它并在它的基础上构建。

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

          【讨论】:

          • 另一个上下文化运行时,是这篇无关的文章python myths的部分神话6,在那里你可以看到运行时编程语言之间的区别 i>,在神话 6 的第一段中。
          【解决方案12】:

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

          【讨论】:

            【解决方案13】:

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

            运行时实现与编程语言相关的功能,这些功能对于任何应用程序域都保持不变,包括数学运算、内存操作、消息传递、操作系统或数据库抽象服务等。

            运行时必须以某种方式与正在运行的应用程序连接起来才能发挥作用,例如作为共享动态库加载到应用程序内存空间、运行应用程序的虚拟机进程或与应用。

            【讨论】:

              【解决方案14】:

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

              我希望这会有所帮助。

              谢谢, 达米安

              【讨论】:

              • 其实不然;他不仅在询问 .Net。
              • @Matt:再次正确。然而,.Net 支持他 2/3 的运行时,他的标签中有 1/2 处理 .Net,我只是认为这些链接会很有用。
              • 我将其表述为“3/4 的语言支持 .NET”。 .NET 没有做很多支持,它旨在保持 unix 和 windows 之间在中间件级别的裂痕。
              • @MattJoiner -- 这在 2010 年可能是正确的,但今天对于 .NET Standard 和 .NET Core 等开源实现来说,这已经是非常不真实的了。
              【解决方案15】:

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

              【讨论】:

              • 这并不能回答问题,而且会使问题进一步复杂化。
              【解决方案16】:

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

              【讨论】:

                猜你喜欢
                • 2017-10-19
                • 2019-11-15
                • 1970-01-01
                • 1970-01-01
                • 2011-03-03
                • 2011-02-15
                • 2011-04-12
                • 2020-04-30
                • 2011-09-29
                相关资源
                最近更新 更多