我知道一些程序,如 Java 或 .NET 程序使用广泛的运行时系统来执行。但是我在一本关于操作系统的书中读到了一些东西(那里没有更详细地解释),听起来像是用户编写的任何程序都在运行时系统中运行,而不是直接在操作系统上运行。
给出的一个示例是,当您读取文件时,您不会为读取的每个位调用操作系统函数,而是将位或字节读取到运行时系统管理的缓冲区中,当该缓冲区为空时,您再次调用系统函数.
那么这是否意味着严格来说,任何程序都在某种运行时环境中运行(除了可能用汇编编写的程序......)?
我知道一些程序,如 Java 或 .NET 程序使用广泛的运行时系统来执行。但是我在一本关于操作系统的书中读到了一些东西(那里没有更详细地解释),听起来像是用户编写的任何程序都在运行时系统中运行,而不是直接在操作系统上运行。
给出的一个示例是,当您读取文件时,您不会为读取的每个位调用操作系统函数,而是将位或字节读取到运行时系统管理的缓冲区中,当该缓冲区为空时,您再次调用系统函数.
那么这是否意味着严格来说,任何程序都在某种运行时环境中运行(除了可能用汇编编写的程序......)?
一个正确的想法,操作系统下的一切都是在操作系统的运行时运行的。
音频文件,确保它需要操作系统运行时才能通过操作系统音频驱动程序并产生一些疯狂的噪音。
本地程序,肯定是在操作系统运行时之上运行的。
但是 DotNet 和 Java,它们有点特别,它们在 OS 运行时创建了一个抽象层,将其标准化为所需的形状和形式,统一运行时,然后针对它运行其字节码/程序集,来回转换必要的细节。
但可以肯定的是,大多数代码都是针对某种运行时环境运行的。您可以将此概念抽象为操作系统内核本身,它确实运行在某种 CPU 环境中,也许您可以将其称为本机运行时:)。
但即使这样也不完全正确。也许您知道,今天的 x86 处理器从外部看起来像 CISC 架构,但实际上,处理器实际上是将那些大而复杂的 CISC 指令分解为 RISC 指令序列,然后根据需要执行和重新排序。它也是某种运行时环境。
很奇怪,但是如果您查看处理器本身,那么物理定律可以被视为运行时的下一个抽象:)。
是不是很极端?真的吗?那么想想理论物理学/宇宙学的想法,我们实际上可以生活在一个全息宇宙中,一个模拟,并且不会注意到:)。
运行时的想法如何?:)。
根据定义,是的。
软件需要一些执行环境,否则它只是存储在某个存储设备上的一组位。运行时环境有几类,有时不同类型的环境之间的区别是模糊的。
一方面是硬件提供的环境,包括指令集架构、设备提供的服务、BIOS等。
然后是操作系统提供的环境。操作系统以各种复杂程度工作,但通常充当运行程序和主机硬件之间的中介。一些操作系统非常薄,从某种意义上说,程序能够在没有操作系统中介的情况下做事。其他人阻止软件直接与硬件通信,因此程序必须发出请求(例如通过操作系统设施或服务),然后操作系统直接与硬件交互。
另一个层次是与编程语言相关联的指定环境。许多编程语言的语义是根据在一些抽象机器上的执行来表示的。示例包括 C 和 C++,其中每个表达式、每个声明和每个语句在抽象机器上都有一组定义的效果。许多未定义行为的实例(如标准中规定的)相当于语言语句能够超出该抽象机器可接受范围的情况。
与以前的环境类型密切相关的是,有些语言与某种形式的库相关联。该标准库提供了使程序员的工作更轻松的设施。几乎所有中等高级语言都与库相关联 - C、C++、Java、Ada 等。其中许多功能可以在语言本身中实现,但其他功能需要主机系统的帮助(例如操作系统、硬件等),因此可以用另一种语言(例如汇编程序)实现。
下一级是运行时环境(例如 Java 虚拟机),程序(某种格式)在其中执行。这些程序(通常)只与那个运行时环境通信,而后者又从它所在的系统请求操作。有时程序可以直接与主机系统通信(通过称为 thunking、本机接口等的机制)。
然后是即时解释代码的程序(例如语言解释器),因此,实际上,源代码本身就是程序,解释器从它所在的环境请求服务。
即使是用汇编编写的程序也可以在某些环境中运行。汇编被翻译成特定于某些主机环境的机器特定指令(由硬件组成,可能是操作系统,可能是操作系统托管的其他程序)。
还有一些特殊类型的操作系统(例如管理程序)可以托管其他操作系统,并且通常允许多个操作系统在单个硬件平台上同时执行。当操作系统试图访问硬件时,调用会被管理程序拦截和调解,进而向主机硬件发出请求。
问题是,所有这些事情都涉及软件对其执行的环境做出一些假设。即使是用汇编程序编写的直接与硬件通信的软件也假设有一组硬件和一种与该硬件通信的方法。固件是一种假定它在某些设备(例如主板、内存控制器、硬盘驱动器控制器等)上运行的软件。