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

LLVM 的中间代码(IR) 基本语法

LLVM 的中间代码(IR) 基本语法

以下是 LLVM IR 的基本语法和每个语法的实例代码:

1.数据类型

LLVM IR 支持多种数据类型,包括整型、浮点型、指针型和向量型等。以下是 LLVM IR 中定义不同类型的语法和示例代码:

  • 整型:i1、i8、i16、i32、i64 等,表示不同位数的整数。
; 定义一个 32 位整型变量
%var = alloca i32
  • 浮点型:float、double 等,表示不同位数的浮点数。
; 定义一个 64 位浮点型变量
%var = alloca double
  • 指针型:用于表示内存地址,例如 void*、int* 等。
; 定义一个指向整型的指针变量
%ptr = alloca i32*
  • 向量型:用于表示一组相同类型的值,例如 <4 x i32> 表示包含 4 个 32 位整数的向量。
; 定义一个包含 4 个 32 位整数的向量变量
%vec = alloca <4 x i32>

2.常量

LLVM IR 支持多种常量,包括整型常量、浮点型常量、指针常量和向量常量等。以下是 LLVM IR 中定义不同类型常量的语法和示例代码:

  • 整型常量:用于表示整数值。
; 定义一个整型常量
%i32 = i32 42
  • 浮点型常量:用于表示浮点数值。
; 定义一个浮点型常量
%f64 = double 3.14
  • 指针常量:用于表示内存地址。
; 定义一个指向 i32 类型的指针常量
%i32ptr = i32* inttoptr (i64 0 to i32*)
  • 向量常量:用于表示一组相同类型的值。
; 定义一个包含 4 个 32 位整数的向量常量
%vec = <4 x i32> <i32 1, i32 2, i32 3, i32 4>

3.函数

LLVM IR 中的函数包含函数名称、函数参数、函数返回类型和函数体等。函数体由多个基本块组成。以下是 LLVM IR 中定义函数的语法和示例代码:

; 定义一个名为 'foo' 的函数,参数为 i32 类型,返回值类型为 i32
define i32 @foo(i32 %arg) {
entry:; 函数体由基本块组成,entry 是函数入口基本块%tmp = add i32 %arg, 1ret i32 %tmp
}

4.指令

LLVM IR 中的指令用于执行具体的操作,例如算术运算、逻辑运算、比较、分支等。以下是 LLVM IR 中定义不同类型指令的语法和示例代码:

  • 算术运算指令:用于执行加、减、乘、除等算术运算。
; 定义一个加法指令,将 i32 类型的变量 %a 和 %b 相加
%sum = add i32 %a, %b
  • 逻辑运算指令:用于执行与、或、非等逻辑运算。
; 定义一个逻辑与指令,将 i1 类型的变量 %a 和 %b 做逻辑与操作
%result = and i1 %a, %b
  • 比较指令:用于执行比较操作,例如等于、不等于、大于等。
; 定义一个比较指令,比较 i32 类型的变量 %a 和 %b 是否相等
%eq = icmp eq i32 %a, %b
  • 分支指令:用于实现条件分支。
; 定义一个分支指令,如果 %condition 为真,则跳转到 label1,否则跳转到 label2
br i1 %condition, label %label1, label %label2
  • 加载/存储指令:用于实现内存读写操作。
; 定义一个存储指令,将 i32 类型的变量 %value 存储到指针变量 %ptr 指向的内存地址中
store i32 %value, i32* %ptr; 定义一个加载指令,将指针变量 %ptr 指向的内存地址中的值读取出来,并存储到 i32 类型的变量 %value 中
%value = load i32, i32* %ptr

5. 全局变量

LLVM IR 中的全局变量是在函数外定义的变量,可以在整个程序中访问。以下是 LLVM IR 中定义全局变量的语法和示例代码:

; 定义一个名为 'global_var' 的全局变量,类型为 i32,初始值为 0
@global_var = global i32 0; 访问全局变量
%value = load i32, i32* @global_var

6.注释

LLVM IR 中的注释以分号(;)开头,可以在代码中添加注释来解释代码的含义。以下是 LLVM IR 中添加注释的示例代码:

; 这是一条注释,用于解释下面的代码含义
%sum = add i32 %a, %b ; 这也是一条注释

7.函数定义和调用

在 LLVM IR 中定义函数和调用函数都非常简单。以下是定义函数和调用函数的语法和示例代码:

; 定义一个名为 'add' 的函数,返回类型为 i32,参数为 i32 类型的变量 %a 和 %b
define i32 @add(i32 %a, i32 %b) {; 函数体%sum = add i32 %a, %bret i32 %sum
}; 调用函数 'add',将参数 %x 和 %y 传递给函数,并将返回值存储到变量 %result 中
%x = 10
%y = 20
%result = call i32 @add(i32 %x, i32 %y)

8.强制类型转换

在 LLVM IR 中,可以使用强制类型转换来将一个类型转换为另一个类型。以下是强制类型转换的语法和示例代码:

; 定义一个 i32 类型的变量 %a
%a = i32 10; 将变量 %a 转换为 i64 类型,并存储到变量 %b 中
%b = sext i32 %a to i64

9.组合类型

在 LLVM IR 中,可以使用组合类型来表示复杂的数据结构。以下是 LLVM IR 中定义组合类型的语法和示例代码:

; 定义一个结构体类型,包含两个字段:i32 类型的变量 %a 和 i64 类型的变量 %b
%my_struct = type { i32, i64 }; 定义一个名为 'my_var' 的全局变量,类型为结构体类型 %my_struct,初始值为 { 10, 20 }
@my_var = global %my_struct { i32 10, i64 20 }

10.获取地址

在 LLVM IR 中,可以使用 & 操作符获取变量的地址。以下是获取变量地址的语法和示例代码:

; 定义一个名为 'my_var' 的全局变量,类型为 i32,初始值为 10
@my_var = global i32 10; 获取变量 'my_var' 的地址,并存储到变量 %ptr 中
%ptr = getelementptr i32, i32* @my_var, i32 0, i32 0

11.定义别名

在 LLVM IR 中,可以使用别名来引用其他变量或函数。以下是定义别名的语法和示例代码:

; 定义一个名为 'my_var' 的全局变量,类型为 i32,初始值为 10
@my_var = global i32 10; 定义一个名为 'my_alias' 的别名,引用全局变量 'my_var'
@my_alias = alias i32* @my_var

12.分支和循环

在 LLVM IR 中,可以使用分支和循环指令来实现控制流。以下是分支和循环指令的语法和示例代码:

; 定义一个名为 'my_func' 的函数,返回类型为 void,没有参数
define void @my_func() {; 定义一个标签 'entry'entry:; 定义一个 i32 类型的变量 %i,初始值为 0%i = alloca i32store i32 0, i32* %i; 定义一个标签 'loop'loop:; 加载变量 %i 的值,并将其加 1%i_val = load i32, i32* %i%next_i = add i32 %i_val, 1; 将计算后的值存储到变量 %i 中store i32 %next_i, i32* %i; 如果 %i 的值小于 10,则跳转到标签 'loop'%cond = icmp slt i32 %next_i, 10br i1 %cond, label %loop, label %exit; 定义一个标签 'exit'exit:ret void
}

13.内存操作

在 LLVM IR 中,可以使用 load 和 store 指令来进行内存读写操作。以下是 load 和 store 指令的语法和示例代码:

; 定义一个 i32 类型的全局变量 %my_var,初始值为 10
@my_var = global i32 10; 将全局变量 %my_var 的值加载到变量 %val 中
%val = load i32, i32* @my_var; 将变量 %new_val 的值存储到全局变量 %my_var 中
%new_val = add i32 %val, 5
store i32 %new_val, i32* @my_var

14.数组和指针

在 LLVM IR 中,可以使用数组和指针来处理数据。以下是数组和指针的语法和示例代码:

; 定义一个名为 'my_func' 的函数,返回类型为 i32,有一个指向 i32 类型的数组的指针参数 %arr
define i32 @my_func(i32* %arr) {; 获取数组第 0 个元素的地址,并将其存储到变量 %arr_ptr 中%arr_ptr = getelementptr i32, i32* %arr, i32 0; 将数组第 0 个元素的值加载到变量 %val 中%val = load i32, i32* %arr_ptr; 返回变量 %val 的值ret i32 %val
}; 定义一个名为 'my_arr' 的全局数组,包含三个 i32 类型的元素
@my_arr = global [3 x i32] [i32 10, i32 20, i32 30]; 调用函数 'my_func',将数组 'my_arr' 的首地址传递给函数,并将返回值存储到变量
%result = call i32 @my_func(i32* getelementptr inbounds ([3 x i32], [3 x i32]* @my_arr, i32 0, i32 0)); 输出变量 %result 的值
; 注意:此处的 'i32' 表示要输出的值为 32 位整数
;       如果要输出其他类型的值,需要相应地修改 'i32' 为其他类型
;       例如:float 表示单精度浮点数,double 表示双精度浮点数,等等
;       如果要输出字符串,则需要使用 'string' 类型
;       例如:%fmt_str = constant [14 x i8] c"result: %d\n\00"
;             call i32 (i8*, ...) @printf(i8* %fmt_str, i32 %result)
;       其中,'...' 表示可变参数,'i8*' 表示字符串的地址,%fmt_str 表示字符串变量的名称
%fmt_str = constant [9 x i8] c"%d\n\00"
call i32 (i8*, ...) @printf(i8* %fmt_str, i32 %result)

15.结构体

在 LLVM IR 中,可以使用结构体来组织数据。以下是结构体的语法和示例代码:

; 定义一个名为 'Person' 的结构体,包含两个字段:'name' 和 'age'
%Person = type { i8*, i32 }; 定义一个名为 'my_func' 的函数,返回类型为 i32,有一个指向 'Person' 结构体的指针参数 %person_ptr
define i32 @my_func(%Person* %person_ptr) {; 获取结构体第 1 个字段 'age' 的地址,并将其存储到变量 %age_ptr 中%age_ptr = getelementptr %Person, %Person* %person_ptr, i32 0, i32 1; 将结构体第 1 个字段 'age' 的值加载到变量 %age 中%age = load i32, i32* %age_ptr; 返回变量 %age 的值ret i32 %age
}; 定义一个名为 'my_person' 的全局结构体变量,包含两个字段:'name' 和 'age'
@my_person = global %Person { i8* getelementptr inbounds ([6 x i8], [6 x i8]* @name_str, i32 0, i32 0), i32 20 }; 调用函数 'my_func',将结构体 'my_person' 的首地址传递给函数,并将返回值存储到变量 %result 中
%result = call i32 @my_func(%Person* @my_person); 输出变量 %result 的值
%fmt_str = constant [9 x i8] c"%d\n\00"
call i32 (i8*, ...) @printf(i8* %fmt_str, i32 %result); 定义一个名为 'name_str' 的全局字符串,用于初始化结构体 'my_person' 中的 'name' 字段
@name_str = private unnamed_addr constant [6 x i8] c"John

16.全局变量

在 LLVM IR 中,可以使用全局变量来在函数之间共享数据。以下是全局变量的语法和示例代码:

; 定义一个名为 'my_global_var' 的全局变量,类型为 i32,初始值为 10
@my_global_var = global i32 10; 定义一个名为 'my_func' 的函数,返回类型为 i32,无参数
define i32 @my_func() {; 加载全局变量 'my_global_var' 的值到变量 %var 中%var = load i32, i32* @my_global_var; 将变量 %var 的值乘以 2%var_times_2 = mul i32 %var, 2; 将变量 %var_times_2 的值存储到全局变量 'my_global_var' 中store i32 %var_times_2, i32* @my_global_var; 返回变量 %var_times_2 的值ret i32 %var_times_2
}; 调用函数 'my_func',将返回值存储到变量 %result 中
%result = call i32 @my_func(); 输出变量 %result 的值
%fmt_str = constant [9 x i8] c"%d\n\00"
call i32 (i8*, ...) @printf(i8* %fmt_str, i32 %result)

17.运算符

在 LLVM IR 中,支持各种算术运算符、位运算符、比较运算符和逻辑运算符。以下是运算符的语法和示例代码:

; 算术运算符
%a = add i32 1, 2           ; %a = 1 + 2 = 3
%b = sub i32 5, 3           ; %b = 5 - 3 = 2
%c = mul i32 2, 3           ; %c = 2 * 3 = 6
%d = sdiv i32 10, 3         ; %d = 10 / 3 = 3(整数除法)
%e = fadd double 1.0, 2.0   ; %e = 1.0 + 2.0 = 3.0(双精度浮点数加法)
%f = fsub float 5.0, 3.0    ; %f = 5.0 - 3.0 = 2.0(单精度浮点数减法)
%g = fmul double 2.0, 3.0   ; %g = 2.0 * 3.0 = 6.0(双精度浮点数乘法)
%h = fdiv float 10.0, 3.0   ; %h = 10.0 / 3.0 ≈ 3.3333(单精度浮点数除法); 位运算符
%i = shl i32 1, 2           ; %i = 1 << 2 = 4(左移 2 位)
%j = shr i32 8, 2           ; %j = 8 >> 2 = 2(右移
; 比较运算符
%k = icmp eq i32 1, 2       ; %k = 1 == 2(相等性比较),结果为 i1 类型
%l = icmp slt i32 3, 4      ; %l = 3 < 4(有符号整数小于比较),结果为 i1 类型
%m = fcmp olt float 1.0, 2.0 ; %m = 1.0 < 2.0(有序单精度浮点数小于比较),结果为 i1 类型; 逻辑运算符
%n = and i1 1, 0            ; %n = 1 & 0 = 0(逻辑与),结果为 i1 类型
%o = or i1 1, 0             ; %o = 1 | 0 = 1(逻辑或),结果为 i1 类型
%p = xor i1 1, 0            ; %p = 1 ^ 0 = 1(逻辑异或),结果为 i1 类型
%q = icmp eq i1 %n, %o      ; %q = %n == %o(相等性比较),结果为 i1 类型

18.控制流

在 LLVM IR 中,支持各种控制流语句,如条件语句、循环语句和跳转语句。以下是控制流语句的语法和示例代码:

; 条件语句
define i32 @max(i32 %a, i32 %b) {%max = phi i32 [ %a, %entry ], [ %b, %if_true ]%cmp = icmp sgt i32 %a, %bbr i1 %cmp, label %if_true, label %if_falseif_true:br label %mergeif_false:br label %mergemerge:%result = phi i32 [ %a, %if_false ], [ %b, %if_true ]ret i32 %result
}; 循环语句
define i32 @sum(i32 %n) {%sum = alloca i32store i32 0, i32* %sumbr label %looploop:%i = phi i32 [ 0, %entry ], [ %next_i, %loop_body ]%acc = phi i32 [ 0, %entry ], [ %next_acc, %loop_body ]%cmp = icmp slt i32 %i, %nbr i1 %cmp, label %loop_body, label %exitloop_body:%next_i = add i32 %i, 1%next_acc = add i32 %acc, %ibr label %loopexit:%result = load i32, i32* %sumret i32 %result
}; 跳转语句
define void @foo() {br label %looploop:%i = phi i32 [ 0, %entry ], [ %next_i, %loop_body ]%cmp = icmp eq i32 %i, 10br i1 %cmp, label %exit, label %loop_body

19.全局变量和常量

在 LLVM IR 中,可以定义全局变量和常量,以下是全局变量和常量的语法和示例代码:

; 定义全局变量
@global_var = global i32 0; 定义全局常量
@global_const = constant [12 x i32] [i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12]define i32 @access_global_var() {%ptr = getelementptr i32, i32* @global_var, i32 0%val = load i32, i32* %ptrret i32 %val
}define i32* @access_global_const() {%ptr = getelementptr [12 x i32], [12 x i32]* @global_const, i32 0, i32 0ret i32* %ptr
}

20.函数

在 LLVM IR 中,可以定义函数,并为函数指定参数和返回值类型,以下是函数的语法和示例代码:

; 定义函数
define i32 @add(i32 %a, i32 %b) {%result = add i32 %a, %bret i32 %result
}; 调用函数
define i32 @foo() {%a = add i32 1, 2%b = add i32 %a, 3%c = call i32 @add(i32 %a, i32 %b)ret i32 %c
}

21.异常处理

在 LLVM IR 中,也支持异常处理,以下是异常处理的语法和示例代码:

; 异常处理
define void @test() personality i32 (...)* @__gxx_personality_v0 {
entry:invoke void @foo() to label %exit unwind label %catchcatch:%exn = landingpad { i8*, i32 }catch i8* bitcast (i8** @typeinfo to i8*)%ptr = extractvalue { i8*, i32 } %exn, 0%msg = call i8* @__cxa_demangle(i8* %ptr, i8* null, i32* null, i32* null)call void @puts(i8* %msg)call void @free(i8* %msg)resume { i8*, i32 } %exnexit:ret void
}declare i8* @__cxa_demangle(i8*, i8*, i32*, i32*)
declare void @puts(i8*)
declare void @free(i8*)
declare i8** @typeinfo

以上是 LLVM IR 的基本语法和示例代码,当然还有更多高级的语法和技巧可以使用。

相关文章:

LLVM 的中间代码(IR) 基本语法

LLVM 的中间代码&#xff08;IR&#xff09; 基本语法 以下是 LLVM IR 的基本语法和每个语法的实例代码&#xff1a; 1.数据类型 LLVM IR 支持多种数据类型&#xff0c;包括整型、浮点型、指针型和向量型等。以下是 LLVM IR 中定义不同类型的语法和示例代码&#xff1a; 整…...

多标签在单行出现省略的实现

简言 实现在有宽度的一行内&#xff0c;标签过多会出现省略号。 实现 首先要实现单行省略的效果。 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content&quo…...

第二十七章 纹理总结

OpenGL 纹理是左下角(0,0) 右上角(1,1)。 需要告诉OpenGL纹理环绕方式,主要有四种:GL_REPEAT(重复纹理图像),GL_MIRRORED_REPEAT(重复纹理图像,但是每次重复图片是镜像放置的), GL_CLAMP_TO_EDGE(坐标再0-1直接,超出部分会重复纹理坐标的边缘,有边缘拉伸效果),GL…...

【Linux面试】-(腾讯,百度,美团,滴滴)

文章目录Linux 面试题-(腾讯,百度,美团,滴滴) 分析日志 t.log(访问量)&#xff0c;将各个 ip 地址截取&#xff0c;并统计出现次数,并按从大到小排序(腾讯) http://192.168.200.10/index1.html http://192.168.200.10/index2.html http://192.168.200.20/index1.html http://19…...

编译链接和预处理

&#x1f33a;在本次的博客当中我们可以一起来学习一下C语言的编译链接以及预处理的知识。 &#x1f33a;要谈到C语言的编译和链接就肯定得从我们C语言程序运行的时候所产生的诸多的文件类型了。我们正常情况下编辑书写代码的文件为 .c 文件&#xff0c;我们的 .c 文件通过遍历…...

基于sprinmgboot实现实习管理系统的设计【源码+论文】

基于sprinmgboot实习管理系统的设计与实现演示摘要 随着信息化时代的到来&#xff0c;管理系统都趋向于智能化、系统化&#xff0c;实习管理也不例外&#xff0c;但目前国内仍都使用人工管理&#xff0c;市场规模越来越大&#xff0c;同时信息量也越来越庞大&#xff0c;人工管…...

动态规划入门

前言&#xff1a;首先&#xff0c;什么是动态规划&#xff1f; 动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中&#xff0c;可能会有许多可行解。每一个解都对应于一个值&#xff0c;我们希望找到具有最优值的解。动态规划算法与分治法类似&#xff0c;其基本思…...

day26 SpringBootWeb案例(二)

目录 SpringBootWeb案例 1. 新增员工 1.1 需求 1.2 开发 1.3 测试 2. 文件上传 2.1 简介 2.2 本地存储 2.3 阿里云OSS 3. 配置文件 3.1 Value 3.2 yml配置 3.3 ConfigurationProperties 4. 修改员工 4.1 需求 4.2 查询回显 4.3 保存修改 SpringBootWeb案例 前…...

力扣-《剑指offer》-哈希表-刷题笔记

目录 第一题&#xff1a;03.数组中重复的数字 第二题&#xff1a;39.数组中出现次数超过一半的数字 第三题&#xff1a;50.第一个只出现一次的字符 第四题&#xff1a;53. &#xff08;0-n-1&#xff09;中缺失的数字 第一题&#xff1a;03.数组中重复的数字 我的答案&…...

【SpringBoot】| 邮箱发送验证码,你会了吗?

目录&#x1f981; 题外话&#x1f981; 提前准备2.1 配置邮箱第三方登录2.1.1 点击设置——账户2.1.2 开启POP3/SMTP服务2.2 添加依赖2.3 yaml配置&#x1f981; 进入主题&#x1f981; 测试使用&#x1f981; 尾声3.1 安利一个生成验证码的工具类3.1.1 添加依赖3.1.2 编写配置…...

Linux系统安装部署及配置Grafana

TOC 用于 UI 展示 wget https://dl.grafana.com/oss/release/grafana-8.0.3-1.x86_64.rpm1 安装 grafana 1.1 下载安装 wget https://dl.grafana.com/oss/release/grafana-8.0.3-1.x86_64.rpmsudo yum install grafana-8.0.3-1.x86_64.rpm1.2 启动&状态查看 sudo syst…...

Python3 入门教程||Python3 输入和输出||Python3 File 方法

Python3 输入和输出 在前面几个章节中&#xff0c;我们其实已经接触了 Python 的输入输出的功能。本章节我们将具体介绍 Python 的输入输出。 输出格式美化 Python 两种输出值的方式: 表达式语句和 print() 函数。(第三种方式是使用文件对象的 write() 方法; 标准输出文件可以…...

有效的字母异位词(力扣刷题)

给定两个字符串 s 和 t &#xff0c;编写一个函数来判断 t 是否是 s 的字母异位词。 示例 1: 输入: s "anagram", t "nagaram" 输出: true 示例 2: 输入: s "rat", t "car" 输出: false 说明: 你可以假设字符串只包含小写字母。 …...

73、介绍下 HashMap 的底层数据结构

73、介绍下 HashMap 的底层数据结构 我们现在用的都是 JDK 1.8&#xff0c;底层是由“数组链表红黑树”组成&#xff0c;如下图&#xff0c;而在 JDK 1.8 之前是由“数组链表”组成。 1.Hash Hash叫做”散列表“&#xff0c;就是把任意长度的输入&#xff0c;通过散列算法&am…...

系统集成路由器OSPF动态、综合路由配置

实验任务&#xff1a;动态路由协议RIP、OSPF协议的内容和特点动态路由RIP、OSPF实验&#xff0c;建立拓扑pc1>>R1>>R2>>R3>>pc2&#xff0c;使pc1与pc2能相互通信&#xff0c;并配置PC端静默接口。熟悉配置vlan间路由技术&#xff1a;多层交换机虚拟接…...

【力扣周赛 338】

6354. K 件物品的最大和 - 力扣&#xff08;Leetcode&#xff09;袋子中装有一些物品&#xff0c;每个物品上都标记着数字 1、0或 -1。给你四个非负整数 numOnes、numZeros、numNegOnes和 k。袋子最初包含&#xff1a;numOnes 件标记为 1 的物品。numZeroes 件标记为 0 的物品。…...

大数据Flink进阶(八):Apache Flink架构介绍

Apache Flink架构介绍 一、Flink组件栈 在Flink的整个软件架构体系中,同样遵循这分层的架构设计理念,在降低系统耦合度的同时,也为上层用户构建Flink应用提供了丰富且友好的接口。...

Mars3d项目启动上的一些坑

前言 最近新入职了一家公司&#xff0c;公司新开了有个未来城市的项目&#xff0c;需要用到3D城市建模&#xff0c;公司老总选了Mars3d作为前端框架&#xff0c;项目分给我了&#xff0c;又是一个全新的领域&#xff0c;开搞吧&#xff01; 下面是自己遇到的几个小问题&#x…...

通俗易懂【Springboot】 单文件下载和批量下载(多个文件合成一个压缩包下载)

文章目录一.单文件下载1.简单理解文件下载2.单文件下载的具体代码实现3.测试4.单文件下载整体代码二.多文件批量下载&#xff08;多个文件合成一个压缩包下载&#xff09;1.多文件下载的实现方式&#xff0c;这里使用了ZipOutputStream2.具体代码实现3.测试4.文件批量下载&…...

CnOpenData中国行政区划shp数据

一、数据简介 中国行政区划数据是重要的基础地理信息数据&#xff0c;目前不同来源的全国行政区划数据非常多&#xff0c;但能够开放获取的高质量行政区域数据少之又少。基于此&#xff0c;锐多宝的地理空间制作一套2013-2023年可开放获取的高质量行政区划数据。该套数据以2022…...

GPT-4零失误通关大厂模拟面试,offer拿到手软?与AGI首次接触

来源: FoxyearMeta “GPT-4可被视作AGI &#xff08;通用人工智能&#xff09;的早期版本。” 如若从他人口中说出&#xff0c;或许是无稽之谈—— 但是由微软雷蒙德研究院机器学习理论组负责人万引大神Sbastien Bubeck与2023新视野数学奖得主Ronen Eldan、2023新晋斯隆研究奖得…...

Hardhat 环境搭建及教程示例

一.安装node.js curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash nvm install 18 nvm use 18 nvm alias default 18 npm install npm --global # Upgrade npm to the latest version 二. 安装hardhat 2.1 创建hardhat安装目录 mkdir hard…...

复杂链表的复制-剑指Offer35-java

一、题目描述 请实现 copyRandomList 函数&#xff0c;复制一个复杂链表。在复杂链表中&#xff0c;每个节点除了有一个 next 指针指向下一个节点&#xff0c;还有一个 random 指针指向链表中的任意节点或者 null。 示例 1&#xff1a; 输入&#xff1a;head [[7,null],[13,…...

【Linux】进程理解与学习Ⅰ-进程概念

环境&#xff1a;centos7.6&#xff0c;腾讯云服务器Linux文章都放在了专栏&#xff1a;【Linux】欢迎支持订阅&#x1f339;相关文章推荐&#xff1a;【Linux】冯.诺依曼体系结构与操作系统进程概念什么是进程&#xff1f;进程是什么&#xff1f;我们打开任务管理器可以看到有…...

WebKitX ActiveX 6.0 X86 Crack

WebKitX ActiveX将 Chromium Embedded Framework (CEF3) 包装到一个进程外的 ActiveX 组件中&#xff0c;以便与 OLE/COM 语言一起使用。Chromium Embedded Framework 封装了 WebKit Blink HTML5 Renderer 和 Google V8 JavaScript Engine。这是一个用于商业用途的生产级稳定组…...

开源项目:数据库表结构生成文档工具

目录 一、软件介绍 二、技术框架 三、功能介绍 四、代码展示 1、获取数据库信息部分代码 2、导出Html文档代码 五、运行效果 六、项目开源地址 一、软件介绍 今天给大家分享我自己编写的数据库表结构文档生成工具&#xff0c;方便大家在实际开发当中&#xff0c;可以很方便导出…...

spring的两种拦截器HandlerIntercepter和MethodIntercepter

介绍 Spring有两种拦截器提供给我们使用&#xff0c;一种是HandlerIntercepter&#xff0c;另一种是MethodIntercepter。这两种的来源不同&#xff0c;实现方式也不同&#xff0c;具体的下面来看一下。 HandlerIntercepter 来源 来源于spring-webmvc包 HandlerIntercepter拦…...

初级算法-字符串

主要记录算法和数据结构学习笔记&#xff0c;新的一年更上一层楼&#xff01; 初级算法-字符串一、反转字符串二、反转字符串&#xff08;二&#xff09;三、替换空格四、翻转字符串里的单词五、左旋转字符串六、实现 strStr()七、重复的子字符串字符串中元素只能是字符String…...

华为OD机试题 - 寻找目标字符串(JavaScript)| 机考必刷

更多题库,搜索引擎搜 梦想橡皮擦华为OD 👑👑👑 更多华为OD题库,搜 梦想橡皮擦 华为OD 👑👑👑 更多华为机考题库,搜 梦想橡皮擦华为OD 👑👑👑 最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为…...

删除Terminating状态的namespace:cattle-system

这里以cattle-system为例&#xff01;执行删除命令后namespace&#xff08;也是用其他k8s object&#xff09;仍然存在&#xff0c;首先执行 kubectl edit namespace cattle-system 查看是否存在spec.finalizers: kubernetes&#xff0c;如&#xff1a; spec: finalizers:…...