当前位置: 首页 > news >正文

编译和链接【三】

文章目录

  • 编译和链接【三】
    • 前言
    • 系列文章入口
    • 编译过程
      • 词法分析
      • 语法分析
      • 语义分析
      • 生成中间代码
      • 汇编
      • 链接

编译和链接【三】

前言

在我大一的时候, 我使用VC6.0对C语言程序进行编译链接和运行 , 然后我接触了VS, Qt creator等众多IDE, 这些IDE界面友好, 使用方便, 例如我最喜欢的VS,一键编译运行。对于大一的我,不需要了解编译的整个过程就可以运行,这无疑是非常棒的,并且增加了我对编程的兴趣,同时也简化了我后续的软件开发, 我只需要关心业务和功能代码即可。

但是今天, 我不想“逃课了”,欢迎来到我的频道,本系列 将会介绍编译中的一系列细节。

在正式开始之前,我要推荐两本书,一本是《程序员的自我修养》,另一本是《鲸书》,这两本书对编译的整个过程做了非常详细,非常完备的介绍,但是恰恰如此,我想很多时候,很多知识在工作上是用不到的,也许这句话在很多年多的我会反驳,但是站在工作一年的现在,我将会给你介绍,我所了解的编译和链接。

系列文章入口

关注我~持续更新

编译和链接【一】

编译和链接【二】

编译过程

在汇编语言中,通常是以段作为标识,来完成某个功能,例如,你可能会看到这样的代码:

start:# code...goto errHandleerrHandle:# code...

上面的代码片里就是在某种情况下,发生出错的时候,统一的跳转到错误处理函数里,而从C/C++的翻译单元到汇编文件的转换,其实就是把C/C++代码中的函数,代码块转换为汇编代码中的代码段,而C/C++程序里的全局变量,静态变量和常量则转换为汇编中的数据段和只读段

总体来说,编译过程可分为以下6步:

  • 词法分析
  • 语法分析
  • 语义分析
  • 中间代码生成
  • 汇编代码生成
  • 目标代码生成

词法分析

这是编译的第一步,主要用来解析程序里的语句。整个过程利用状态机的思想,将语句从左到右进行扫描,一个字符一个字符地读入,然后解析并标识这些字符,最终会分解为最小记号单元:token,常见的token如下:

  • 关键字:autoconstconstexprconsteval
  • 各种标识符:函数名,变量名等
  • 字面量:字符串等
  • 运算符:+, **-**等
  • 分隔符:;(用于标识语句结束)等

例如你有这样的语句:

sum = a + b / c;

经过扫描处理后,会分解为8个token, “sum”, “=”, “a”, “+”, “b”, “/”, “c”, “;”

在我大一学习C语言的时候,常常会使用中文符号,这个时候就会发生编译错误,其实就是发生在这个阶段。

语法分析

语法分析的核心是构建语法树,也就是根据之前分解的token来解析,看看能否构成语法树,例如上个阶段的语句就能构成:

在这里插入图片描述

在解析构建的过程中, 如果发现不能构建成语法树,那么就会报语法错误:syntax error,例如缺少语句结束符号等。

语义分析

如果说,语法分析仅仅是语法上的校验,那么语义分析则是对各种表达式,语句进行检查,例如:函数传参是否匹配,重载决议等,再或者是使用某个变量,但是未定义的情况;或者除数为零了; break在循环语句或switch语句之外出现了;或者在循环语句之外发现 了continue语句;一般都会报语义上的错误或警告。

生成中间代码

在上个阶段,还是以语法树的形式进行存储,我们需要把其转换为中间代码,这种形式类似于伪代码,常见的有:三地址码,P-代码等。

而你的疑惑可能是,既然有了语法树,为什么要转换为中间代码呢?

答案很简单,中间代码是一维线性序列,编译器可以方便的将中间代码翻译为目标代码,例如,我有以下的程序:

#include <iostream>
#include <string>using namespace std;#define MESSAGE "hello world!"#pragma message("build cpp project")int main()
{int a = 3, b = 4;int c = a + b;return 0;
}

使用gcc的命令:-fdump-tree-gimple

可以生成中间代码,这个时候会在你的当前目录下生成一个后缀为gimple的文件,例如我生成的结果

在这里插入图片描述

以上的代码则被转换为:

main ()
{int D.39926;{int a;int b;int c;a = 3;b = 4;c = a + b;D.39926 = 0;return D.39926;}D.39926 = 0;return D.39926;
}

中间码一般和平台是无关的,如果你想将C程序编译为X86平台下的可执行文件,那么最后一步就是根据X86指令集,将中间代码翻译为X86汇编程序。

如果你想编译成在ARM平台上运行的可执行文件,那么就要参考ARM指令集,根据ATPCS规则分配寄存器,将中间代码翻译成ARM汇编程序。

根据上面的三地址码,我们就可以尝试使用汇编指令实现

section .dataa dd 3b dd 4c dd 0section .textglobal _start_start:; Load the value of 'a' into the EAX registermov eax, [a]; Add the value of 'b' to the EAX registeradd eax, [b]; Store the result in 'c'mov [c], eax; Exit the programmov eax, 1          ; syscall number for sys_exitxor ebx, ebx        ; exit code 0int 0x80            ; call kernel

汇编

这个过程就是利用汇编器来把前阶段生成的汇编文件翻译为目标文件,主要工作是参考对应架构的指令集来完成,同时生成一些其他信息。整个过程使用图表形式进行展现:

在这里插入图片描述

链接

通过编译生成的可重定位的目标文件,都是以零地址为链接起始地址进行链接的,也就是说,编译期在将源文件翻译成可重定位的目标文件的过程中,将代码翻译为二进制指令以后,会从零地址开始把各个指令序列放到代码段中,每个函数的入口也是从零地址开始偏移。

让我们看看目标文件的section信息

在这里插入图片描述

你可以看出,不过是地址还是偏移地址,都是从0开始的,这也符合我在开头所说。

那么,如果大家都想把自己放在零地址,链接器又是怎么将各个目标文件组装在一起的呢?

答案很简单,链接器把各个目标文件组装在一起后,我们需要重新修改各个目标文件中变量和函数的地址,这个过程就是:重定位

而一个疑惑就显然地产生了,链接器是怎么知道哪些函数/变量需要重定位呢?

显然,我们需要打表,也就是把需要重定位的符号专门的收集起来,生成一个重定位表,并且以section的形式保存到每个可重定位目标文件中即可。

当然,一个符号,不管其是否需要重定位,都需要收集起来,这就是:符号表,也以section的形式保存到可重定位目标文件中。

在链接器组装过程中,函数的地址发生了变化,在链接器组装之后,需要重新计算和更新函数的新地址,这个过程就是重定位。

相关文章:

编译和链接【三】

文章目录 编译和链接【三】前言系列文章入口编译过程词法分析语法分析语义分析生成中间代码汇编链接 编译和链接【三】 前言 在我大一的时候&#xff0c; 我使用VC6.0对C语言程序进行编译链接和运行 &#xff0c; 然后我接触了VS&#xff0c; Qt creator等众多IDE&#xff0c…...

11苍穹外卖之Apache ECharts(数据可视化图表、后端传数据)

课程内容 Apache ECharts 营业额统计 用户统计 订单统计 销量排名Top10 功能实现&#xff1a;数据统计 数据统计效果图&#xff1a; 1. Apache ECharts 1.1 介绍 Apache ECharts 是一款基于 Javascript 的数据可视化图表库&#xff0c;提供直观&#xff0c;生动&#…...

Grafana-使用Button修改MySQL数据库

背景 众所周知&#xff0c;Grafana是一个用来展示数据的平台&#xff0c;但是有时候还是会有需求说能不能有一个按钮&#xff0c;点击的时候再对数据库进行修改&#xff0c;从而达到更新数据的效果 经过多方查证&#xff0c;终于实现了一个简单的&#xff0c;点击button执行sq…...

C++11语法及库详解

目录 一、c11语法 1. 自动类型推导 (auto) 2. 基于范围的 for 循环 3. Lambda 表达式 4. 智能指针 5. 右值引用和移动语义 6. nullptr 关键字 7. constexpr 关键字 8. 初始化列表 9. std::thread 多线程支持 10. std::function 和 std::bind 11. std::unordered_map…...

数据库,数据表的增删改查操作

一.数据库的基本操作 &#xff08;1&#xff09;创建数据库 创建数据库就是在数据库系统中划分一块存储数据的空间&#xff0c;方便数据的分配、放置和管理。在MySQL中使用CREATE DATABASE命令创建数据库&#xff0c;语法格式如下: CREATE DATABASE数据库名称; 注&#xff1a…...

Python——批量图片转PDF(GUI版本)

目录 专栏导读1、背景介绍2、库的安装3、核心代码4、完整代码总结专栏导读 🌸 欢迎来到Python办公自动化专栏—Python处理办公问题,解放您的双手 🏳️‍🌈 博客主页:请点击——> 一晌小贪欢的博客主页求关注 👍 该系列文章专栏:请点击——>Python办公自动化专…...

RocketMQ面试题:原理部分

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…...

中间件-安装Minio-集成使用(ubantu-docker)

目录 1、安装docer 2、运行以下命令拉取MinIO的Docker镜像 3、检查当前所有Docker下载的镜像 4、创建目录 5、创建Minio容器并运行 6、SDK操作 FileUploader.java 1、安装docer 参考这篇&#xff1a;Linux安装Docker 2、运行以下命令拉取MinIO的Docker镜像 docker pull…...

vue3: const一个function怎么写呢?

问&#xff1a; 用ref或者reactive定一个一个const refCharts ref(function xxx (config){ xxxxx,xxxxx xxxx,xxxx })请问怎么写&#xff1f; 回答&#xff1a; 在 Vue 3 中&#xff0c;ref 和 reactive 是两种常用的响应式数据定义方式。ref 用于定义单个响应式对象或原始值…...

【JVM详解三】垃圾回收机制

一、对象是否存活 强引用&#xff1a;Object obj new Object(); 只要强引用还在&#xff0c;垃圾收集器永远不会回收掉被引用的对象。在不用对象的时将引用赋值为 null&#xff0c;能够帮助垃圾回收器回收对象。比如 ArrayList 的 clear() 方法实现。软引用&#xff08;SoftRe…...

dbeaver 安装之后出现mysql连接异常问题

1.手动下载mysql驱动程序 参考文档DBeaver连接mysql驱动下载失败怎么办&#xff1f;-CSDN博客 2.添加对应的下载程序到dbeaver 【DBeaver】缺少mysql驱动_dbeaver连接mysql缺少驱动-CSDN博客 配置mysql 地址端口账户等即可使用...

Android Studio历史版本下载

Android Studio历史版本下载 历史版本所在网站: https://developer.android.google.cn/studio/archive 等待加载 1、&#xff08;需要点击switch to english&#xff09;然后出现Terms and conditions 2、滑到最下面&#xff0c;点击I agree to the terms&#xff0c;之后才会…...

【每日一题 | 2025】2.3 ~ 2.9

个人主页&#xff1a;GUIQU. 归属专栏&#xff1a;每日一题 文章目录 1. 【2.3】P8784 [蓝桥杯 2022 省 B] 积木画2. 【2.4】P8656 [蓝桥杯 2017 国 B] 对局匹配3. 【2.5】[ABC365D] AtCoder Janken 34. 【2.6】P8703 [蓝桥杯 2019 国 B] 最优包含5. 【2.7】P8624 [蓝桥杯 2015…...

国产编辑器EverEdit - 迷你查找

1 迷你查找 1.1 应用场景 某些场景下&#xff0c;用户不希望调出复杂的查找对话框&#xff0c;此时可以使用迷你查找窗口。 1.2 使用方法 选择主菜单查找 -> 迷你查找&#xff0c;或使用快捷键Ctrl Alt F&#xff0c;会在右上角弹出迷你查找窗口&#xff0c;如下图所示…...

制药行业 BI 可视化数据分析方案

一、行业背景 随着医药行业数字化转型的深入&#xff0c;企业积累了海量的数据&#xff0c;包括销售数据、生产数据、研发数据、市场数据等。如何利用这些数据&#xff0c;挖掘其价值&#xff0c;为企业决策提供支持&#xff0c;成为医药企业面临的重大挑战。在当今竞争激烈的…...

第40天:Web开发-JS应用VueJS框架Vite构建启动打包渲染XSS源码泄露代码审计

#知识点 1、安全开发-VueJS-搭建启动&打包安全 2、安全开发-VueJS-源码泄漏&代码审计 一、Vue搭建创建项目启动项目 1、Vue 框架搭建->基于nodejs搭建&#xff0c;安装nodejs即可 参考&#xff1a;https://cn.vuejs.org/ 已安装18.3或更高版本的Node.js 2、Vue 创建…...

2.10学习总结

今天接着看了数据结构&#xff0c;但是跟指针有关的看不懂&#xff08;万恶的指针&#xff09;&#xff0c;写了考试的补题。 #include <stdio.h> #include <stdlib.h> int a[1000005]; int main() {int n,i,x0;scanf("%d",&n);for(i1;i<n;i){x;i…...

MySQL 中可以通过添加主键来节省磁盘空间吗?(译文)

从历史上看&#xff0c;MySQL 不需要在表上定义显式主键&#xff0c;直到今天默认都是这样。不过&#xff0c;这种要求是通过两种复制方法施加的&#xff1a;组复制和 Percona XtraDB 集群 &#xff08;PXC&#xff09;&#xff0c;默认情况下不允许使用没有主键的表。对于缺少…...

Django在终端创建项目(pycharm Windows)

1.选择目录 选择或新建一个文件夹&#xff0c;作为项目保存的地方 2.右键在终端打开 3.确定django-admin.exe安装位置 找到自己安装django时&#xff0c;django-admin.exe安装的位置&#xff0c;例如 4.运行命令 使用django-admin.exe的绝对路径&#xff0c;在刚才打开的终端…...

IDEA接入DeepSeek

IDEA 目前有多个途径可以接入deepseek&#xff0c;比如CodeGPT或者Continue&#xff0c;这里借助CodeGPT插件接入&#xff0c;CodeGPT目前用的人最多&#xff0c;相对更稳定 一、安装 1.安装CodeGPT idea插件市场找到CodeGPT并安装 2.创建API Key 进入deepseek官网&#xf…...

Linux 内核自旋锁spinlock(二)--- ticket spinlock

文章目录 前言一、ticket spinlock二、源码分析2.1 spin_lock_init2.2 spin_lock2.2 spin_unlock 参考资料 前言 自旋锁是 Linux 内核中最底层的互斥机制。因此&#xff0c;它们对内核的安全性和性能有着巨大的影响&#xff0c;因此对各种&#xff08;特定架构的&#xff09;自…...

Elixir语言的计算机基础

Elixir语言的计算机基础 引言 Elixir是一种现代的编程语言&#xff0c;建立在Erlang虚拟机&#xff08;BEAM&#xff09;上&#xff0c;专注于并发、分布式系统和容错能力。随着互联网的发展&#xff0c;应用程序的需求变得越来越复杂&#xff0c;Elixir凭借其高效的性能、灵…...

MindStudio制作MindSpore TBE算子(二)算子测试

在上一节中&#xff0c;成功制作了Mindspore的Add算子&#xff0c;具体可以查看MindStudio制作MindSpore TBE算子&#xff08;一&#xff09;算子制作&#xff0c;这一节&#xff0c;一起看看如何对算子进行测试。 建议参考以下内容一起食用&#xff1a; 算子代码实现 MindSpor…...

深度解读城市地下网管管廊改造要点

引 言 近日国家发改委和住建部联合发布通知&#xff08;后附&#xff09;&#xff0c;要求各地抓紧编制“城市地下管网和综合管廊建设改造实施方案”并于12月27日前报国家发改委和住建部相关司处&#xff0c;逾期未报的城市&#xff08;县、区&#xff09;&#xff0c;视同自愿…...

Docker 部署 redis | 国内阿里镜像

一、简易单机版 1、镜像拉取 # docker hub 镜像 docker pull redis:7.0.4-bullseye # 阿里云镜像 docker pull alibaba-cloud-linux-3-registry.cn-hangzhou.cr.aliyuncs.com/alinux3/redis_optimized:20240221-6.2.7-2.3.0 2、运行镜像 docker run -itd --name redis \n …...

Day88:加载游戏图片

在游戏开发中,加载和显示图片是非常常见的需求,尤其是在 2D 游戏 中,角色、背景、道具、敌人等都需要用图片来表示。今天,我们将学习如何在 Python 游戏开发中使用 Pygame 加载并显示图片。 1. 加载游戏图片的基本步骤 在 Pygame 中加载图片通常需要以下几个步骤: 导入 P…...

Elasticsearch:在 Elastic 中玩转 DeepSeek R1 来实现 RAG 应用

在这个春节&#xff0c;如一声春雷&#xff0c;DeepSeek R1 横空出世。现在人人都在谈论 DeepSeek R1。这个大语言模型无疑在中国及世界的人工智能发展史上留下了重要的里程碑。那么我们改如何结合 DeepSeek R1 及 Elasticsearch 来实现 RAG 呢&#xff1f;在之前的文章 “使用…...

SOME/IP报文格式及发现协议详解

在之前的文章中&#xff0c;我们介绍了SOME/IP协议的几种服务接口。在本篇博客中&#xff0c;主要介绍some/ip协议传输的header报文格式以及SOME/IP-SD发现协议。 目录 流程 报文格式 Message ID Length Request ID protocal version/Interface Version Message Type…...

elementplus 使用日期时间选择器,设置可选范围为前后大于2年且只能选择历史时间不能大于当前时间点

需求&#xff1a;时间选择器可选的时间范围进行限制&#xff0c;-2年<a<2年且a<new Date().getTime()核心&#xff1a;这里需要注意plus版没有picker-options换成disabled-date属性了&#xff0c;使用了visible-change和calendar-change属性逻辑&#xff1a;另设一个参…...

C语言·关键字·char关键字

C语言菜鸟入门关键字char关键字_c char-CSDN博客...

Ansible简单介绍及用法

一、简介 Ansible是一个简单的自动化运维管理工具&#xff0c;基于Python语言实现&#xff0c;由Paramiko和PyYAML两个关键模块构建&#xff0c;可用于自动化部署应用、配置、编排task(持续交付、无宕机更新等)。主版本大概每2个月发布一次。 Ansible与Saltstack最大的区别是…...

Mac 本地搭建自己的 DeepSeek

Mac 本地搭建自己的 DeepSeek 安装 Ollama通过Ollama命令安装 DeepSeek 模型安装一个UI客户端&#xff0c;提升体验 注&#xff1a;本文章完全参考网上教程&#xff0c;没有丝毫原创&#xff0c;只是记录一下我本人在安装DeepSeek 的步骤 安装 Ollama https://ollama.com/dow…...

深度学习-交易预测

下面为你详细介绍如何使用Python结合深度学习库TensorFlow和Keras来构建一个简单的交易预测模型。在这个示例中&#xff0c;我们以股票价格预测为例&#xff0c;假设我们要根据过去一段时间的股票价格数据来预测未来的价格走势。 步骤分析 数据准备&#xff1a;获取股票价格数…...

Prompt逆向工程:如何“骗“大模型吐露其Prompt?

提示词的“逆向工程”&#xff0c;让AI大语言模型帮你反推提示词 一、前言 在日常生活中&#xff0c;我们不时会遇到一些令人惊艳的文本&#xff0c;不论是一篇精彩绝伦的小说、一篇深入浅出的科普文章&#xff0c;还是一篇充满热情的音乐推荐&#xff0c;它们都能在我们的心…...

游戏手柄Type-c方案,支持一边充电一边传输数据

乐得瑞推出LDR6023SS&#xff0c;专门针对USB-C接口手机手柄方案&#xff0c;支持手机快充&#xff0c;支持任天堂游戏机&#xff0c;PS4等设备~同时支持手机充电跟数据传输 1、概述 LDR6023SS SSOP16 是乐得瑞科技针对 USB Type-C 标准中的 Bridge 设备而开发的双 USB-C DRP …...

Vue设计模式到底多少种?

Vue设计模式到底多少种&#xff1f; 很多同学问&#xff0c;Vue到底有多少种设计模式&#xff1f;&#xff1f;各个模式到底是什么意思&#xff1f;&#xff1f;又各自适合什么场景&#xff1f;&#xff1f; 这里我给大家直接说下&#xff0c;Vue的设计模式没有一个固定的数值…...

C++ 中的 std::timed_mutex 和 std::recursive_timed_mutex

1、背景 在多线程编程中&#xff0c;互斥锁&#xff08;Mutex&#xff09;是用于保护共享资源的重要工具。C 标准库提供了多种互斥锁类型&#xff0c;其中 std::timed_mutex 和 std::recursive_timed_mutex 是两种支持超时功能的互斥锁。在阅读FastDDS源码时&#xff0c;发现了…...

HAL库外设宝典:基于CubeMX的STM32开发手册(持续更新)

目录 前言 GPIO&#xff08;通用输入输出引脚&#xff09; 推挽输出模式 浮空输入和上拉输入模式 GPIO其他模式以及内部电路原理 输出驱动器 输入驱动器 中断 外部中断&#xff08;EXTI&#xff09; 深入中断&#xff08;内部机制及原理&#xff09; 外部中断/事件控…...

Kotlin实战经验:将接口回调转换成suspend挂起函数

在 Kotlin 协程中, suspendCoroutine 和 suspendCancellableCoroutine 是用于将回调或基于 future 的异步操作转换成挂起函数。 suspendCoroutine 用途:将回调式异步操作转换为可挂起函数 行为: 启动一个新的协程来处理基于回调的操作挂起当前协程,直到调用回调回调负责…...

银行国际结算

银行国结项目&#xff0c;即国际结算项目&#xff0c;是银行业务中的重要组成部分&#xff0c;它涉及跨国界的货币收付和资金转移。 一、银行国结项目的定义 银行国结项目是指银行为国际贸易、投资等活动提供的国际结算服务&#xff0c;包括各种国际支付和资金清算业务。这些…...

java后端开发day13--面向对象综合练习

&#xff08;以下内容全部来自上述课程&#xff09; 注意&#xff1a;先有javabean&#xff0c;才能创建对象。 1.文字版格斗游戏 格斗游戏&#xff0c;每个游戏角色的姓名&#xff0c;血量&#xff0c;都不相同&#xff0c;在选定人物的时候&#xff08;new对象的时候&#…...

Vue解决父子组件传值,子组件改变值后父组件的值也改变的问题

vue开发过程中&#xff0c;父组件通过props传值给子组件&#xff0c;子组件在页面展示父组件的值&#xff0c;在操作子组件值以后&#xff0c;即使不点击确定按钮&#xff0c;父组件中的值也发生了变化&#xff0c;但是需求是操作子组件数据以后&#xff0c;必须点击"确定…...

【通俗解释,入门级】DeepSeek - R1 - Zero:强化学习提升LLM推理能力的奥秘

DeepSeek - R1 - Zero&#xff1a;强化学习提升LLM推理能力的奥秘 第一节&#xff1a;强化学习在DeepSeek - R1 - Zero中的基本概念与公式解释【通俗解释】 强化学习在DeepSeek - R1 - Zero里就像是一位“聪明的探险家”&#xff0c;在各种可能的推理路径中探索&#xff0c;通…...

《图解设计模式》笔记(六)访问数据结构

十三、Visitor 模式&#xff1a;访问数据结构并处理数据 Visitor&#xff1a;访问者 我们会“处理”在数据结构中保存着的元素&#xff0c;通常把“处理”代码放在表示数据结构的类中。 但每增加一种处理&#xff0c;就不得不去修改表示数据结构的类。 在 Visitor模式中&am…...

windows11上,使用pipx安装Poetry,Poetry的安装路径是什么?

当使用 pipx 安装 Poetry 时&#xff0c;pipx 会将 Poetry 安装到一个独立的虚拟环境中&#xff0c;并将其可执行文件链接到一个集中的目录中。以下是 pipx 安装 Poetry 时的路径信息&#xff1a; 1. Poetry 的安装路径 pipx 会为每个工具&#xff08;如 Poetry&#xff09;创…...

使用 vcpkg 简化 C++ 项目依赖管理

使用 vcpkg 简化 C 项目依赖管理 什么是 vcpkg&#xff1f; vcpkg 是微软推出的跨平台 C/C 包管理工具&#xff0c;支持 Windows/Linux/macOS。它可以帮助开发者&#xff1a; ✅ 一键安装 2000 开源库 ✅ 自动解决依赖关系 ✅ 生成 Visual Studio 集成配置 ✅ 支持自定义编译…...

怎样确定网站访问速度出现问题是后台还是服务器造成的?

网站的访问速度会影响到用户的体验感&#xff0c;当网络过于卡顿或访问速度较慢时&#xff0c;会给用户带来不好的体验感&#xff0c;但是网站访问速度不仅会是后台造成影响的&#xff0c;也可能是服务器的原因&#xff0c;那么我们该如何分辨呢&#xff1f; 当网站使用了数据库…...

【Elasticsearch】管道聚合

管道聚合就是在已有聚合结果之上在进行聚合&#xff0c;管道聚合是针对于聚合的聚合 在 Elasticsearch 中&#xff0c;管道聚合&#xff08;Pipeline Aggregations&#xff09;是一种特殊的聚合类型&#xff0c;用于对其他聚合的结果进行进一步的计算和处理&#xff0c;而不是直…...

CNN-GRU卷积神经网络门控循环单元多变量多步预测,光伏功率预测(Matlab完整源码和数据)

代码地址&#xff1a;CNN-GRU卷积神经网络门控循环单元多变量多步预测&#xff0c;光伏功率预测&#xff08;Matlab完整源码和数据) CNN-GRU卷积神经网络门控循环单元多变量多步预测&#xff0c;光伏功率预测 一、引言 1.1、研究背景和意义 随着全球能源危机和环境问题的日…...

后端java工程师经验之谈,工作7年,mysql使用心得

mysql 工作7年&#xff0c;mysql使用心得 mysql1.创建变量2.创建存储过程2.1&#xff1a;WHILE循环2.2&#xff1a;repeat循环2.3&#xff1a;loop循环2.4&#xff1a;存储过程&#xff0c;游标2.5&#xff1a;存储过程&#xff0c;有输入参数和输出参数 3.三种注释写法4.case …...