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

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

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

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

加1

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

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

加上2

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

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

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


当前回答

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

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

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

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

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

其他回答

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

例子:

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

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

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

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

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

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

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

一个BASIC的例子

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

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

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

但现在我运行它:

] RUN

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

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

编译和运行时的类型

编译二进制语言

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

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

C is one such language; when you run a C program, it's totally able to send illegal requests to the operating system (like, "give me control of all of the memory on the computer, and erase it all"). If an illegal request is hit, usually the OS will just kill your program and not tell you why, and dump the contents of that program's memory at the time it was killed to a .dump file that's pretty hard to make sense of. But sometimes your code has a command that is a very bad idea, but the OS doesn't consider it illegal, like "erase a random bit of memory this program is using"; that can cause super weird problems that are hard to get to the bottom of.

字节码的语言

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

The more elaborate this runtime program is, the more extra stuff it can do on the side that your code did not include (even in the libraries you use) -- for instance, the Java runtime environment ("JRE") and Python runtime environment can keep track of memory assignments that are no longer needed, and tell the operating system it's safe to reuse that memory for something else, and it can catch situations where your code would try to send an illegal request to the operating system, and instead exit with a readable error.

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

脚本语言

Still other languages don't precompile your code at all; the runtime does all of the work of reading your code line by line, interpreting it and executing it. This makes them even slower than "bytecode" languages, but also even more flexible; in some cases, you can even fiddle with your source code as it runs! Though it also means that you can have a totally illegal statement in your code, and it could sit there in your production code without drawing attention, until one day it is run and causes a crash.

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

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

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

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

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

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

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

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