深入理解 V8 引擎:C++ 与 JavaScript 的跨界传送门

C++应用嵌入V8引擎:实现JavaScript脚本扩展与双向通信 在现代软件开发中,脚本引擎嵌入技术为原生应用提供了强大的扩展能力。其核心原理在于将成熟的虚拟机(如V8)集成到宿主进程中,通过API桥接实现跨语言调用。这项技术的核心价值在于,它允许开发者在不重新编译主程序的情况下,动态加载和执行用户脚本,极大地提升了软件的灵活性和可定制性。典型的应用场景包括桌面软件的插件系统、游戏引擎的逻辑脚本、以及需要用户自定义规则的业务平台。本文聚焦于V8引擎,这是驱动Chrome和Node.js的高性能JavaScript虚拟机。我们将详细拆解如何在C++应用中初始化V8、执行Ja 阅读详情

在进行 Chromium 浏览器内核开发的日常中,我们经常需要追踪一段 JavaScript 代码是如何被浏览器执行的,或者一个扩展 API(如 chrome.tabs.query 或 chrome.account.login)是如何从 JS 穿透到 C++ 底层的。

当我们顺着 Blink 的 HTML 解析器、ScriptRunner 一路向下,扒开 V8 的源码时,最终都会与一个名为 Execution::Invoke() 的函数不期而遇。

这个函数,就是 V8 引擎中 C++ 跨界进入 JavaScript 世界的终极关卡。

为什么需要一个“传送门”?

在探讨源码之前,我们必须先理解一个核心问题:为什么 C++ 不能直接调用 JS 函数?

因为 C++ 和 JavaScript 是两个完全不同的世界,它们在底层机制上有着天壤之别:

特性C++ 世界JavaScript 世界
栈管理依赖操作系统的系统栈依赖 V8 虚拟机的堆栈
内存管理手动管理 / RAII垃圾回收(GC)自动管理
异常处理try/catch 机制V8 堆上的 JS 异常对象
对象表示内存中的 C++ 对象实例V8 堆上的 Tagged 指针
调用约定标准的 C/C++ ABI (如 x64 calling convention)V8 自定义的寄存器与压栈约定

如果直接用 C++ 的函数指针去调用 JS 代码,会导致调用栈错乱、GC 无法追踪对象、异常跨语言传播导致未定义行为,甚至直接引发浏览器崩溃。

因此,V8 必须在两个世界之间建立一个安全、可控、高性能的桥梁。

剖析 Invoke():C++ 到 JS 的六步跨越

Execution::Invoke() 的核心职责是:搭建 C++ 到 JS 的执行环境(栈帧、上下文、异常处理),然后通过汇编跳板(JSEntry)一跃进入 JS 机器码/字节码。

让我们逐段拆解这个神奇的函数:

1. 栈溢出保护 (Stack Overflow Check)

#ifdef USE_SIMULATOR
  StackLimitCheck check(isolate);
  if (check.HasOverflowed()) { /* 抛出异常并中止 */ }
#endif

在进入 JS 之前,V8 会先检查 C++ 栈是否已经溢出。因为 JS 执行过程中可能会回调 C++,C++ 又调 JS,导致栈深度暴增。如果溢出,必须立即拦截,防止恶意脚本通过无限递归打穿浏览器。

2. API 函数的快路径 (Fast Path)

if (IsJSFunction(*params.target) && function->shared()->IsApiFunction()) {
    return Builtins::InvokeApiFunction(...);
}

如果目标函数是一个 API 函数(即 C++ 注入到 JS 的函数,比如 console.log),V8 会走一条“快路径”。它不需要真正进入 JS 虚拟机,而是直接调用底层的 C++ 回调。这极大地提升了 JS 调 C++ 的性能。

3. 脚本上下文初始化 (Script Context Setup)

if (function->shared()->needs_script_context()) {
  // 分配并设置 ScriptContext
  function->set_context(*context);
}

如果是顶层脚本(Script),且包含 let/const 声明的全局变量,V8 会为其分配专属的 ScriptContext。这是 ES6 的机制,确保这些变量不会污染全局的 window 对象。

4. 拦截器与安全检查 (Execution Interceptors)

VMState<JS> state(isolate);
if (!AllowJavascriptExecution::IsAllowed(isolate)) { ... }
  • VMState<JS>:通知 V8 的 Profiler,当前线程状态已切换到 JS。
  • AllowJavascriptExecution:检查当前是否允许执行 JS。Blink 在某些关键阶段(如 GC 期间或 DOM 销毁时)会禁止 JS 执行,防止重入导致 UAF (Use-After-Free) 漏洞。

5. 准备汇编跳板 (JSEntry Stub)

DirectHandle<Code> code = JSEntry(isolate, params.execution_target, params.is_construct);

这是最关键的一步。因为 C++ 和 JS 的调用约定不同,V8 预先生成了一段汇编代码(JSEntry)。它的作用类似于“海关”:

  1. 保存 C++ 的寄存器状态。
  2. 按照 JS 的调用约定,把参数放到正确的寄存器/栈位置。
  3. 构建一个特殊的栈帧(Entry Frame),用于异常回溯。

6. 纵身一跃与异常接盘 (The Jump & Exception Handling)

SaveContext save(isolate);      // 保存当前 C++ 上下文
SealHandleScope shs(isolate);   // 封印句柄,防止内存泄漏

// 1. 跳入汇编代码,执行 JS
value = stub_entry.Call(...);

// 2. JS 执行完毕,回到 C++,检查异常
bool has_exception = IsException(value, isolate);
if (has_exception) {
  isolate->ReportPendingMessages(...);
  return MaybeHandle<Object>(); // 返回空句柄,告诉 C++ 调用方出错了
}
return Handle<Object>(value, isolate);

stub_entry.Call(...) 执行的瞬间,CPU 的指令指针跳入了 V8 生成的机器码。C++ 线程在此“挂起”,直到 JS 代码执行完毕或抛出异常。 返回后,V8 会将 JS 的异常转换为 C++ 可处理的格式(空句柄),确保浏览器不会因为网页里的一个 throw new Error() 而崩溃。

完整的双向桥梁:以扩展 API 为例

理解了 Invoke(),我们就拼齐了 V8 跨界调用的全貌。V8 实际上有两个方向的传送门:

  1. C++ → JS:Invoke()(必须经过 JSEntry 汇编跳板切换栈)。
  2. JS → C++:InvokeApiFunction()(快速路径,直接在当前栈执行 C++ 代码)。

以我们在浏览器中调用的扩展 API 为例:

// 扩展背景页 JS 代码
chrome.account.login({username: "test"}, (result) => {
    console.log("登录成功", result);
});

它的底层执行流转如下:

  1. [C++ → JS] 浏览器启动扩展,通过 Invoke() 进入 JS 世界,执行上述脚本。
  2. [JS 执行] V8 解析到 chrome.account.login。
  3. [JS → C++] 触发绑定的 C++ 函数,走 InvokeApiFunction() 快速路径,直接调用浏览器的 C++ 业务逻辑。
  4. [C++ 执行] C++ 完成登录逻辑,准备调用 JS 传入的回调函数 (result) => {...}。
  5. [C++ → JS] C++ 再次通过 Invoke() 跨界,将 result 传给 JS 回调函数。
  6. [JS 执行] 执行 console.log。
  7. [JS → C++] 再次通过 InvokeApiFunction() 调用 console.log 的 C++ 底层实现。

结语

Invoke() 这个“传送门”的本质,是在两种完全不同的执行环境之间,建立一个安全、可控、高性能的桥梁。它让 JavaScript 代码能够被 C++ 宿主安全地调用,同时保护宿主不受 JS 错误的影响。

没有它,V8 就无法被嵌入到 Chrome、Node.js 或任何 C++ 项目中。它是 V8 作为嵌入式虚拟机的核心基础设施,也是我们深入理解浏览器内核架构的必经之路。


希望这篇总结能帮助你更好地沉淀这段时间的内核调试经验!

Cocos Creator 3.8安卓启动流程深度解析:从Activity到V8引擎的完整链路 在移动游戏开发中,理解应用启动流程是性能优化和问题排查的基础。Android应用启动始于Activity的生命周期管理,通过JNI桥接技术实现Java层与C++原生层的通信。这一机制使得游戏引擎能够高效调用系统底层能力,尤其在处理图形渲染和复杂逻辑时至关重要。对于使用JavaScript/TypeScript的跨平台引擎,V8引擎的初始化与脚本加载成为关键环节,它负责将高级语言逻辑转换为可执行指令。在Cocos Creator这样的游戏开发框架中,完整的启动链路涉及Java层、C++引擎层和脚本层的协同工作 阅读详情

相关推荐

Nidium架构解析:高性能JavaScript原生渲染引擎的设计与实现

在跨平台应用开发领域,JavaScript运行时与原生渲染能力的结合是提升性能体验的关键路径。其核心原理在于通过高效的绑定机制,让JavaScript代码能够直接调用底层图形API,从而避免传统桥接模型中的序列化开销与通信延迟。这种技术方案的核心价值在于实现了接近原生应用的渲染性能与响应速度,尤其适用于对图形性能要求极高的动画、游戏及复杂交互界面等应用场景。Nidium引擎正是这一理念的杰出实践,它通过深度集成V8引擎与原生渲染管线,构建了一套从JavaScript直接操作C++渲染对象的融合架构,并运用脏

daxi1047的博客 335

浏览器 V8 引擎

V8 引擎是 Google 开发的高性能 JavaScript 和 WebAssembly 引擎,最初是为了提升 Google Chrome 浏览器的性能而设计的。自 2008 年首次发布以来,V8 引擎不仅仅被用在 Chrome 浏览器中,还被广泛应用于其他 JavaScript 环境中,比如 Node.js,这使得 V8 成为了推动现代 JavaScript 性能提升的重要力量。

m0_52796585的博客 1191

V8 JavaScript引擎0.1.5版本源码解析

V8是一个开源的JavaScript引擎,由Google开发,用于其Chrome浏览器和Node.js环境。V8采用即时编译(JIT)技术,能够将JavaScript代码编译成本地机器代码执行,从而提供优秀的执行性能。它支持ECMAScript和JavaScript语言规范,被广泛应用于桌面、移动、服务器端和物联网设备上。V8的源码是一个非常庞大的工程,它的源代码主要分布在不同的文件夹中,每个文件夹都有其特定的功能和定位。以下是一些主要的文件夹及其作用的简要介绍:src/

weixin_29940495的博客 1084

【Node.js】深入理解 V8 JavaScript 引擎

V8 是由 Google 开发的开源 JavaScript 引擎,用 C++ 编写,最初用于 Chrome 浏览器,现在广泛用于其他项目,包括 Node.js 和 Deno。核心特点高性能:通过即时编译 (JIT) 和优化技术提升 JavaScript 执行效率。跨平台支持:运行在 Linux、Windows 和 macOS 等多个平台。多语言支持:支持 JavaScript 和 WebAssembly。

佚名程序员 2805

使用Python2.6配合编译V8引擎的深入探索

V8是一个由Google开发的开源高性能JavaScript和WebAssembly引擎,用C++编写,主要用于Google Chrome浏览器以及Node.js运行环境。V8将JavaScript代码转换为高效的机器码,而不是通过解释或即时编译(JIT)的方式执行,这使得V8在执行速度上具有明显的优势。优化编译是将程序的中间表示(Intermediate Representation, IR)转换为更高效的机器码的过程。它依赖于编译器对程序行为的分析,以找到可能的性能瓶颈并对其进行优化。

weixin_42168902的博客 780

SC-FDMA

<br />SC-FDMA(Single-carrier Frequency-Division Multiple Access,單載波分頻多工),是LTE的上行鏈路的主流多址。<br />SC-FDMA是單波載(Single-carrier),與OFDMA相比之下具有的較低的PAPR(峰值/平均功率比,peak-to-average power ratio),比多載波的PAPR低1-3dB左右(PAPR是由于多載波在频域叠加引起)。更低的PAPR可以使行動終端(mobile terminal)在發送功效方面

jod的专栏 3299

V8 嵌入指南:用 C++ 在应用中集成 V8 JavaScript 引擎

V8 是 Google 开源的 C++ 高性能 JavaScript 与 WebAssembly 引擎,既可作为独立虚拟机运行,也可作为普通 C++ 库嵌入到任意宿主应用中。本指南以 V8 官方文档 [docs/embed.md](https://link.gitcode.com/i/a247acb20c8bd38a82ee27906d276a89) 为主体,结合本仓库提供的 [samples/h

gitblog_00698的博客 674

SQL Server 内存占用高分析及解决办法(超详细)

如果想让 Sql Server 主动释放 占用并空闲的内存空间,可以设置Sql Server占用内存的上限,就会让Sql server在。如执行存储过程,自定函数时,SQL Server 需要先二进制编译再运行,编译后的结果也会缓存起来,再次调用时就无需再次编译。才会释放一点占用的内存,所以很多时候,我们会发现运行SQL Server的系统内存往往居高不下这些内存一般都。缓存,以便于再次请求此页的数据的时候,直接从内存返回,就无需读取磁盘了,大大提高了速度。最后文章有啥不对,欢迎大佬在评论区指点!

2301_79080944的博客 3951

详解 Chrome 「V8 」引擎,让你更懂JavaScript !

今天来聊聊 V8,它的主要职责是用来执行 JavaScript 代码的。在正式全面了解 V8 之前,先来了解下「JavaScript 的基本特性和设计思想」。1、JavaScript 的基...

React_Community的博客 2360

我想自己组装一台服务器,微调大模型通义千问2.5 Omni 72B,但是我是个人购买,资金非常有限,最省的方案

阶段动作✅ 推理用 GGUF + llama.cpp + 4090 加载 14B INT4✅ 微调训练 Qwen2.5-7B-Chat,使用 LoRA / QLoRA❌ 放弃Qwen2.5-Omni-72B 全量微调(显存需求 >160G,不现实)

AngelCryToo的专栏 2821

物理学建模及仿真平台Chrono安装

Chrono是一个基于物理学的建模和仿真基础设施,它是在C++中实现的独立于平台的开源设计。一个projectchrono库可以嵌入到一个软件项目中,例如在可变形地形上运行的轮式和履带式车辆、机器人、机械电子系统、顺应性机构和流体固体相互作用现象。系统可以由刚性和柔性/顺应性部件组成,并带有约束、电机和接触;部件可以具有三维形状,以便进行碰撞检测。然而安装还是出现了一些问题,所以在此总结。已经装好visual studio。

Already8888的博客 6500

V8引擎完全指南:从JavaScript执行到源码探索的终极教程

想要真正理解现代JavaScript运行时的核心秘密吗?V8引擎作为驱动Chrome浏览器和Node.js的高性能JavaScript引擎,其源码结构和执行机制值得每一位开发者深入探索。本文将为你揭开V8的神秘面纱,提供从基础概念到源码探索的完整指南!🚀 ## 🌟 V8引擎概述:为什么它如此重要? V8是Google开发的开源高性能JavaScript和WebAssembly引擎,采用C+

gitblog_00472的博客 378

【具身算法】VLA算法-Diffusion Policy

《扩散策略:多模态机器人控制的新方法》摘要 本文提出了一种基于扩散模型的机器人控制策略(DiffusionPolicy),用于解决视觉运动控制中的多模态行为、高维动作空间和训练稳定性问题。该方法利用去噪扩散概率模型(DDPM)生成动作序列,通过迭代优化处理复杂动作分布,显著提升了性能。实验表明,在15项机器人操作任务中,扩散策略平均性能提升46.9%,有效解决了传统显式/隐式策略的局限性。其核心优势在于:1)优雅建模多模态动作分布;2)适应高维动作空间;3)训练过程稳定。未来工作将探索与强化学习的结合及计算

puzhinan7781的博客 1389

Edge.js 核心架构揭秘:深入理解 CLR 与 V8 引擎的互操作原理

Edge.js 是一个强大的开源项目,它实现了 .NET 和 Node.js 代码在 Windows、MacOS 和 Linux 系统上的进程内运行。该项目的核心价值在于解决了 CLR(公共语言运行时)与 V8 引擎之间的互操作难题,让开发者能够无缝地在两种环境间传递数据和调用函数。 ## 架构概览:跨越两个世界的桥梁 Edge.js 的核心架构围绕着 CLR 与 V8 引擎的互操作构建,主要

gitblog_01140的博客 303

PCL点云DBSCAN聚类算法:基于密度的点云聚类

核心点是在给定半径内拥有足够多邻居点的点,边界点是在给定半径内没有足够多邻居点但是位于核心点的邻域内的点,噪声点是既不是核心点也不是边界点的点。本文将介绍PCL中的DBSCAN(基于密度的空间聚类应用噪声)算法,用于点云数据的聚类。上述示例代码首先从PCD文件中读取点云数据,并设置了DBSCAN聚类的参数,包括邻域搜索半径(epsilon)和邻域内最小点数(min_points)。需要注意的是,示例代码中的点云数据格式为pcl::PointXYZ,如果使用其他类型的点云数据,需要相应地修改代码。

LpmShell的博客 1237

知识图谱构建中的数据清洗:AI原生应用高质量图谱的前提

数据清洗是知识图谱构建的核心前置环节,直接决定AI原生应用(如智能问答、个性化推荐、决策支持系统)的图谱质量与应用效能。本文以第一性原理为起点,系统解析数据清洗的理论框架、技术架构与工程实践,覆盖从多源异构数据的噪声检测到高质量知识三元组(实体-关系-实体)生成的全流程。通过层次化概念映射(专家→中级→入门)、数学形式化建模及工业级案例分析,揭示数据清洗在解决实体歧义、关系冲突、结构不一致等关键问题中的技术逻辑,并展望基于大模型的智能清洗范式演化。Completeness(完整性)

移动开发前沿的博客 403

从一行 var a = 1 开始,深入理解 V8 引擎的心脏

本文深入探讨了V8引擎如何解析、优化和执行JavaScript代码,揭示了编程中的性能陷阱与优化策略。文章从变量声明的作用域差异(var与let/const)切入,解析了V8的工作流程(词法分析→字节码→优化编译),并重点介绍了其核心优化技术:隐藏类(加速对象访问)、内联缓存(属性访问优化)和数组元素类型优化。此外,还详细讲解了V8的垃圾回收机制(分代式GC),包括新生代的Scavenge算法和老生代的标记清除/整理策略,以及增量GC等降低停顿的技术。最后提供了实战建议:优先使用const、保持对象结构稳定

Jerry_zpon的博客 1003

【RT-DETR涨点改进】小目标检测、特征融合改进篇 | TGRS 2024 | RT-DETR引入CSFM上下文选择融合模块,适合多模态检测、红外小目标检测、小目标检测、遥感目标检测等任务有效涨点

本文提出了一种改进RT-DETR目标检测模型的方法,通过引入上下文选择融合模块(CSFM)显著提升复杂背景下小目标和低对比度目标的检测精度。CSFM模块采用多尺度特征融合和动态特征选择机制,有效增强模型的全局上下文感知能力,同时保留细节特征。该模块通过通道减少机制和空间信息调节,实现从粗到细的特征聚合,减少误报并提高轮廓检测精度。实验表明,改进后的RT-DETR模型在多个基准测试中表现优异,计算效率与检测精度均优于现有方法。文章还详细介绍了模块配置和yaml文件修改方法,为模型部署提供指导。

Ai缝合怪、助力小伙伴高效发论文 1723

V8引擎架构详解:v8-internals项目核心组件解析

v8-internals项目是面向编译器开发人员的V8内部实现文档,旨在帮助开发者深入理解V8引擎的架构与工作原理。V8作为Google Chrome和微软Edge浏览器的JavaScript执行引擎,其高效的性能和复杂的内部机制一直是开发者关注的焦点。本文将通过v8-internals项目提供的资源,详细解析V8引擎的核心组件和工作流程。 ## V8引擎整体架构概览 V8引擎采用了现代化的分

gitblog_00159的博客 1065

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

V8引擎终极指南:从原理到实战的深度解析

V8引擎是由Google开发的高性能JavaScript引擎,广泛应用于Chrome浏览器和Node.js等众多平台。本指南将带您全面了解V8引擎的核心原理、架构组成以及实际应用技巧,帮助您快速掌握这一强大工具的使用方法。 ## 一、V8引擎核心功能解析 V8引擎作为JavaScript执行的核心,具备多项关键能力: - **即时编译(JIT)**:将JavaScript代码直接编译为机器码

gitblog_00836的博客 1038

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

V8引擎深度解析:从架构设计到性能优化的实战指南

V8引擎作为现代JavaScript运行时的核心技术,不仅是Chrome浏览器的核心组件,更是Node.js等服务器端应用的基石。本文将为技术开发者和架构师提供一份全面的V8引擎技术解析,涵盖架构设计原理、关键实现机制、性能优化策略等核心内容。通过深入剖析V8的源码结构和运行机制,帮助开发者掌握JavaScript引擎的底层原理,为高性能应用开发奠定坚实基础。 ## 技术背景与项目定位 V8引

gitblog_00903的博客 1083

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

数栈技术分享:利用V8深入理解 JavaScript 设计

一、JavaScript 代码运行 以大家开发常用的 Chrome 浏览器或 Node 举例,我们的 JavaScript 代码是通过 V8 运行的。但 V8 是怎么执行代码的呢?当我们输入 const foo = {foo:'foo'} 时 V8 又做了什么?笔者先抛出以上问题,我们接着往下看。 二、JavaScript 存储 在代码运行时,最重要的前提便是有一个能够存储状态的地方,这便是我们所述的堆栈空间。 我们的基础类型是保存在栈中的,会自动进行回收;而复合类型是保存在堆中的,通过GC操作进行

a958014226的博客 540

深入理解Node.js运行时架构:从V8引擎到事件循环的全脉络解析

在构建高性能网络应用时,理解JavaScript运行时的底层机制至关重要。现代JavaScript运行时通过事件驱动和非阻塞I/O模型实现高并发处理能力,其核心在于将单线程执行与异步操作解耦。这一架构的技术价值在于能够以少量资源支撑大量并发连接,特别适合I/O密集型场景。具体实现上,运行时通常由JavaScript引擎、事件循环库和系统绑定层协同工作:引擎负责代码解析与执行,事件循环管理任务调度,而绑定层则提供系统级能力。以Node.js为例,其通过V8引擎执行代码,依赖libuv库处理异步I/O,并利用线

weixin_31099291的博客 306

教女朋友学前端之深入理解JS引擎

宏观视角看 V8、V8 架构演进史、V8 的工作机制以及 V8 核心模块的工作原理。

童欧巴的博客 449

深入理解谷歌最强V8垃圾回收机制

有很多人都听说过V8引擎,但可能不是很了解,V8名称叫Chrome V8,是由谷歌开源的一个高性能 JavaScript 引擎。该引擎采用 C++ 编写,Google Chrome 浏览器用的就是这个引擎。V8 可以单独运行,也可以嵌入 C++ 应用当中。和其他的 JavaScript 引擎一样,V8 会编译、执行 JavaScript 代码,并一样会管理内存、垃圾回收等。就是因为 V8 的高性能以及跨平台等特性,所以它也是 Node.js 的 JavaScript 引擎。 V8引擎是前端开发者想升值加薪

前端交流群:954854084 3355

javascript引擎工作原理

1. 什么是JavaScript解析引擎? 简单地说,JavaScript解析引擎就是能够“读懂”JavaScript代码,并准确地给出代码运行结果的一段程序。比方说,当你写了 var a = 1 + 1; 这样一段代码,JavaScript引擎做的事情就是看懂(解析)你这段代码,并且将a的值变为2。 学过编译原理的人都知道,对于静态语言来说(如Java、C++、C),处理上...

明月如霜丶 869
上一篇: 惰性绑定 vs 立即注入:Chromium 扩展 API 初始化策略深度对比
下一篇: 深度解析 Chromium WebUI 的生命周期与 IsJavascriptAllowed 崩溃之谜
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ปรัชญา แค้วคำมูล

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值