前端 js 之 浏览器工作原理 和 v8引擎 01

嘿,老哥,来了就别跑 !学完 ,不亏 😂

文章目录

  • 一、输入url 之后做了什么
  • 二、简单了解下浏览器内核
  • 三、浏览器渲染过程 (渲染引擎)
  • 四、js 引擎
  • 五、chrome
  • 五、v8 引擎原理
  • 八、浏览器性能优化
  • 九、前端性能优化
  • 关于浏览器的周边知识 (以下)
  • 一、 浏览器 Chrome
  • 二、 进程
  • 三、协议
  • 四、浏览器渲染


一、输入url 之后做了什么


   我们再用百度都上网的时候,假设我们在地址栏输入我们想去的网址,然后就得到了我们想要的网站,输入url 之后做了什么呢?就可以执行到我们想要的目的?

   是这样,我们在输入 url 之后,浏览器会通过 DNS 进行解析,得到对应的 ip 地址,换句话来说,得到对应的服务器地址。这时服务器会返回一个 index.html(一般情况下,或者main.index等),浏览器会根据这个入口文件,解析这个html,当我们遇到css文件,就会下载css 文件,遇到srcipt 文件 就会下载script 文件。把所有文件下载完毕之后浏览器内核再去解析文件

   这是第一次读取,当我们第二次读取时,域名解析的 ip 会存在本地,浏览器可以直接读取浏览器缓存

二、简单了解下浏览器内核

        浏览器可以分为两部分:渲染引擎js引擎 , 渲染引擎 决定了浏览器该如何显示网页内容及页面的格式信息,渲染引擎是浏览器兼容性问题出现的根本原因;js 引擎 用来解释网页语法,并渲染到网页上。 由于 js引擎 越来越独立,浏览器内核偏向指向于 渲染引擎

  1. 渲染引擎: 负责HTML解析、布局、渲染等相关的工作
  2. JS引擎: 是一个专门处理JavaScript脚本的虚拟机,一般会附带在网页浏览器之中。

不同浏览器是有不同内核组成的

  1. Gecko:早期被 Netscape 和 Mozilla Firefox 浏览器浏览器使用
  2. Trident:由微软开发,被IE4~IE11浏览器使用,但是 Edge 浏览器已经转向 Blink
  3. Webkit:苹果基于KHTML开发、开源的,用于 Safari,Google Chrome在之前也在使用
  4. Blink:由Google 在KHTML 基础上开发的,是Webkit的一个分支,目前应用于Google Chrome、Edge、Opera等;

三、浏览器渲染过程 (渲染引擎)



在这里插入图片描述

刚刚我们说到,各种文件下载下来之后,再由浏览器引擎进行解析,根据上附图,我们来看下渲染过程

  1. 我们都知道啊,index.html 是第一个被下载的,html 里面无非就是一些标签,这时就会通过我们的浏览器内核 parser 会将我们的html 解析成一个 Dom Tree
  2. 在解析dom 过程中,如果遇到 javaScript 标签,会停止解析html , 而去加载执行js 代码,因为js 会对dom 进行一些操作的,比如新增一个节点。 ( 我们都知道js 是一个高级语言,cpu 是不认识的,那这就要用 js引擎 来执行
  3. 同样的道理,浏览器内核 parser 解析我们的css ,因为style 有很多规则,color ,display 等等,这些规则会应用到dom树上,通过html 和 css的结合,就会生成一个渲染树
  4. layout 是布局引擎,比如在设置了定位之后,布局引擎会根据浏览器页面大小进行处理,这时再生成新的渲染树
  5. 最后我们浏览器内核再进行绘制,进行展示

四、js 引擎


我们都知道 js 是一个高级语言,cpu 是不认识的 ,js 引擎 用来执行 js 代码

为啥?

  1. 高级的编程语言都是需要转成最终的机器指令来执行的
  2. 事实上我们编写的JavaScript无论你交给浏览器或者Node执行,最后都是需要被CPU执行
  3. 但是CPU只认识自己的指令集 (实际上是机器语言),才能被CPU所执行
  4. 所以我们需要JavaScript引擎帮助我们将JavaScript代码翻译成CPU指令来执行

JavaScript引擎

  1. SpiderMonkey:第一款JavaScript引擎,由Brendan Eich开发(也就是JavaScript作者);
  2. Chakra:微软开发,用于IT浏览器;
  3. JavaScriptCore:WebKit中的JavaScript引擎,Apple公司开发;
  4. V8:Google开发的强大JavaScript引擎,也帮助Chrome从众多浏览器中脱颖而出;
  5. 等等…



请添加图片描述



五、chrome


十年前,你说浏览器就是IE , 有人会出来反对
现在,你说浏览器是Chrome ,最多有人纠正你


那 chrome 浏览器 为什么能占据 60% 的市场呢?

“基于多进程模型”“V8 的高效快速”,还有 关于遵循的开源协议


关于进程 可以看看我在最下面写的 关于浏览器的周边知识 (以下)


五、v8 引擎原理


我们来看一下官方对V8引擎的定义:

  1. V8是用 C ++ 编写的Google 开源高性能 JavaScript 和 WebAssembly引擎,它用于 Chrome 和 Node.js 等。
  2. 它实现 ECMAScript 和 WebAssembly,并在 Windows 7 或更高版本,macOS 10.12+ 和使用 x64,IA-32,
    ARM 或 MIPS 处理器的 Linux 系统上运行。
  3. V8 可以独立运行,也可以嵌入到任何 C ++ 应用程序中

(看的懂,看! 看不懂,没关系,接着看!!!)


请添加图片描述
                           先不要慌,稳住!老哥!别怕,不难 👌


   我们都知道,cpu 是执行我们的指令的,而高级语言是不能直接被 cpu 执行的,需要转化为低级语言才行,所以我们需要借助 js 引擎帮助我们把高级语言 " 翻译 " 为低级语言, 现在把你卡姿兰的大眼睛瞄到上个图,红色框框的就是v8 引擎做的事,v8 引擎 是目前性能最高的 js 引擎,先不用在意看不懂这件事,接着往下走

假设我这有一坨代码: const name = ‘haha’

  1. 看图,

  2. parse 是解析,它包括 词法分析语法分析

  3. 词法分析:

    生成一个数组 tokens: [ ],用来存放每个词的信息

    对每个词进行分割, tokens: [ { type: ‘keyword’ , value:‘const’ } , { type: ‘indentifier’ , value:'name }]

    会进行判断,比如 const , 会先定义他的类型是一个关键字(keyword),并且它的值为 const
    包括等号,分号都会进行分析

    好处: 我们把这些划分为一个个小对象,这样很容易进行语法分析

  4. 语法分析: AST 抽象语法树

    根据语法分析之后我们进行语法分析,会生成一个 AST 抽象语法树

    比如 ts 转化为 js :
    ts ——> 通过ast 生成一个新的 ast ——> 改变之后生成新的代码 generate code ——> js代码

    好处: 因为他是一个树形,有些属性值是固定的,这样我们很容易转成 es5代码、es6代码、字节码…非常好操作,这个操作是由 ignation 执行的,可以把 ignition 当成一个解释器,

  5. 通过 ignition 我们可以转化为字节码,字节码也要经过处理变成汇编指令再得到结果,转化为字节码的好处就是可以跨平台 ( 往下看ps )

  6. v8 引擎之所以性能这么高,是因为他还有个库,trunboFan 用来收集信息,比如类型信息。对于执行频率高的函数的就保留


   可以看下这个,就是一个模拟 AST 抽象语法树 https://astexplorer.net/

在这里插入图片描述



总结:

Parse 模块 会将 JavaScript 代码转换成 AST(抽象语法树),这是因为解释器并不直接认JavaScript代码,如果函数没有被调用,那么是不会被转换成AST的

Ignition 是一个解释器,会将 AST 转换成 ByteCode(字节码),同时会收集 TurboFan 优化所需要的信息(比如函数参数的类型信息,有了类型才能进行真实的运算);如果函数只调用一次,Ignition 会执行解释执行 ByteCode;

TurboFan 是一个编译器,可以将字节码编译为CPU可以直接执行的机器码;如果一个函数被多次调用,那么就会被标记为热点函数,那么就会经过 TurboFan 转换成优化的机器码,提高代码的执行性能; 但是,机器码实际上也会被还原为ByteCode,这是因为如果后续执行函数的过程中,类型发生了变化( 比如 sum 函数原来执行的是 number 类型,后来执行变成了 string 类型),之前优化的机器码并不能正确的处理运算,就会逆向的转换成字节码;

ps : 我们都知道 AST 抽象语法树操作方便,为什么不直接转为机器码呢?是这样的,因为我们 js 代码可能跑在window系统的浏览器里,可能跑在iso 系统的浏览器,可能跑在linux 系统上的浏览器上面…跑的环境不一样,就会拥有不同的 cpu , 不同 cpu 又有着不一样的架构,执行的机器指令是不一样的,所以 字节码的好处就是可以跨平台

备注:

  1. 机器码:机器码就是cpu能够直接读取并运行的代码,用二进制编码表示,也叫做机器指令码。
  2. 字节码:字节码是一种中间状态的二进制代码,是由源码编译过来的,可读性没有源码高。而且cpu也不能够直接读取字节码,在java中,字节码需要经过JVM虚拟机转译成机器码之后,cpu才能够读取并运行
  3. 采用字节码的好处:比如java语言,通过字节码的方式,在一定程度在解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。所以java程序运行时比较高效,而且由于字节码并不专对于一种特定的机器,因此java程序无需重新编译便可以在多种不同的计算机上运行
  4. 什么是字节码文件?
    字节码文件是经过编译器预处理过的一种文件,是JAVA执行文件的存在形式。
    它本身是二进制文件,但是不可以被系统直接执行,而是需要虚拟机(JVM)解释执行。由于被预处理过,所以比一般的解释代码要快,但是仍然会比系统直接执行的慢

代码执行过程,可以看下我写的文章, 02

八、浏览器性能优化


加载时

  1. 减少http请求 (精灵图,文件的合并)
  2. 减少文件大小 (资源压缩,图片压缩,代码压缩)
  3. CDN (第三方库,大文件,大图)
  4. SSR 服务器端渲染,预渲染
  5. 懒加载
  6. 分包
  7. 减少dom操作,避免回流,文档碎片(一种虚拟的DOM节点,存在于内存中)

九、前端性能优化

缓存:客户端控制的强缓存策略

降低请求成本

  1. http dns 由客户端控制,隔一段时间主动请求dns获取域名ip,不走系统的dns
  2. tcp/tls 连接复用:减少请求数
  3. js.css打包到html
  4. js控制图片异步加载或者懒加载
  5. 小型图片使用精灵图
  6. 减少传输体积
  7. 懒加载:自定义属性data-src存放真正需要显示的图片路径

告辞!!!!

请添加图片描述











v8性能高的原因:

  1. 编译器优化:v8引擎使用了即时编译(Just-in-Time Compilation)技术,将JavaScript代码转换为本地机器码,以提高执行速度。它包括解析、分析和优化代码的过程,以便生成高效的机器码。

  2. 内存管理:v8引擎使用了高效的内存管理机制,如垃圾回收器(Garbage Collector),用于自动管理内存的分配和释放。它能够及时回收不再使用的内存,避免内存泄漏和过度消耗。

  3. 即时优化:v8引擎还具有即时优化功能,它会在代码执行过程中动态地优化性能。例如,它会根据运行时的上下文信息进行内联优化,将函数调用内联到调用处,避免了函数调用的开销。

  4. 多线程支持:v8引擎通过使用多线程技术,如并行编译和并行垃圾回收等,提高了执行效率。它可以同时处理多个任务,并充分利用多核处理器的计算能力




关于浏览器的周边知识 (以下)



先说两个概念,互联网 internet 泛指具有互通的计算机网络;因特网 Internet 是基于TCP/IP 协议族的最大的计算机网络;万维网 web (word wide web) 是基于互联网,由超链接和统一资源标识符(连接)的文件和其他资源的全球集合

万维网由三个部分构成 :

  1. 统一资源标识符 URI (由一个字符串来表示抽象的或者物理的资源)
  2. 超文本标记语言 html ( 超文本:含有指向其他资源链接的文本;标记语言:通过一些标签包裹的元素,这些标记会被浏览器识别为超链接或者文本段等)
  3. 超文本传输协议 http (传输 html 的一个协议)

URL 和 URI 的区别:

  1. URL 统一资源 定位
  2. URI 统一资源 标识
  • 这样说吧, URI 是一个抽象的地址,URL 是一个具体的地址
    抽象的地址:安徽省亳州市
    具体的地址:安徽省亳州市利辛县汝集镇 223号
  • 所以说 URL 是 URI 的子集
  • 再举个例子:
    http://www.csdn.net 是一个服务器地址,但是没有具体到文件是什么类型 (URI)
    http://www.csdn.net/image/logo.gif 这就是一个很具体的地址 (URL)

一、 浏览器 Chrome


        浏览器可以分为两部分:渲染引擎js引擎 , 渲染引擎 决定了浏览器该如何显示网页内容及页面的格式信息;js 引擎 用来解释网页语法,并渲染到网页上。 由于 js引擎 越来越独立,浏览器内核偏向指向于 渲染引擎

  1. 渲染引擎: 负责HTML解析、布局、渲染等相关的工作
  2. JS引擎: 是一个专门处理JavaScript脚本的虚拟机,一般会附带在网页浏览器之中。
  • 十年前,你说浏览器就是IE , 有人会出来反对
    现在,你说浏览器是Chrome ,最多有人纠正你

  • 那 chrome 浏览器 为什么能占据 60% 的市场呢?
    基于多进程模型V8引擎的高效快速

关于V8引擎的原理 可以看看我 前端 js 之 浏览器工作原理 和 v8引擎 01 这篇文章。

二、 进程


进程是一个程序的运行实例,当我们启动一个程序时,那么操作系统会创建一块内存给代码和运行时的数据使用,并且创建一个线程来处理任务。这个环境就是叫做进程

线程:它是进程的 一个执行任务 或者可以叫做控制单元,负责当前进程中程序的执行。一个进程至少有一个线程,一个进程也可以运行多个线程。

  1. 多个线程之间可以进行数据共享,
  2. 进程关闭后内存会正确回收,
  3. 但是如果一个线程发生崩溃,整个进程就会崩溃,

不同进程之间的内容相互隔离,进程通信需要依靠 IPC ( 进程间通讯机制 )


在这里插入图片描述

在 chrome 浏览器诞生之前,大多数浏览器都是单进程

  1. 单进程的所有功能模块都在同一个进程中运行的,如果有一个产生问题,整个进程都会跟着崩溃,必须对浏览器进行重启;
  2. 因为页面所有的功能都在一个进程中,当一个页面卡住时,所有页面都会卡住,所以卡也是一个问题;
  3. 因为所有页面都在一个进程中,单个页面的数据因为代码编写问题而出现内存泄漏,在关闭页面时,泄露的内存并不会进行回收会导致浏览器会越用越卡;
  4. 插件和渲染线程拥有很高的权限。插件和渲染线程中包括各种脚本代码,而这些脚本代码通常是由第三方编写的,如果有恶意插件或者网站可以通过权限来读取本地数据

所以 chrome 浏览器采用 多进程架构

  1. 每个页面有单独渲染进程和插件进程
  2. 每个页面的渲染进程和插件进程都放进沙箱内,让他们不能获取系统权限
  3. 权限问题统一交给浏览器的主线程来操作
  4. 不同进程之间通过 IPC 来传输数据

浏览器是多进程的: 在浏览器中,每打开一个tab页面,其实就是新开了一个进程,在这个进程中,还有ui渲染线程,js引擎线程,http请求线程等。 所以,浏览器是一个多进程的


请添加图片描述


一个浏览器的进程

请添加图片描述

  • 浏览器进程: 负责页面的展示,用户的交互,管理子进程还有提供存储功能
  • 网络进程 : 下载网络资源
  • GPU进程:绘制网页和UI界面
  • 渲染引擎:js引擎 和 排版引擎
  • 插件引擎: 扶着加载和运行页面上的插件

三、协议

协议:保证了通信双方都可以识别的一种约定的数据格式

通过计算机网络可以使多台计算机实现连接,但是位于同一个网络中的计算机 在进行连接和通信时 必须要遵守一定的 规则,就像比在道路中行驶的汽车要遵守交通规则。在计算机网络中,这些连接和通信的规则被称为网络通信协议,它对数据的传输格式、传输速率、传输步骤等做了统一规定,通信双方必须同时遵守才能完成数据交互。

协议类型

  1. 互联网协议:基于IP协议的一个体系架构,想要进行数据的传输,每个主机都要有特定的 ip 地址
  2. ip协议,通过dns 进行域名解析,找到对应的网址,并进行缓存
  3. http 超文本传输协议:规定传输包的数据格式
  4. 通过tcp/ip 发送到网络中
  5. udp ,通过端口号访问指定程序,但是不能保证对方确定接受到
  6. tcp(传输控制协议) 解决了udp 传输不可靠问题,增加了重传机制,tcp协议是面对连接的,传输前会和目标设备进行连接,传输完成后断开

http 请求流程:

我们通过URL 请求服务器,服务器会返回给我们网页数据文件,那之间的流程是怎样的呢?
在这里插入图片描述

当我们发送请求时,浏览器会找有没有上次请求缓存的文件,如果有且文件没有过期,就会直接使用不再请求,减少了服务器的压力,而且可以快速加载。

如果没有,通过http 做应用层协议( http 协议规定传输包的数据格式),通过 TCP/IP 把他们发送到发送到网络中,发送之前会通过 DNS 通过域名查找到对应的服务器地址,查找到以后对他们进行缓存,如果输入的域名没有加端口号会默认加 80;完成以后为 TCP 建立连接,三次握手四次挥手,就可以正式发送我们的 HTTP ,接下来就是服务端接收到请求并返回数据。

在这里插入图片描述



四、浏览器渲染


渲染流程:

在这里插入图片描述

我们都知道网页的三件套: html css javascript

  1. html 超文本标记语言,由各种标签组成,标签可以代表元素类型,html 是网页的骨架
  2. css 层叠样式表,可以赋予网页各种好看的样式,排版
  3. js 给网页赋予各种逻辑,让网页变得具有交互性
  • 因为网页不能识别html , 需要通过 html 解析器转化为dom树,供后续的步骤使用 (网络进程加载多少数据,解析器就会解析多少数据,网络进程会实时把获取的数据传递给渲染进程,由解析器解析 )
  • 看我正篇吧,比较详细

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/111965.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机算法分析与设计(13)---贪心算法(多机调度问题)

文章目录 一、问题概述1.1 思路分析1.2 实例分析 二、代码编写 一、问题概述 1.1 思路分析 1. 设有 n n n 个独立的作业 1 , 2 , … , n {1, 2, …, n} 1,2,…,n,由 m m m 台相同的机器 M 1 , M 2 , … , M m {M_1, M_2, …, M_m} M1​,M2​,…,Mm​ 进行加工处…

Qemu镜像安全加密测试

文章目录 简介1.已经过时的qemu自带的加密方式介绍1.1.创建secret uuid的xml1.2.产生uuid1.3.给secret赋值1.4.创建一个存储池1.5.在存储池中创建一个镜像1.6.在虚拟机中使用该镜像 2.弃用以上加密方式2.1.原作者Daniel Berrange的观点2.2.Markus Armbruster更深入的操作 3. LU…

vue实现在页面拖拽放大缩小div并显示鼠标在div的坐标

1、功能要求&#xff1a; 实现在一个指定区域拖拽div,并可以放大缩小&#xff0c;同时显示鼠标在该div里的坐标&#xff0c;如图可示 缩小并拖动 2、实现 <div class"div_content" ref"div_content"><div class"div_image" id"…

【运维知识高级篇】超详细的Jenkins教程5(pipeline流水线配置+分布式构建)

CI/CD是持续集成&#xff0c;持续部署&#xff0c;集成就是开发人员通过自动化编译&#xff0c;发布&#xff0c;测试的手段集成软件&#xff0c;在开发的测试环境上测试发现自己的错误&#xff1b;持续部署是自动化构建&#xff0c;部署&#xff0c;通常也是在测试环境上进行&…

014 - ARM64上的GIC-400(GICv2)

本章节涉及到的参考文档有三个&#xff1a; BCM2711 ARM Peripherals.pdfARM Generic Interrupt Controller Architecture Specification.pdf (简称gic_v2)CoreLink GIC-400 Generic Interrupt Controller Technical Reference Manual.pdf 1. GIC 发展历史 在早期的 ARM 系统…

深度学习技巧应用29-软件设计模式与神经网络巧妙结合,如何快速记忆软件设计模式

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下软件设计模式与神经网络巧妙结合&#xff0c;如何快速记忆软件设计模式。我们知道软件设计模式有23种&#xff0c;考试的时候经常会考到&#xff0c;但是这么种里面我们如何取判断它呢&#xff0c;如何去记忆它呢&a…

双指针——盛水最多的容器

一, 题目要求 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明&#xff1a;你不能倾斜容…

Jmeter接口自动化测试 —— Jmeter下载安装及入门

jmeter简介 Apache JMeter是Apache组织开发的基于Java的压力测试工具。用于对软件做压力测试&#xff0c;它最初被设计用于Web应用测试&#xff0c;但后来扩展到其他测试领域。 下载 下载地址&#xff1a;Apache JMeter - Download Apache JMeter 安装 由于Jmeter是基于Java的…

酷克数据发布HD-SQL-LLaMA模型,开启数据分析“人人可及”新时代

随着行业数字化进入深水区&#xff0c;企业的关注点正在不断从“数字”价值转向“数智”价值。然而&#xff0c;传统数据分析的操作门槛与时间成本成为了掣肘数据价值释放的阻力。常规的数据分析流程复杂冗长&#xff0c;需要数据库管理员设计数据模型&#xff0c;数据工程师进…

STP生成树协议详解

一、STP作用 如果链路断开或节点故障&#xff0c;那么互联的设备就无法正常通信了&#xff0c;这类网络问题叫做单点故障。没有备份的链路或节点&#xff0c;出现故障会直接断网。如果要提供 724 小时不间断的服务&#xff0c;那就需要在网络中提前部署冗余。避免出现单点故障…

快速入门python机器学习

文章目录 机器学习概述1.1 人工智能概述机器学习与人工智能、深度学习1.1.2 机器学习、深度学习能做些什么 1.2 什么是机器学习1.2.1 定义1.2.2 解释1.2.3 数据集构成 1.3 机器学习算法分类1.3.1 总结1.3.2 练习1.3.3 机器学习算法分类 1.4 机器学习开发流程&#xff08;了解&a…

ECharta雷达图 样式调整

预期效果&#xff1a; <template><div id"operationalRisk-radar-chart" class"h-290 w-385"></div> </template><script>export default {name: radarChart} </script> <script setup>import { onMounted, r…

CleanMyMac X4.14.4最新免费版本功能介绍

最新版CleanMyMac X 让您的Mac焕然一新&#xff0c;时刻保持安全&#xff01;CleanMyMac X是一款专业的Mac清理软件&#xff0c;可智能清理mac磁盘垃圾和多余语言安装包&#xff0c;快速释放电脑内存&#xff0c;轻松管理和升级Mac上的应用。同时CleanMyMac X可以强力卸载恶意软…

GEO生信数据挖掘(八)富集分析(GO 、KEGG、 GSEA 打包带走)

第六节&#xff0c;我们使用结核病基因数据&#xff0c;做了一个数据预处理的实操案例。例子中结核类型&#xff0c;包括结核&#xff0c;潜隐进展&#xff0c;对照和潜隐&#xff0c;四个类别。第七节延续上个数据&#xff0c;进行了差异分析。 本节对差异基因进行富集分析。 …

大咖云集,智慧碰撞|第 18 届 CLK 大会完整议程揭晓(内附报名通道)

自 2006 年以来&#xff0c;在国内 Linux 技术爱好者和行业公司的鼎力支持下&#xff0c;中国 Linux 内核开发者大会已走过 17个年头&#xff0c;是中国 Linux 内核领域最具影响力的峰会之一。今年的中国内核开发者大会依然秉承历届理念&#xff0c;以“自由、协作、创新”为理…

Python-Python高阶技巧:闭包、装饰器、设计模式、多线程、网络编程、正则表达式、递归

版本说明 当前版本号[20231018]。 版本修改说明20231018初版 目录 文章目录 版本说明目录Python高阶技巧闭包简单闭包修改外部函数变量的值实现以下atm取钱的闭包实现了闭包注意事项 装饰器装饰器的一般写法&#xff08;闭包写法&#xff09;装饰器的语法糖写法 设计模式单例…

x86 架构的机载计算机,它来了!

Allspark 2-x86采用Intel酷睿11代或12代CPU&#xff0c;x86架构&#xff0c;适用于无人机等机器人运行SLAM、VIO等复杂逻辑和高精度的机器视觉任务。预装 Ubuntu 22.04或Windows 11&#xff0c;满足多种使用场景。 市面上现有的一些NUC产品&#xff0c;不仅没有针对移动机器人使…

【数据结构】线性表(三)循环链表的各种操作(创建、插入、查找、删除、修改、遍历打印、释放内存空间)

目录 线性表的定义及其基本操作&#xff08;顺序表插入、删除、查找、修改&#xff09; 四、线性表的链接存储结构 1. 单链表 2. 循环链表 a. 循环链表节点结构体 b. 创建新节点 c. 在循环链表末尾插入节点 d. 删除循环链表中指定值的节点 e. 在循环链表中查找指定值的…

HZOJ-271: 滑动窗口

题目描述 ​ 给出一个长度为 N&#xfffd; 的数组&#xff0c;一个长为 K&#xfffd; 的滑动窗口从最左移动到最右&#xff0c;每次窗口移动&#xff0c;如下图&#xff1a; 找出窗口在各个位置时的极大值和极小值。 输入 ​ 第一行两个数 N,K&#xfffd;,&#xfffd;。 …

linux部署gitlab

1. 配置yum源&#xff1a; vim /etc/yum.repos.d/gitlab-ce.repo [gitlab-ce] nameGitlab CE Repository baseurlhttps://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el$releasever/ gpgcheck0 enabled1 2. 更新本地缓存 sudo yum install -y gitlab-ce 3. 安装相关依赖 yum …