自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(87)
  • 收藏
  • 关注

原创 软工个人作业 -- 提问回顾与个人总结

我前期大量的工作都是在批判这种文化(严格意义上说,是我脑子中的“这种文化”),但是随着调研的深入,我又对这种文化有了更加清晰的认知,爱上了这种文化。在产品设计方面,我设计出了 Ficus 的样子,但是这期间经常被批评为“赛博女友”,有的用户这么说,是批评我不尊重用户意见,有的组员这么说,是批评我独断专行。对于人员管理方面,我觉得其实大家愿意跟我一起干,还是出于理想主义的同心协力,跟我这个人的管理水平其实没多大关系,如果要论的话,其实我也没有啥管理水平,有的时候甚至还和组内的同学有一些小的摩擦。

2023-06-14 00:52:56 1215 2

原创 Ficus 第二弹,突破限制器的 Markdown 编辑管理软件!

大家好,我们是 gg=G 团队,我们开发的 markdown 笔记管理软件 Ficus Beta 版本正式发布了。详情可以见我们,也可以来我们查看。

2023-06-08 23:02:44 682

原创 Ficus: 一款 markdown 编辑管理软件

ficus: 一款 markdown 编辑管理软件

2023-04-27 17:54:55 768 1

原创 CPP设计-string

其实删除在字符串中应用并不多,但是使用迭代器删除的效果在 java 中有体现,在 cpp 中更加恶心,java 只是没法用加强 for 循环,只要用了迭代器啥事没有,但是在 cpp 中,即使使用了迭代器,删除会变得更加恶心,比如说下面这样的代码。如果找得到的话,就会返回子串开始的位置的下标(这是独特的,因为在其他的 stl 容器中,会返回迭代器,而不是一个整型量),如果没有找到,则返回 -可以看到,这些字符串是完全不同的独立的字符串,在 java 中,只要地址不用,那么就无法判断等于,而在 cpp 中,

2023-04-08 06:41:12 553

原创 CPP设计-jsonxx

发挥的是一个抽象类的作用),而为了实现函数的动态绑定,那么就会需要虚函数,而虚函数的实现依赖于虚函数表,这是一个很浪费内存和时间的结构,所以为了实现的更加轻巧,这个项目做了一个创新的设置,就是不直接利用。​ 这个项目的封装性实现的极好,这是因为其“轻量级”的需求所需求的,因为轻量,所以必须易懂,而易懂的前提就是暴露的结构要少,接口要简单,这两点该项目都实现的很好。这大大增加了项目的易维护性。​ 对于项目的编译和使用,也是有专门的 Makefile 和演示代码,极大的方便了用户的使用,代码示例如下。

2023-04-08 06:41:00 917

原创 CPP设计-C高阶

我没有分清的本质是认为“需要经过两次解除引用才能获得非指针类型“的指针本质上都是同一种东西,这显然是错误的,在我的错误认知下,我认为对于整型指针,一共有这么几种。​ 当我们有一个多维数组的时候,其实很想分析清楚它的结构中是长什么样子的,虽然这个结构是抽象的(内存中一定是一维的),但是仍然有一探究竟的必要。是从左到右结合的,所以我们首先获得的是以个含有两个元素的数组,这两个元素又是含有三个元素的数组,而此时的元素是整型变量。​ 而对于数组指针,它每次递增的步长是其指向数组的大小,也就是这样的图。

2023-04-08 06:40:27 612

原创 CPP设计-STL

的,显然如果不支持这两个基本的编辑操作,这个数据结构也没啥意义了,只不过对于不同的容器,其功能有所区别,比如说对于 sequence 来说,​ 容器是存储其他对象的对象,被存储的对象必须是同一种类型的,它们可以是OOP意义上的对象,也可以是内置类型。所以如果我们把这个过程抽象出来,那么就可以不考虑具体的容器是啥样的,而达到设计算法的目的,也就是说,实现了上面提到的“可以实现,在自定义的时候,有两种声明形式,一种是三参数的,分别指明了元素类型、底层容器类型和比较函数对象,如下所示。来改进基本的容器概念。

2023-04-08 06:40:25 396

原创 CPP设计-面向对象

/ 如果有无参构造器可以这样用 Node a;// 如果是有参的构造器 Node a(x , y);

2023-04-08 06:39:40 209

原创 CPP设计-寸步难行

​ 首先说明声明的意思,声明就是告诉 CPP 这个东西的名字和类型。相当于在符号表上**“登记”**了一下。但是这个东西到底是怎么样的,其实是没有规定的。​ 而对于定义,就是说告诉 CPP 这个东西的具体是怎样的,它的内存空间必须要有(声明没必要有),内存空间里的数据是怎样的,也必须要有一定的规则(里面的东西不一定是固定的,但是规则一定要有)。​ 其实上面这两个概念很好理解,尤其是“这个东西”是函数​ 但是对于变量,情况会变得很复杂。即在 CPP 中。只有extern关键字可以完成变量。

2023-04-08 06:39:02 704

原创 IEArch-NaiveTPU

​ 相比于 lab4 只有 Bram 是在板子上,而 PL 采用软件模拟的,这次 PL 侧我们利用 FPGA 实现了,也就是真正完成了一个简单的乘法运算加速器。​ PL 侧架构如图所示:​ 可以看到,依然是利用 bram 进行通信。用到了在 lab3 中开发的 MAC 模块。

2023-04-08 06:39:01 606

原创 CPP设计-泛型设计

模板虽然可以写很多,但是他们都不是函数的定义。如果想要获得函数的定义,那么就必须去具体化。​ 关于模板最重要的一个概念就是。

2023-04-08 06:37:07 90

原创 IEArch-矩阵乘法模块

因为 8 位的操作数乘法运算,可能出现 16 位的结果,而零拓展只适用于无符号乘法,而第二个矩阵中出现的第一个矩阵中出现了负数,这就导致了运算错误的出现。中的某个分量,不止会被一个 MAC 利用,所以 MAC 还承担着传播分量的作用,除此之外,MAC 计算出结果后,还需要将结果通过 MAC 网络传递出去。MAC 不仅需要传输自己的运算结果,而且需要传输其下面的 MAC 传输的结果,是通过一个 MUX 实现的,如下所示。中,这个模块控制了数据的流向,比如说纵向传播,写法是这样的。

2023-04-08 06:35:32 610

原创 IEArch-多层感知机

​ 这次的实验要求是利用已有的三层神经网络,改成一个四层的神经网络,最终实现一个手写数字识别的功能。其中修改的任务确实不是很难,基本上利用找规律和矩阵乘法的合法性就可以推断出如何多加一个 hidden layer。​ 所以我的精力主要放在了两个部分,一个是对于神经网络的数学原理的解释上,一个是对于原有代码的改写上(虽然只是一些小面积改写)。我之后会着重与这两个方面展开介绍。

2023-04-07 07:32:21 997

原创 Ruby设计-开发日志

创建名为project的 rails 应用创建Product模型这会生成一个migration,我们需要进一步修改这个迁移,保证价格拥有 8 位有效数字,同时小数点后保留两位。修改迁移文件然后就可以进行这里的rake可以被理解为一个脚本的管理器,db:migrate是其中的一个脚本。还有一种说法是rake类似与 C 中的make最终我们对于数据库的修改,都会被记录在中,比如说现在可以看到基本上与migration是一致的,原来的时间戳变成了created_at和updated_at两个属性。此外主键被叫做。

2023-04-07 07:31:11 632

原创 IEArch-卷积神经网络

​ 关于卷积为啥要比普通的矩阵乘法(线性变化)要更加优异,我的同学说过,卷积会重复的利用输入矩阵中的信息,而且每个信息的贡献是不等的,边缘的贡献会小一些,而且卷积核这种东西本身的权重就很有灵性,而且可能有更好的数学理论支持。​ 总的来说,不同的激活函数对与学习速度,过拟合现象,死神经现象都有影响,导致最终对于正确率也有一定的影响,比较详细的是和激活函数的梯度有关系,当然也和均值啥的有关系,我找到一篇写得很好的帖子,附在这里。一个模型中的每一个数据或者操作都是图中的一个节点,箭头代表了数据流动的方向。

2023-04-07 07:30:21 961

原创 Ruby设计-功能演示

在非登录状态可以进行一些网页的浏览和功能,比如说商品目录但是比如说需要支付订单的时候,就会自动重定向到登录界面。

2023-04-07 07:30:01 309

原创 Ruby设计-高级语法

​ 其中initialize方法充当了构造器,以开头的变量是实例变量,也就是说是 Java 中的属性。​ 我们利用new方法创造一个变量,类似于一个工厂方法。如果往深里探究,应该是new方法是一个类对象方法,也就是说,Point可以作为一个类,同时它也是Class这个类的一个对象,他作为对象有一个方法是new。这个new会调用实例方法(就是 java 中的非静态方法)new,然后完成构造。​is_a?是一个方法,与 Java 中的instanceof类似。只要是这个类或者这个类的子类,都会返回true。

2023-04-07 07:29:25 505

原创 IEArch-基础知识

我们常见的计算机一般将存储和数据处理分离,但是显然我们脑子不是这样的,我们的脑子的存储和数据架构并没有分开,而且存储的形式也不是一种固态的仓库,而更像是一种数据加工过程的趋势。​ 抽象更进一步的同时,是对于“学科”的迷茫,我到底是学什么的?无论我是怎样的人,我觉得有一个原则是不会变的,就是:我绝不会去碰任何一口活着的猪,这是农学生干的事情。​ 智能体系结构就是这样一个模糊的东西,我之前理解的人工智能,是用软件模拟人脑,这很计算机,因为计算机软件的一大功能就是对于客观世界的模拟,我没有任何意见。

2023-04-07 07:29:08 133

原创 Ruby设计-设计文档

该项目名为**“魔法补完计划”**,是一个简易的电商平台,针对于一个书商,多个购书用户进行开发。

2023-04-07 07:27:59 342

原创 Ruby设计-基础语法

​ 符号,就是编译原理里符号表里的那个符号,Ruby 的神奇就在于可以直接在程序中定义这个符号,方法是加个标识符。​ 取整的时候是向下取整,而不是向零取整,这点与 C 或者 Java 不同,但是与 Python 相同。中出现的跟指针一样可以自增的东西,而是一个方法,这个方法接受一个代码块作为参数。​ 我们可以再看一个例子,这个例子不是类中的例子,而就是普通的一个方法,用于输出一个等差数列。示例如下,我模拟了一个数组,然后实现了它的迭代器方法。​ ruby 的脚本调用的时候是可以传参的,下面的脚本。

2023-04-07 07:26:06 437

原创 编译技术-其他理论

对于 C 语言,没有在函数里定义函数的操作,所以函数是一个只会收到形参影响,并且只会通过返回值对外界造成影响的模块,不需要 display,对于 block 里面定义变量的情况,确实会有内外变量之分,但是在翻译 llvm 的时候,已经通过栈式符号表将内外变量重命名成两个变量了,同时消除了内外之分,所以在翻译成 mips 的时候并不需要 display。说白了运行栈是程序的运行栈,而非某个模块的运行栈。因为涉及指针指向内容,很容易就画乱了,但是小测答案提供了一种比较简洁的方法,就是用文字说明,不手画指针了。

2023-04-07 07:25:19 743

原创 编译技术-语法理论

一、直观理解1.1 语法分析的目的​ 语法分析是在进行完词法分析后进行的步骤,词法分析会将一个个的字母拆解成不同的符号,这些符号会被组成一个线性的数组交给语法分析部分,语法分析不会会将这个线性的数组重新组织成一个语法树,交给后面的语义分析部分。​ 至于为什么要组织成一个树形结构?其实也并不是一个必选项,其实本质是这个线性数组可以被语法规则完全的接受。只不过是因为特定的语法规则刚好可以被组织成一个语法树的形式(语法树可以看做是语法分析的“历史记录”),而且语法树的结构又被后面的语义分析部分所需要,所以我

2023-04-07 07:24:16 668

原创 编译技术-优化理论

这是我们学的第一个全局数据流分析,但是只能说教材封装得太好了。肯定这些分析是全局数据流分析,但是以基本块为颗粒度是怎么一回事?即使分析出了基本块的 in 或者 out,对于实际的改写程序并没有办法起到指导意义,这是因为改写的颗粒度是指令级的。显然一个粗粒度的分析没办法指导一个细粒度的改写。进行块级颗粒度的数据流分析,这个部分具有全局性质,会统筹考虑 CFG 的数据流向问题。在每个块内进行指令级颗粒度的数据流分析,这个部分发生在局部,利用的是块级颗粒度分析的结果,不需要考虑全局信息。

2023-04-06 08:11:31 1295

原创 编译技术-词法理论

GVVtPZGVVt​PZVVV:符号集合VtV_tVt​:终结符号集合PPP:有穷规则集合ZZZ:是被符号,不能是终结符关于不同文法的区别类型定义接受重点0 型文法αβα::=β图灵机由字符串推导出另一个字符串,对于左部和右部都没有限制1 型文法αUβαuβαUβ::=αuβ线性界限的图灵机要求左部必须有一个非终结符,而且一次只能改变一个非终结符,同时具有上下文敏感的特性2 型文法UαU::=α。

2023-04-06 08:05:47 1832

原创 编译技术-语法分析

修改成ConstDef;基本上没有任何变化。在实现中,以左中括号为判断是否存在维度信息的标准,缺少右中括号并不会干扰判断。| Ident { '[' ConstExp ']' } '=' InitVal //包含普通变量、一维数组、二维数组定义相比于常量定义必须有初值,变量定义可以没有初值,修改为VarDef;基本上没变。函数由函数类型,标识符,形参列表和函数体组成,SysY 中没有函数声明,只有函数定义。FuncDef;这里的函数定义并不包括主函数main。

2023-04-06 07:51:56 1388 1

原创 编译技术-错误处理

​ 错误处理和解析生成中间代码的过程是类似的,都可以看做是一个。对于遍历出的节点,触发不同的动作符号,这些动作符号在错误处理中用于检测错误,而在生成中间代码生成中,这些动作符号用于生成中间代码。​ 错误处理会遍历语法生成树,CST 的每个节点都实现了check方法用于检查有没有错误。

2023-04-06 07:49:56 1510

原创 编译技术-编译优化

​ 所谓的死代码,就是不会对程序造成影响的代码,我们可以用与“副作用分析”类似的眼光去看,所有的访存指令,return 指令,call 一个有副作用的函数,分支指令,这些东西都是有用的,我们不能删除,那么这些指令使用到的指令,同样也是不能删除的,以此类推,这样求出一个。我们需要讨论的东西也就更多。​ 需要注意的是,分析和加工都不是只进行一次就可以的,加工型优化会改变 llvm ir 的结构发生改变,这就导致可以进行新的分析信息,而新的分析信息也就可以指导新的加工优化,这是一个周而复始的过程,这也是经典的。

2023-04-06 07:47:52 785

原创 编译技术-llvm生成

​ 符号的定义本质是填写符号表和定义,我本来打算总结起来再写,但是感觉太冗杂了,很难理出一个头绪,所以就变成了罗列。

2023-04-06 07:41:25 824

原创 编译技术-除常数优化

​ 对于任何处理器,进行除法计算所需要的时间都远远高于乘法和移位运算(当然这两者也不在一个量级上),所以我们有一种想法,就是把除法转换成乘法和移位操作,也就是quotientdividenddivisordividend×multipliershiftquotientdivisordividend​dividend×multiplier>>shift。

2023-04-06 07:38:20 425

原创 Linux-Vim

​ Vim 会涉及到很多个模式,但是我个人感觉模式之间并不是完全平等的关系,显然最开始进入的 Normal 模式为主模式,而其他模式就类似于卧房之于客厅,是从属关系,我们对文本的编辑主要依赖 Normal 模式。这也是我用不习惯 Vim 的原因。因为我没有很多的功能需求,我敲代码一个一个敲,用到的功能无非是复制粘贴,就好像有人买了台游戏机,却不打游戏一样,纯属浪费。​ 个人感觉Vim太神奇了,但是我确实使用的不太舒服,虽然可以完全脱离鼠标办公了,但是功能键和编辑模式的完全分离,还是让人感觉到很不舒服。

2023-04-06 07:30:56 179

原创 Linux-Unix备考

但是计算机要读取任务,要通过磁带,而磁带上的内容,要通过读卡器读取卡片(可能就是一堆打着孔的硬纸板吧)写到磁盘上,如果读一个任务写一个磁带,然后读一个磁带,处理一个任务,这就太慢了。这就是所谓的批处理。尽管我们把写磁带这个功能给分割开来,让计算机可以安心处理磁带上的任务,但是计算机依然是需要读取磁盘上的内容的,这段 I/O 所占的时间 CPU 是不会工作的。然后有一个有意思的,就是一旦有了通配符,命令的输入参数就会变成不定长的,所以很多时候不是想不到用通配符,而是不敢用通配符,怕用了就会出现问题。

2023-04-06 07:27:33 200

原创 操作系统-初期小结

一、ELF 部分1.1 types.h1.1.1 typedef​ 这是 types.h 文件,主要是给一些基本的数据类型起一个简单一点的别名。/* $OpenBSD: types.h,v 1.12 1997/11/30 18:50:18 millert Exp $ *//* $NetBSD: types.h,v 1.29 1996/11/15 22:48:25 jtc Exp $ */#ifndef _INC_TYPES_H_#define _INC_TYPES_H_#ifndef N

2023-04-06 07:26:45 412

原创 Linux-Git

​ 这已经是我第三遍学Git相关操作了,可以说这个玩意是真的狗,因为确实用不到,不知道下个学期会不会用到,直到现在我刚刚学完,处于知识水平的巅峰,知道Git的具体功能,我也觉得真没啥必要学。我一开始学Git,是因为以为这个跟Github有啥关系似的,其实对于个人来说,使用Github完全没有必要学习Git。​ 这就引出了Git最重要的一个认识了,就是Git的基本上所有的功能都是为了团队协作开发的,而不是所谓的版本控制(当然也可能是,反正我理解的不是)。

2023-04-05 09:56:46 589

原创 Linux-Shell设计

宏观上的 shell 是所有的应用程序,而狭义上的 shell,指的是命令行方面的操作系统界面。处理时,把当前处理的行存储在临时缓存区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区中的内容送往屏幕。但是需要强调的是,这个变量在其他无关进程中依然是没法使用的,比如说我新开一个终端,那么会发现之前终端上定义的各种变量都消失了。​ 如果想要定义的变量在每个终端中都预定义,那么就必须把这种变量写到 bash 的配置文件中,这样的变量一般都是大写的。

2023-04-05 09:32:22 1590

原创 Linux-简易shell

还具有异常检测功能,其可以检测 fork 异常,waitpid 异常和语法异常,具体的实现为将系统调用函数进行包装,这样既保证了功能的正常,也使代码具有简洁性,具体实现如下。​ 这个其实跟 shell 的实现没啥关系,但是还是第一次了解,记录一下,就是我们每次读写文件都会进行系统调用,但是这无疑是高代价的,因为频繁的在用户态和内核态间进行切换。之类的函数,叫做有缓冲的读写函数,他说的是,他会打开文件以后读取一整个缓冲区大小的信息,然后随着。在调用外部命令前先进行文件的重定向操作,再进行调用即可。

2023-04-05 09:07:44 1013

原创 Linux-编译工具

​ 那么为什么不直接写脚本呢,这是因为 make 的优势在于,他并不是每次都执行所有的命令(对于只修改了一个源文件的项目,将整个项目都编译一遍,过于大费周章)。,静态库和动态库的区别体现在程序的链接阶段:静态库在程序的链接阶段被复制到了程序中;来实现的,make 某个目标前,make 会检验该目标对应依赖的时间戳,如果发现距离上一次编译有改动,那么就重新编译。链接是将多个目标文件和库链接到一起,生成可执行文件的过程,由下图可以看到,目标文件不具有可执行权限(就是没有 x )我们在 2.1 提到的。

2023-04-05 08:43:58 1032

原创 操作系统-AOSOA

移植其实就是解决一系列 ABI 的问题。我们之前的的操作系统是建立在 mips 处理器上的,现在我们要把它移植到armv8 上,所以很多与硬件接壤的地方都需要有改动。这里粗浅的罗列一下,详细内容会在后面介绍lab内容lab0新的交叉编译器的使用lab1汇编的学习,arm 的异常处理等级lab2arm 的mmu和硬件三级页表查询方式(万恶之源)lab3arm 的异常处理lab4用软件实现 COW 和 Library 机制lab5SD 的读写lab6armv8 的压栈方式。

2023-04-05 08:24:06 2058 1

原创 操作系统-用户进程

至此,我们可以有一个大致的思路,我们首先编译出很多个目标文件,这其中有真正我们的程序目标文件,有的则是库文件,我们的目的是将库文件链接到每一个写好的程序上。关于为啥不直接使用原来定义好的宏,我觉得是因为原来的宏是属于操作系统的,而在库函数的实现的时候尽量少的接触操作系统的细节,是很有必要的,因为这样可以提高可移植性。​ 在有了这些知识打底的基础上,我们就可以看到底要干啥了,我们遍历了所有的二级页表项和一级页表项,如果他是有效的,那么就要给子进程复制他,人物交给了。因为在引入的时候,我们用的是这种方法。

2023-04-05 08:19:45 1672

原创 操作系统-文件系统

结合上面三个内容,我们这个单元要完成后的职能分工应该是这样的所以最后我们要完成的任务有构建一个磁盘镜像:涉及的文件是fsformat.c。我们会用 X64 的编译器去进行一个普通的编译(就是这个东西是与操作系统的实现没啥关系的),生成的fsformat会利用已经准备好的motd和newmotd文件构建出一个磁盘镜像。这个磁盘镜像就是我们要挂载到模拟器上的镜像。实现一个文件系统服务进程:涉及的文件是。其中ide.c用于实现与磁盘沟通的接口,fs.c相当于服务进程的库,里面有各种服务函数。servc.c。

2023-04-05 08:16:52 1051

原创 操作系统-异常处理流

​ 这个是当我们去写只读页面的时候,就会触发这个异常。但是这还不够精确,因为我们不会闲的没事去写一个只读的页面,所以很多时候就是发生在写时复制的情况,也就是当父进程fork出一个子进程的时候,父子进程都会把基本上所有的可写页面设置成 COW,而这些页面在通过do_refill进入 TLB 之后,都会变成只读页面,而当我们尝试去写这个只读页面的时候(我们不知道它已经变成只读的了),就会有异常发生,就是这个异常,这个异常会复制出一个页面来,这样两人就不存在“共享写”的情况了。真正实现系统调用函数功能的都是以。

2023-04-05 08:00:45 1212

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除