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 的中间代码(IR) 基本语法 以下是 LLVM IR 的基本语法和每个语法的实例代码: 1.数据类型 LLVM IR 支持多种数据类型,包括整型、浮点型、指针型和向量型等。以下是 LLVM IR 中定义不同类型的语法和示例代码: 整…...

多标签在单行出现省略的实现
简言 实现在有宽度的一行内,标签过多会出现省略号。 实现 首先要实现单行省略的效果。 <!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(访问量),将各个 ip 地址截取,并统计出现次数,并按从大到小排序(腾讯) http://192.168.200.10/index1.html http://192.168.200.10/index2.html http://192.168.200.20/index1.html http://19…...

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

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

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

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》-哈希表-刷题笔记
目录 第一题:03.数组中重复的数字 第二题:39.数组中出现次数超过一半的数字 第三题:50.第一个只出现一次的字符 第四题:53. (0-n-1)中缺失的数字 第一题:03.数组中重复的数字 我的答案&…...

【SpringBoot】| 邮箱发送验证码,你会了吗?
目录🦁 题外话🦁 提前准备2.1 配置邮箱第三方登录2.1.1 点击设置——账户2.1.2 开启POP3/SMTP服务2.2 添加依赖2.3 yaml配置🦁 进入主题🦁 测试使用🦁 尾声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 输入和输出 在前面几个章节中,我们其实已经接触了 Python 的输入输出的功能。本章节我们将具体介绍 Python 的输入输出。 输出格式美化 Python 两种输出值的方式: 表达式语句和 print() 函数。(第三种方式是使用文件对象的 write() 方法; 标准输出文件可以…...
有效的字母异位词(力扣刷题)
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。 示例 1: 输入: s "anagram", t "nagaram" 输出: true 示例 2: 输入: s "rat", t "car" 输出: false 说明: 你可以假设字符串只包含小写字母。 …...

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

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

【力扣周赛 338】
6354. K 件物品的最大和 - 力扣(Leetcode)袋子中装有一些物品,每个物品上都标记着数字 1、0或 -1。给你四个非负整数 numOnes、numZeros、numNegOnes和 k。袋子最初包含:numOnes 件标记为 1 的物品。numZeroes 件标记为 0 的物品。…...

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

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

通俗易懂【Springboot】 单文件下载和批量下载(多个文件合成一个压缩包下载)
文章目录一.单文件下载1.简单理解文件下载2.单文件下载的具体代码实现3.测试4.单文件下载整体代码二.多文件批量下载(多个文件合成一个压缩包下载)1.多文件下载的实现方式,这里使用了ZipOutputStream2.具体代码实现3.测试4.文件批量下载&…...

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

龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...

【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度
文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
第7篇:中间件全链路监控与 SQL 性能分析实践
7.1 章节导读 在构建数据库中间件的过程中,可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中,必须做到: 🔍 追踪每一条 SQL 的生命周期(从入口到数据库执行)&#…...

【深度学习新浪潮】什么是credit assignment problem?
Credit Assignment Problem(信用分配问题) 是机器学习,尤其是强化学习(RL)中的核心挑战之一,指的是如何将最终的奖励或惩罚准确地分配给导致该结果的各个中间动作或决策。在序列决策任务中,智能体执行一系列动作后获得一个最终奖励,但每个动作对最终结果的贡献程度往往…...