什么是"运行时"?

smw*_*dia 347 terminology

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

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

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

"运行时"和" 运行时库 "有两个不同的东西吗?

添加1

这些天,我想也许Runtime与所谓的虚拟机有一些共同点,比如JVM.这是导致这种想法的引文:

这个编译过程非常复杂,可以分解为几个抽象层,这些过程通常涉及三个转换器:编译器,虚拟机实现和汇编器.--- 计算系统的要素(介绍,道路到硬件土地)

添加2

该书C专家编程:深度C的秘密.第6章运行时数据结构是对此问题的有用参考.

e.J*_*mes 225

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

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

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

  • @BenWheeler 这个答案与“运行时”(与编译时相反)无关。请注意,在OP的问题和所有这些答案的上下文中,“运行时”和“运行时”是**不同的**,即使人们只是对这些不同的概念使用相同的术语“运行时”。事实上,用户(使用该语言的开发人员)并不编写运行时,它是语言实现的一部分。 (3认同)
  • 我认为“特别是那些你没有明确写出的指令”并不是一个有用的区别;无论您自己编写了一行代码,还是编译器从其他人编写的库中引入了它,都与编译时与运行时的区别无关。 (2认同)

SLa*_*aks 98

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

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

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

  • C++标准库不仅包含函数,并且引用Matt Ball,C和C++"运行时"是运行时库,.NET运行时是运行时库和运行时系统. (4认同)
  • 但是我的代码如何实际运行****"库,框架或平台*"?它应该在CPU或其他处理单元上运行.您是否可以提供更多详细信息以进行更多说明? (3认同)
  • @KorayTugay:标准库中的函数,如`cout`或`printf`. (3认同)

Mat*_*all 73

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

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


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


Re:你的编辑,"运行时"和"运行时库"是同一件事的两个不同的名字.

  • 维基百科不是报价的好来源.这是一个很好的位置,开始寻找权威来源,但本身不应被视为权威,因此引用它是不可靠的.(根据维基百科的创始人威尔士先生的陈述). (67认同)
  • 第一个引用中的"运行时"(假设是关于运行时库)是指什么?一个简单的[mis]解释可能如下:"在程序执行时,编译器并行使用库(自身)实现(即在运行时生成额外的代码)"承诺"(通过语言规范) )程序的功能".使用运行时系统的def可能是错误的和/或容易弯曲的. (5认同)
  • 从Loki离开的地方继续,_特别是当这两篇文章都没有提供任何参考时(这不是一个引用,它只是我认为我更好的说法) (2认同)

Chr*_*oph 52

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

例子:

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

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

  • 谢谢,我认为这是本主题的最佳答案。 (4认同)
  • 我很欣赏命名“执行环境”,但我认为只使用“运行时”作为前者的别名是一个坏主意(这是我对许多程序员所做的观察),“运行时环境”更准确。我同意@MichałTrybus 的观点,即“运行时”的意思是“程序运行的时间”。 (2认同)

Mic*_*bus 30

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

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

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

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

这个答案在某种程度上只是我的意见,而不是事实或定义.


ult*_*use 27

Matt Ball正确回答.我会举例说明.

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

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

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

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

  • 虚拟机实现了硬件与程序可能需要执行的内容之间的“原始”接口。-> 我对此不太确定。 (2认同)

Ben*_*ler 10

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

一个基本的例子

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

] 10 PRINT "HELLO WORLD!"
] 20 GOTO 10
Run Code Online (Sandbox Code Playgroud)

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

但现在我运行它:

] RUN
Run Code Online (Sandbox Code Playgroud)

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

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

编译和运行时的类型

编译的二进制语言

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

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

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

字节码语言

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

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

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

脚本语言

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

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

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

  • 好答案。只是一个澄清:Python 使用字节码 https://opensource.com/article/18/4/introduction-python-bytecode (5认同)
  • 感谢您提供不同类型语言的视角。这是非常有信息性和启发性的。 (2认同)

Tal*_*ner 7

运行时恰好代码生成的地方,您可以看到代码所做的许多重要事情.

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

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