- 博客(46)
- 收藏
- 关注
原创 C/C++:06. 模板
C++的模板是被迫推出的,最直接的动力来源于对数据结构的封装。数据结构关乎的是数据的存储,以及存储后如何进行增加、删除、修改和查询操作,在实际开发中有着非常广泛的应用。C++开发者们希望为线性表、链表、图、树等常见的数据结构都定义一个类,并把它们加入到标准库中,这样以后程序员就不用重复造轮子了,直接拿来就可以使用。
2023-07-16 20:05:46
373
原创 C/C++:02 2/2. 类和对象
来拼接字符串时,运算符的两边可以都是string字符串,也可以是一个string字符串和一个C风格字符串,还可以是一个string字符串和一个字符数组,或者是一个string字符串和一个字符。例如将类B声明为类A的友元类,那么类B中的所有成员函数都是类A的友元函数,可以访问类A的所有成员,包括public、protected、private属性的。const 成员变量的用法和普通const变量的用法类似,只需要在声明时加上const关键字,初始化const成员变量唯一的方法:构造函数的初始化列表。
2023-06-19 15:36:17
837
原创 C/C++:02 1/2. 类和对象
类通常定义在函数的外面;public://成员变量char* name;int age;//成员函数void say()注意类定义最后有一个分号;,它是类定义的一部分,表示类定义结束了,不能省略。类只是一个模板(Template),编译后不占内存空间,所以在定义类时不能队成员变量进行初始化,因为没有地方存储数据。只有在创建对象以后才会给成员变量分配内存,这个时候就可以赋值了。类体中定义类体中定义成员函数时,不需要在函数名前面加上类名。类外定义。
2023-06-19 15:34:40
611
原创 Git的基本操作
添加用户名 和 email git config --global user.name "Your Name" git config --global user.email "email@example.com"如果没有添加邮箱和用户名, 后面的操作都是不能够顺利进行的。
2023-06-02 13:07:18
1214
1
原创 C/C++:03. 继承和派生
继承和派生是同一回事,继承是站在子类的角度,派生是站在父类的角度。class 派生类名: [ 继承方式 ] 基类名 {派生类新增加的成员 };
2023-05-19 17:31:48
317
原创 C/C++:04. 多态和虚函数
本节阐述C++中的多态(polymorphism)和虚函数(virtual function),首先来阐明一下什么是多态。C++中的多态指通过一个基类的指针或引用来调用其派生类对象的函数,从而实现对不同子类对象的不同处理。基类指针指指向最原始那个类对象的指针。虚函数是C++中一种函数的声明方式,虚函数就是为了解决当一个基类指针调用派生子类对象函数的时候,执行的是派生子类对象的函数和参数,而不是基类的。使用了虚函数之后,我们就可以通过定义一个。
2023-05-17 21:28:38
626
原创 C/C++:01. C过渡到C++
C++ 读作“C加加”,是“C Plus Plus”的简称。顾名思义,C++ 是在C语言的基础上增加新特性,玩出了新花样,所以叫“C Plus Plus”。随着 C++ 的流行,它的语法也越来越强大,已经能够很完善的支持面向过程编程、面向对象编程(OOP)和泛型编程,几乎成了一门独立的语言,拥有了自己的编译方式。所以C和C++真正分家了。name是命名空间的名字,它里面可以包含变量、函数、类、typedef、#define等,最后由{ }包围。
2023-05-17 16:41:49
972
原创 clang 01.clang简介
Clang的官方网站是 http://clang.llvm.org,它被认为是C家族的LLVM前端。前端(由Clang程序库实现)。编译器驱动器(由Clang命令和Clang驱动器程序库实现)。实际的编译器(由clang -cc1 命令实现)。clang -cc1中的编译器不单用Clang程序库实现,还大量用到了LLVM程序库来实现编译器的中端和后端,还有集成的汇编器。本章中主要将clang作为前端,并使用它的程序库构建自己的编译器。
2023-05-15 17:32:26
762
原创 数据结构:4.各种排序总结
排序是将一组元素,重新排列成按关键字有序的序列。排序的稳定性:如果序列中有两个相同的关键字,排序之后这两个关键字的顺序没有发生变化,说明该排序是稳定的,否则排序是不稳定的。内部排序和外部排序:待排序列存放在计算机随机存储器中进行排序的过程(也就是内存中进行的排序)叫内部排序,如果待排的序列非常大,某一时刻只允许序列中的部分在内存中,需要借助外存来排序,叫外部排序。下面记录各种排序的实现,方便日后查阅。
2023-04-24 10:47:11
95
原创 LLVM IR:1.IR高级结构(High Level Structure)
LLVM是一个基于SSA(单静态赋值)表示,它是高度灵活、可扩展和优化的编译器基础设施。什么是SSA(单静态赋值):SSA(Static Single Assignment)是一种中间表示形式。在SSA中,每个变量只能被赋值一次,并且每个赋值都有一个唯一的定义点。这样每个变量的使用都能追踪到它的唯一定义点,因此,编译器可以更容易进行优化。在 SSA 中,每个变量都是一个不可变的值,因为它只被定义一次。如果需要修改一个变量的值,就必须将其赋值给一个新的变量。
2023-04-22 11:21:35
514
原创 LLVM IR:2.IR类型体系(Type System)
llvm 的类型体系是IR语法中很重要的一部分,中间代码类型化可以使得许多优化在IR层面进行,不需要在转换之前做额外的分析,强类型系统可以更加轻松地读取生成的代码,并支持对正常的三地址码表示以及新颖的分析和转换。
2023-04-22 11:19:30
765
原创 数据结构:2.树的遍历算法
本文中主要讲述一棵二叉树的遍历,首先分为前序、中序、后序和层次遍历,前序、中序和后序遍历分为递归遍历和非递归遍历。先序:根---->左---->右中序:左---->根---->右后序:左---->右---->根
2023-04-09 17:52:17
233
原创 数据结构:1.线性表、栈和队列的存储结构
顺序存储结构:顺序表的特点就是存储空间连续分配,可以静态分配也可以动态分配。链式存储结构:链式存储结构的特点是存储空间可以不连续也可以连续,链式存储结构可以分为单链表、双链表、循环链表和静态链表。2.栈和队列其实也是特殊的线性表,它们在逻辑上来说都是顺序存储的,物理存储可以静态分配也可以动态分配;唯一的区别就是运算的不同,普通的线性表增删改查可以操作在任意地方,但是栈和队列不行,栈的插入、删除和查看只能在栈头进行(先进后出);队列的插入在队尾进行,删除在对头进行(先进先出)。
2023-04-09 15:48:04
260
原创 Ubuntu扩展存储合理分配swap分区
我们在Ubuntu上运行某些大型游戏或者编译一些工程代码的时候,往往会遇到内存或外部存储不够导致编译不成功,例如编译LLVM时需要比较大的内存。我自己在虚拟机上傻瓜式安装了Ubuntu20,自动分配外存:30GB,内存4GB,单核心的两个处理器,编译llvm到一半就报内存不够(也有可能是swap分区太小),,如下图,Memory分配了8GB,swap分区10GB,还是没有够用。本文中将介绍如何更改Ubuntu的存储空间、调整swap分区大小。
2023-03-31 09:10:22
3835
原创 LLVM IRBuilder and pass:3.创建一个selfpass
Pass是LLVM中很重要的部分。它处理的对象时IR代码。LLVM对代码的分析、转换和优化等处理工作都是通过pass来做的。LLVM以流水线的方式把各个Pass组合起来,让它们成为一个有序的流程。LLVM Pass可以处理的对象有模块(Module)、函数(function)、循环(Loop),甚至函数调用栈(Function Call Graph)等等。
2023-03-30 17:37:37
369
原创 ssh远程连接Ubuntu(局域网和非局域网)
我们通常使用ssh连接虚拟机中的Ubuntu,方便学习。但是当在项目中遇到远程控制主机的时候,发现ssh连接不到外网主机,如果使用向日葵或者别的工具,有时候很卡顿。这时候使用内网穿透就可以实现在非局域网ssh远程控制主机的目的。且学且分享。
2023-03-29 11:54:30
10446
4
原创 LLVM IRBuilder and pass:2/2.通过llvm提供的api和IRBuilder生成LLVM-IR
所以,要创建爱你一条乘法运算指令,我们首先要得到两个操作数,他们可以来自于函数的参数、数值变量、数值常量等等。接下来的每一个参数都是一个数组,代表了每一个分支及其对应的返回值。我们知道,一个if-else语句包含了一个条件判断和两个逻辑分支,至于最终会运行哪个分支的代码,取决于条件判断的结果为真还是假。while循环和for循环比较类似,循环的次数取决于判断结果,它们也都用到了比较指令、跳转指令、栈上的变量等。以上的IR代码中,变量%multiplyResult就是乘法运算的结果了,也是函数的返回值。
2023-03-22 10:47:23
331
原创 IIS上部署Django+vue-element-admin-master
教程基于Windows server2012+Python3.8+IIS之上部署django的,同样适用于server2012之上的版本服务器和windows7以上的windows操作系统。提示:以下是本篇文章正文内容,下面案例可供参考暂时先这样。
2023-03-20 20:59:11
531
转载 编译原理总结
1.编译:将高级语言编写的源程序翻译成等价的机器语言或汇编语言。2.解释:将高级语言编写的源程序翻译一句执行一句,不生成目标文件,直接执行源代码文件。3.汇编:用汇编语言编写的源程序翻译成与之等价的机器语言。1.产生式规则1)定义:一个产生式规则是一个有序对(A,α)。通常写作A→α或A::=α。”→"或”::=”表示“定义为”、“由…组成”、“生成”。2)含义: A→α表示左部符号A生成右部符号串α。3)若A→α;A→β,则可以写成A→α|β。”|”表示“或”。4)非终结符号。
2023-03-18 11:52:19
173
原创 2.Cb-Compiler的安装和使用
Cb语法在C语言的基础上进行了简化,并加入了新的元素(例如import),从而简化了编译器的制作过程,首先介绍下Cb编译器的安装,使用系统为Ubuntu20。
2023-03-16 21:39:25
596
原创 Ubuntu添加环境变量
Linux和Windows中的环境变量都是为了让系统自己找到我们要执行的指令而不需要指定路径查看环境变量,有以下三个命令对环境变量进行查看env:env命令是environment的缩写,用于列出所有的环境变量;export:单独使用export命令也可以像env列出所有的环境变量,不过export命令还有其他额外的功能;echo $PATH: echo $PATH用于列出变量PATH的值,里面包含了已添加的目录。
2023-03-16 15:57:02
1597
原创 LLVM IRBuilder and pass:1.llvm基础命令
例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。1.将c语言代码转换为llvm的IRclang -emit-llvm -S multiply.c -o multiply.ll或 clang -cc1 -emit-llvm testfile.c -o testfile.ll2.把ll文件的LLVMIR转为bitcode格式。
2023-03-16 09:20:44
686
原创 1.基于javacc设计的Cb-compiler
编译器是从事软件行业有关人员所必不可少的,但是大多数人只会使用编译器,并不了解编译器的原理,如何使编程语言转换为计算机可以识别的语言,下文中将进行概述,描述Cb语言的编译器的编译过程。本文所讲述的编译器,编译分为4个阶段:语法分析、语义分析、生成中间代码和代码生成。语法分析,使用语法分析器将代码转换成机器可以理解的形式,即语法树。语义分析,对语法树进一步解析处理,转化为抽象语法树,删除多余的内容,添加必要信息,如区分变量作用域、变量的声明和引用、变量和表达式的类型检查等等。
2023-03-16 09:17:45
601
原创 基于llvm自制编译器(4)——代码优化器、JIT编译器
前面几章我们介绍了如何实现一门简单的编程语言,同时支持了LLVM IR代码生成。代码优化器JIT编译器至此,我们完成了对 Kaleidoscope 的 JIT 和优化器的支持。我们可以实现一门非图灵完备的编程语言,以用户驱动的方式对齐进行优化和 JIT 编译。后续,我们将研究使用控制流结构扩展编程语言,并在此过程中解决一些 LLVM IR 相关的问题。
2023-03-09 11:47:06
1207
原创 基于llvm自制编译器(3):LLVM IR 代码生成
在上一章中,我们介绍了如何构建抽象语法树AST。这一章,我们进一步将抽象语法树转换成LLVM IR。此外,我们会简单介绍LLVM的工作原理和使用方法。注意:本章源码要求LLVM版本大于等于3.7如下所示,为函数定义的代码生成方法定义。if(!if(!对于函数定义,我们首先在模块的符号表中查找该函数已有的版本。如果返回null则表示不存在,因此我们将通过来生成。然后,我们对Builder通过函数创建一个基本块(Basic Block),基本块随后被插入到中。通过。
2023-03-08 20:58:08
1501
原创 C/C++ 函数调用规范
例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。提示:以下是本篇文章正文内容,下面案例可供参考。
2023-03-08 20:15:35
461
原创 基于llvm自制编译器(2):解析器、抽象语法树
本章,我们将基于词法分析器,为Kaleidoscope构建一个完整的解析器(Parser)。通过解析器,我们可以定义并构造抽象语法树(Abstract Syntax Tree,AST)。递归下降分析法(Recursive Descent Parsing):用于基本表达式的解析。算符优先分析法(Operator-Precedence Parsing):用于二元表达式的解析。在实现解析器之前,我们先介绍一下解析器的输出——抽象语法树。
2023-03-07 10:41:36
339
原创 第14章函数和变量
所谓程序调用约定(calling convention)就是根据 CPU 和 OS 来决定函数调用的具体实现方法的约定。譬如参数传递的实现,既有把参数保存到寄存器来传递的方法,也有把参数入栈来传递的方法。
2022-12-12 11:08:37
440
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人