入门jvm字节码
java是很简单的,但是这背后支撑着java的是什么? 引言 jvm是一台虚拟机,能够执行java字节码,也就是java的汇编。 本篇文章将避免涉及具体的指令,从了解的程度来描述java字节码设计。 虚拟机结构 重点内容(为了方便理解,以下内容做了简化) 对于每一个class,有一个常量池、静态变量表 对于每一个实例对象,有一个成员变量表 对于每一个function,有一个局部变量表(类似list)、一个操作数堆栈 ...
windows的CLSID与ProgID对应关系
前几天要写个程序,要用到windows的CLSID(虽然最后程序没写出来),发现网上没有特别全的对应关系,于是就查询资料,自己导出了一份。 先说结果 结果在这里CLSID.json 过程 查询资料得知,windows将CLSID放在注册表如下位置 LOCAL_MACHINE\SOFTWARE\Classes\CLSID CLASSES_ROOT\CLSID 于是用一个C#脚本很快就导出了,代码如下 1234567891011121314151617181920212223242526272829303132333435363738List<CLSID> pairs = new();{ var reg = Registry.ClassesRoot.OpenSubKey("CLSID"); var subs = reg.GetSubKeyNames(); foreach (var i in subs) { var name =...
矩阵的并行计算
注:这是我的线代报告,发这里算了 前言 引言 如今,线性代数在深度学习中的应用非常广泛。但是在计算机领域,使用传统CPU进行矩阵运算是非常缓慢的,因为CPU并不擅长高度并行计算。而对于擅长高度并行化计算的GPU而言,这是非常容易的,这也是为什么现代大模型的训练离不开大量显卡(计算卡) 本次报告目的 本文使用CUDA编程实现高效的矩阵操作(包括矩阵乘法、矩阵转置) CUDA简介[1] CUDA 是NVIDIA 发明的一种 并行 计算平台和编程模型。它通过利用 图形处理器(GPU)的处理能力,可大幅提升计算性能。 编程环境 操作系统 CUDA设备 IDE ubuntu 18 LTS tesla p4 Nsight windows 11 RTX 3060 laptop CLion 基础知识 名词 中文 解释 shared memory 共享显存 容量很小,速度很快,随机读写性能好,局部访问的缓存 global memory 全局显存 容量很大,速度较慢,随机读写性能差,全局访问的缓存 矩阵转置 ...
微积分(下)复习
立体空间 拉格朗日数乘法 求f(x,y,z)f(x,y,z)f(x,y,z)在g(x,y,z)=0g(x,y,z)=0g(x,y,z)=0条件下的最值 构建函数 L(x,y,z,λ)=f(x,y,z)+λg(x,y,z)L(x,y,z,\lambda)=f(x,y,z)+\lambda g(x,y,z) L(x,y,z,λ)=f(x,y,z)+λg(x,y,z) 令{∂L∂x=0∂L∂y=0∂L∂z=0∂L∂λ=g(x,y,z)=0令\left\{ \begin{aligned} &\frac{\partial L}{\partial x}=0\\\\ &\frac{\partial L}{\partial y}=0\\\\ &\frac{\partial L}{\partial z}=0\\\\ &\frac{\partial L}{\partial \lambda}=g(x,y,z)=0\\ ...
通俗易懂的Dijkstra算法
看了下网上的一些讲的这个算法,有的说的太复杂了 其实一点都不通俗易懂 我们假设有A、B、C、D、E四个节点,我们想找到从A到E的最短路径(边权和最小) 我们定义DA(x)D_A(x)DA(x)表示当前计算出来的从A到X的最短距离 定义C(X,Y)C(X,Y)C(X,Y)表示从X直接到Y的距离 12345A——8——B| ╲ ╲ 2 18 15| ╲ ╲C——9——D——11——E 文字描述 记全部节点所在的集合为U 先构建一个映射f:x→DA(x),x∈{B、C、D、E}f: x \rightarrow D_A(x),x\in\{B、C、D、E\}f:x→DA(x),x∈{B、C、D、E},再构建一个集合C:{}C:\{\}C:{}来存放已经寻找过了的节点。 初始化 初始从A开始直接寻找,然后将结果直接存放在fff中,C:{A}C:\{A\}C:{A} 循环迭代 寻找fff值域中值最小的项对应的节点,且该节点没有被搜索过。记该节点为NNN 从该节点作为桥梁进行搜索 对于{x∣x∈U,x∉C}\{x|x\in U,x\notin...
不是人人都需要学习汇编
现在的计算机行业分得越来越细了,有软件工程,有人工智能等等,需要使用汇编的场景也算是非常少了。 计算机教学行业早该改一改了,都现在这个时间点了,还要求每个计算机专业的学生学习8086汇编,真的好笑。更加糟糕的是,我们的汇编考试非常愚蠢,汇编指令本来就很繁多,特别是对于复杂指令集而言,但是我们的考试却禁止查看参考文档。(好歹你随便参加一个什么算法比赛,都会提供参考文档吧😅) 显然我并不是想说汇编在现在就没用了,编译器、逆向工程任需要使用,但是又有多少人有这样的需求呢?特别是对于现代软件而言,大部分都是高级语言通过一层又一层的抽象实现的,各种runtime、抽象高级语言、GC的存在造成了晦涩难懂的汇编指令。我们目前学习的汇编太太太基础了。 我只想说,不是人人都需要学习汇编。
C++:狗屎语言
这段时间在写CPP大作业,才算真正被CPP恶心到 狗屎的include设计 这个是我觉得做的最垃圾的地方,c的include是真的给你include,明明是个编译型语言,必须要我指定包含哪些文件,这还需要是单向的,否则动不动就死递归include了。虽说有头文件卫士这玩意,这还是容易编译出错。 这些include还是传递性的,给代码分析器造成了不小的麻烦,导致代码提示不是慢就是质量差。 垃圾的std标准库 连个最基础的string都搞不好,考虑到当年没unicode,这个就不说了,但是为什么连个最基础的split、replace∗^*∗都不提供. 随便找一个成熟的第三方库,基本上都是自己实现了一个string 注: replace 指的是像py中的用一个字符串替换一个字串 除此之外,像什么vector也是跟屎一样,没有contain、remove 函数 乱七八糟的包管理 其实我这句话就是错的,这种垃圾语言连包管理器都没有,使用第三方包的方式简直“百花齐放”,什么静态链接动态链接的,写一个大一点的项目还要把别人的代码放进来,把一个项目膨胀几百倍。 ...
蓝桥杯15届Java-A组吊坠题目解析
当时考蓝桥杯(java)的时候,也没怎么学过算法,一看这道题涉及到了图论,直接就放弃了。现在回过头来学了下,写个解析。 题目 小蓝想制作一个吊坠,他手上有 n 个长度为 m 的首尾相连的环形字符串{s1, s2, · · · , sn} ,他想用 n − 1 条边将这 n 个字符串连接起来做成吊坠,要求所有的字符串连完后形成一个整体。连接两个字符串 si, sj 的边的边权为这两个字符串的最长公共子串的长度(可以按环形旋转改变起始位置,但不能翻转),小蓝希望连完后的这 n − 1 条边的边权和最大,这样的吊坠他觉得最好看,请计算最大的边权和是多少。 分析 这道题涉及到两个问题 这很显然是一个涉及到图论的问题,可以采用与最小生成树类似的算法 对于两个节点,它们之间的边权的计算 边权计算 采用动态规划来计算 1234567891011121314static int similarity(String a, String b) { a=a+a;//由于首尾相连,等效于将本身内容复制一遍再求最长公共子串 int[][] dp=new...
c++UI库slint上手体验
首先这个玩意需要安装Rust开发环境 https://www.rust-lang.org/learn/get-started 然后需要Rust的某个工具链 1rustup target add --toolchain stable-x86_64-pc-windows-msvc x86_64-pc-windows-gnu 但是这玩意在国内由于网络原因根本动不了,所以先要为Rustup设置镜像仓库 可以参考下文设置环境变量 https://www.jianshu.com/p/876b1cca26d8 弄好之后,运行cmake就好了 体验感受 遗憾 没有多窗口支持 由于界面脚本与程序不同,接口都需要从UI暴露出来 缺少路由等支持
MC红石三极管
使用网上的传统三极管设计有一个缺陷,当被控制电路频率过高时,三极管无法导通。 使用传统三极管非常不稳定 但是使用红石中继器+粘性活塞就非常稳定了 于是我就用这玩意做了一个可变频的折磨🐏的。。(x