JavaScript runtime & engine 概念汇总

2023年 10月 15日 60.6k 0

Runtime

Introduction

What is Run-time:stackoverflow.com/questions/3…

Runtime vs Compile Time:www.baeldung.com/cs/runtime-…

image.png

Runtime

"运行时"(Runtime)是指计算机程序在执行过程中的时间段,也可以表示程序执行时所处的环境。

在软件开发中,程序的运行时是指程序从开始执行到结束的整个过程。这包括加载程序、分配内存、执行代码和处理输入输出等操作。运行时涉及到程序的执行状态、资源管理、异常处理、并发控制和动态调度等方面。

绝大多数主流编程语言都提供了各自的运行时环境,使得程序能够正确地执行,并与操作系统和硬件进行交互。运行时环境提供了必要的支持和基础设施,包括底层的执行引擎、内存管理、I/O 操作、并发机制等。它为程序的执行提供了一个稳定的平台,并提供了一些公共的函数和服务,以简化开发过程。

总之,"运行时"(Runtime)可以指程序执行的时间段,也可以指程序运行时所依赖的环境和支持。它是程序在实际运行过程中的关键概念,涉及到各种底层操作和资源管理。

Runtime library

在编程语言中,通常也会提到 "运行时"(Runtime)指的是一个具体的库或组件,即运行时库(Runtime library)。

运行时库是一组函数、数据结构和工具类,提供了运行时支持所需的功能。这些功能可能包括动态链接、内存管理、异常处理、并发控制等任务。运行时库为开发者提供了一些常用的函数和服务,以简化编程过程,并提供对底层系统的访问。开发者可以使用这些库来执行特定的操作,如文件输入输出、网络通信、数据序列化等。运行时库通常由编程语言提供者或第三方开发者创建和维护,并在程序中进行引用和调用。

总之,运行时库是编程语言中的一个重要概念,它提供了一组函数和工具类,用于支持程序的运行时环境。这些库可用于处理常见任务,简化开发过程,并与底层系统进行交互。

Example

例如在 Goruntime 包中,我们可以通过 runtime.Caller(0) 函数来获取当前运行的路径,它会返回当前运行的函数调用信息。然后使用 filepath.Dir() 函数获取该路径的目录路径。与 os.Executable() 不同,runtime.Caller(0) 可以在 go rungo build 命令下都能够正确地获取可执行文件的路径。

package main

import (
    "fmt"
    "path/filepath"
    "runtime"
)

func main() {
    // 获取当前运行的文件路径
    _, filename, _, _ := runtime.Caller(0)
    dir := filepath.Dir(filename)
    fmt.Println("Executable path:", dir)
}

Runtime environment

运行时环境(RTE)指的是一种软件平台或系统,用于解释、编译和执行特定编程语言的代码。它提供了一个运行程序所需的基础设施和资源,以便程序能够在该环境中正确地运行。

techterms.com/definition/…

Functions and components

运行时环境包括各种组件和功能,例如:

  • 解释器/编译器:负责将源代码转换为可执行的机器码或中间代码。这些代码可以直接在特定的运行时环境中执行。
  • 标准库:提供了一系列内置函数、数据结构和工具类,用于简化开发者编写常见任务的操作。
  • 资源管理器:负责分配和管理程序所需的内存、处理输入输出等底层资源。
  • 运行时支持:包括异常处理、并发控制、垃圾回收等功能,用于确保程序的安全性、稳定性和性能。
  • Multiple runtime environments

    不同的编程语言可能拥有多种不同的运行时环境,例如:

    • Java:Java 运行时环境(Java Runtime Environment, JRE
    • C# :.NET 运行时环境
    • JavaScript:浏览器端运行时环境和服务器后端 Node.js 运行时环境等
    • Python:常见的 InterpreterCPythonJPythonIronPythonPypyAnaconda

    总之,运行时环境为开发者提供了一个统一的平台,使得他们可以专注于编写代码而无需关注底层的细节。它确保了程序在特定环境中正确运行,并提供必要的工具和功能来支持程序的执行。

    JavaScript runtime

    JavaScript 运行时环境指的是能够解析和执行 JavaScript 代码的环境。它提供了一个执行 JavaScript 代码的平台,使得开发者可以在该环境中运行和测试 JavaScript 程序。

    这个运行时环境可以是浏览器、服务器端环境(如 Node.js)或其他支持 JavaScript 解释和执行的平台。不同的运行时环境可能会提供不同的功能和 API,以适应特定的应用场景。

    image.png

    Core components

    JavaScript 运行时环境通常包含以下主要组件:

  • JavaScript 引擎:负责解析和执行 JavaScript 代码的核心组件。不同的运行时环境使用不同的 JavaScript 引擎,例如 V8 引擎(ChromeNode.js)、SpiderMonkey 引擎(Firefox)等。
  • 标准库:提供了一系列内置函数和对象,以便开发者可以直接使用它们来完成常见的任务,如字符串处理、数组操作、日期处理等。
  • 宿主环境 API:针对特定的运行时环境,提供了与环境相关的扩展功能和服务的接口。例如,在浏览器环境中,提供了 DOM 操作、网络请求、事件处理等 API;而在服务器端环境中,提供了文件系统访问、网络通信等 API
  • JavaScript 运行时环境允许开发者编写和运行 JavaScript 代码,并与环境进行交互。它为开发者提供了一种统一的平台,无论是在浏览器中构建 Web 应用,还是在服务器端编写后端逻辑,都可以使用相同的语言和工具来实现。

    Browser

    一个典型的浏览器运行时环境包含以下主要组件:

  • Rendering 渲染引擎:负责解析 HTMLCSS 和其他网页资源,并将它们渲染成用户可以看到的页面。
  • JavaScript 执行引擎:解析和执行 JavaScript 代码,使得网页能够具备交互性和动态功能。
  • 文档对象模型(DOM):表示网页中的结构化内容,允许通过 JavaScript 访问和操作网页元素。
  • 浏览器 API:提供访问浏览器功能和服务的接口,例如访问网络资源、处理用户输入、操作浏览历史等。
  • 浏览器作为一个运行时环境,提供了一个完整的运行环境来展示和操作网页。它不仅仅用于呈现静态的 HTML 内容,还可以动态地执行 JavaScript 代码,并与用户进行交互。通过浏览器提供的 APIDOM,开发者可以创建交互式的 Web 应用程序,并访问各种浏览器功能。

    image.png

    Nodejs

    Node.js 运行时环境是一个基于 V8 引擎的 JavaScript 运行时平台,它提供了以下核心组件和功能:

  • V8 JavaScript 引擎:Node.js 使用 V8 引擎作为默认的 JavaScript 引擎。V8 引擎负责解析和执行 JavaScript 代码,并提供高性能和优化的能力。
  • 事件驱动和非阻塞 I/O 模型:Node.js 使用事件驱动和非阻塞的 I/O 模型,允许在处理并发请求时保持高效。这意味着可以同时处理多个请求而无需等待每个请求完成。
  • 标准库和模块:Node.js 提供了一系列内置的模块,可以进行文件系统操作、网络通信、加密、流处理等常见任务。同时,Node.js 还支持模块化编程,使开发者可以轻松引入和使用第三方模块。
  • 服务器端 API:Node.js 提供了一些服务器端 API,例如 HTTPHTTPSTCPUDP 等。这些 API 允许开发者构建服务器端应用程序,并处理网络请求、建立连接等。
  • 包管理器(npm 或 yarn):Node.js 生态系统中的主要包管理器是 npmNode Package Manager),使开发者能够方便地安装、管理和分享 JavaScript 库和工具。
  • 跨平台支持:Node.js 可以运行在多个操作系统上,如 WindowsMacOSLinux 等。这使得开发者可以在不同平台上使用相同的代码来构建应用程序。
  • 总之,Node.js 运行时环境基于 V8 引擎,并提供了事件驱动、非阻塞 I/O、标准库和模块、服务器端 API、包管理器和跨平台支持等功能,以支持开发者构建高性能、可扩展的服务器端应用程序。

    image.png

    Deno

    • Next-generation JavaScript Runtime(A secure TypeScript runtime on V8)

      • Secure by default
      • Native support for TypeScript and JSX
      • Testing, linting, formatting, and more out of the box
      • High performance async I/O with Rust and Tokio
      • Backwards compatible with Node.js and npm
    • Deno 是 Ryan Dahl(Node.js 作者)新开的一个坑,底层基于 Rust 实现的 JavaScript runtime

    • 相关文章与视频:

      • Node.js 十大设计缺陷 - Ryan Dahl
      • Deno 1.0: What you need to know

    image.png

    Bun

    • Bun is a fast JavaScript all-in-one toolkit

      • Bun is a fast JavaScript runtime
      • Bun is a fast JavaScript package manager
      • Bun is a fast JavaScript bundler
      • Bun is a fast JavaScript test runner
    • Bun 是一个采用 Zig 语言编写的高性能的 JavaScript 运行时工具。它被设计成一个"全家桶",内置了打包器和转译器等功能。同时,Bun 还可以兼容使用 npmJavaScript 包,并且支持直接运行 TypeScript 文件。与 Node.jsDeno 等其他类似工具不同的是,Bun.js 并没有基于 V8 引擎,而是使用了 JavaScriptCore 引擎。这个引擎提供了更快的执行速度,相比传统的 V8 引擎有着更好的性能表现。然而,由于使用了不同的引擎,也可能存在一些兼容性问题需要注意。

    image.png

    ECMAScript

    ECMAScript(简称 ES)是 JavaScript 的标准化规范。它定义了 JavaScript 这门编程语言的基本特性、语法、API 等方面,旨在统一不同浏览器和环境中对 JavaScript 的实现。 ECMAScriptEcma 国际组织制定和维护,该组织的全名是 European Computer Manufacturers Association(欧洲计算机制造商协会)。ECMAScript 标准当前的最新版本是 ECMAScript 2023,并且每年都有新的版本发布(ESNext)。通过 ECMAScript 规范,开发者可以了解 JavaScript 的语法、数据类型、函数、对象、数组等核心概念,并使用提供的内置函数和方法来进行编程。

    ECMAScript 定义了 JavaScript 的核心功能,使得 JavaScript 在不同平台和环境下具备一致的行为和特性。JavaScript 引擎如 V8JavaScriptCoreSpiderMonkey 等,根据 ECMAScript 规范来实现 JavaScript 的解析和执行过程。这些引擎将 ECMAScript 规范翻译成可执行的指令,以便在浏览器、服务器、移动设备等各种环境中运行 JavaScript 代码。

    总结来说,ECMAScriptJavaScript 的标准化规范,它定义了 JavaScript 的基本特性和语法,并为 JavaScript 引擎提供了一致的行为标准。通过遵循 ECMAScript 规范,开发者可以编写可移植、兼容性良好的 JavaScript 代码。

    Draft ECMA-262 (ECMAScript® 2024 Language Specification):tc39.es/ecma262/

    image.png

    JavaScript engine

    JavaScript 引擎是用于解析和执行 JavaScript 代码的软件组件。它负责将 JavaScript 代码转化为可执行的指令,并提供对 JavaScript 代码的运行环境。

    JavaScript 引擎实现了 ECMAScript 规范中定义的语法和语义,以确保对 JavaScript 代码的正确解析和执行。它可以被嵌入到不同的应用程序或系统中,如浏览器、服务器、移动设备等,以提供对 JavaScript 的支持。

    Core components

    JavaScript 引擎通常包含以下主要组件:

  • 解析器 ( Parser ) :解析器将 JavaScript 代码的源代码解析为抽象语法树(AST),以便引擎能够理解和处理代码的结构。
  • 编译器(Compiler) :编译器将抽象语法树(AST)转换为可执行的中间表示(字节码、IR 等)。这个过程可能会进行优化,例如变量提升、内联函数等。
  • 执行引擎(Execution Engine) :执行引擎负责将中间表示(字节码、IR 等)转换为机器码,并执行这些机器码。引擎可以根据代码的上下文和执行情况进行动态优化,以提高执行效率。
  • Common engines

    常见的 JavaScript 引擎包括:

  • V8:由 Google 开发的高性能 JavaScript 引擎,用于 Chrome 浏览器和 Node.js 环境。V8 是基于即时编译(JIT: Just-In-Time Compilation)技术,通过将 JavaScript 代码直接编译成本地机器代码来提高执行速度。
    image.png

  • JavaScriptCore:苹果公司开发的 JavaScript 引擎,用于 Safari 浏览器和 IOS 系统。JavaScriptCore 主要采用解释执行和即时编译相结合的方式。
    image.png

  • SpiderMonkey:Mozilla 基金会开发的 JavaScript 引擎,用于 Mozilla Firefox 浏览器。它是最早的 JavaScript 引擎之一,也是首个实现 ECMAScript 规范的引擎。
    image.png

  • 除了这些主流的 JavaScript 引擎,还有许多其他引擎,如 Trident(用于 Internet Explorer 浏览器,已被历史所淘汰)、Chakra(用于 Microsoft Edge 浏览器)、JerryScript(用于嵌入式设备)等。

    尽管每个引擎都有不同的性能特点、优化策略和兼容性,以适应各种使用场景,但它们都遵循 ECMAScript 标准并提供 JavaScript 的执行功能。

    Browser engine (Rendering engine)

    浏览器内核或渲染引擎是浏览器的核心组件,负责解析和渲染网页内容,以实现对 HTMLJavaScript 等语言的正确解释和显示。它是浏览器能够呈现网页并提供丰富用户体验的重要部分。

    常见的 Browser 引擎包括:

  • Webkit:Webkit 是一个开源的浏览器引擎,最初由苹果公司开发。它提供了渲染网页和执行 JavaScript 代码的功能,并包括渲染引擎(用于解析 HTMLCSS)、JavaScript 引擎等。
  • Blink:Blink 是基于 Webkit 的另一个开源浏览器引擎,由谷歌开发并在 Chromium 项目中使用。Blink 最初是作为 Webkit 的分支而创建的,后来演变成独立的引擎。Blink 继承了 Webkit 的渲染引擎部分,并通过集成 V8 引擎实现对 JavaScript 代码的解析和执行。
  • image.png

    相关文章

    服务器端口转发,带你了解服务器端口转发
    服务器开放端口,服务器开放端口的步骤
    产品推荐:7月受欢迎AI容器镜像来了,有Qwen系列大模型镜像
    如何使用 WinGet 下载 Microsoft Store 应用
    百度搜索:蓝易云 – 熟悉ubuntu apt-get命令详解
    百度搜索:蓝易云 – 域名解析成功但ping不通解决方案

    发布评论