- 博客(140)
- 收藏
- 关注
原创 麦克纳姆轮(Mecanum Wheel)运动学分析
麦克纳姆轮(Mecanum Wheel)运动学分析_Ehang_Maker-GitCode 开源社区
2025-01-22 14:04:03
241
原创 Methods and Initializers
每次 Lox 程序访问和调用一个方法时,运行时堆都会分配一个新的 ObjBoundMethod,初始化其字段,然后再将其拉出。现在,对于每个方法声明,我们都会发出一条新的 OP_METHOD 指令,为该类添加一个方法。只要初始化方法返回,用户调用类创建实例的过程就会结束,并在堆栈中留下初始化方法的任何值。然后,编译器会发出指令,将该类存储到一个带有其名称的变量中。一个类可以声明任意数量的方法。但是clox,有临时变量在stack,还有在global的table中的,还有在closure的upvalue。
2024-12-08 16:20:38
802
原创 23 Jumping Back and Forth
首先,我们发出一个无条件跳转,跳过 increment clause’s code,跳到循环的主体。如果左侧operand是true,则执行下一条无条件跳到右侧operand。(这不是最好的实现。,那么我们就跳过右边的操作数。即使字节码是无结构的,我们也要确保编译器只生成与 Lox 本身保持相同结构和嵌套的简洁代码。当左侧是false,这个值就是整个expression的结果。就跳过下面的statement啥的。12 清理 if 的判断值 (留在了栈上)/每个statement对栈应该无影响。
2024-11-21 23:21:26
911
原创 Compiling Expressions
它的唯一功能是语法上的--它可以让你在需要较高优先级的地方插入一个较低优先级的表达式。// 这张主要在讨论 parser********************************************************************幸运的是,解析器就在我们需要的地方。所需要的标记,它可以检测到我们正处于一个 infix 表达式的中间,并意识到我们已经编译的表达式实际上是该表达式的一个操作数。我们还需要一些其他的前向声明来处理我们的语法是递归的这一事实,所以让我们先把它们都写出来吧。
2024-11-05 20:19:44
1056
原创 Resolving and Binding
如果我们找到了变量,我们就解析它,同时传递当前最内层作用域与找到变量的作用域之间的作用域数目。每次访问变量时,它都会告诉解释器在当前作用域和变量定义的作用域之间有多少个作用域。如果我们走遍了所有的代码块作用域,却始终没有找到变量,我们就会让它悬而未决,并假定它是全局变量。你可能会认为我们需要某种嵌套树结构,以避免在有多个表达式引用同一变量时出现混乱,但每个表达式节点都是自己的 Java 对象,有自己的唯一标识。,因此不需要担心变量名称的冲突,直接通过表达式节点的引用来存储和查找作用域深度。
2024-09-22 21:15:58
839
1
原创 Closure 是个数据结构
这个其实就是个对象。类型应该是个hash表。用来记录在定义函数时,所在环境的变量。如果没有这个数据结构,那么下面的功能无法实现。
2024-09-21 13:35:46
169
原创 Statement 和 Experssion的关系
此外,这里的Statement 也是有子类Expression的。但是并不是Expr那个类,而是Expression。Statement 看似在语法树上,但是他已经不是Expression。思考:我以为这两者会是向下递归的关系。两者的关系也可以从这个语法来看出。所以这里需要新建一个类。
2024-09-18 14:12:42
219
原创 Assignment
我们解析左侧,它可以是任何优先级较高的表达式。如果找到 =,我们就解析右侧,然后将其全部打包到赋值表达式树节点中。毕竟,在解析完左操作数后,我们才知道自己在解析一个 + 表达式。原文:这就是说,赋值要么是一个标识符,后面跟一个 = 和一个值表达式,要么是一个相等表达式(以及任何其他表达式)。由于字段赋值的接收方可以是任何表达式,而表达式的长度可以随心所欲,因此可能需要花费大量的查找符才能找到 =。不同之处在于,赋值的左侧不是一个求值表达式。它是一种伪表达式,会求值到一个可以赋值的 “东西”。
2024-09-11 15:41:33
295
原创 用vs附加运行的软件并打断点
4 工具-》选项-》调试-》符号-》符号文件(.pdb)的位置栏中,添加P文件所在路径。以及build好的exe的路径。顺便取消勾选微软的符号服务器。6 如果要看对应行的汇编代码。到对应行右键,点击查看反汇编就可以了。前提:目标软件已经build完成。并且生成了对应的pdb文件P。0 将要打断点的代码,所在生成的pdb文件放到exe相同目录下。2 打开vs,并打开文件A。当程序运行到断点时,就自动的停下来了。需求:给一个代码文件A的第n行打断点。7 或者点击调试-》窗口-》反汇编。3 在vs中附加程序。
2024-09-03 08:40:22
341
原创 atomic的使用例子
这段代码定义了一个名为的 lambda 函数,其功能与之前的函数类似。它的作用是确保原子变量d中存储的值始终是给定深度值depth和当前存储值之间的最大值。
2024-08-20 10:35:20
578
原创 Cmake 中的${} 的作用就是解引用
在 CMake 中, 是用于引用变量值的语法。当你在 CMake 脚本中使用 包围一个变量名时,CMake 会解析这个变量,并将它替换为对应的值。具体来说, 语法的作用是将变量名转换为它的实际值,以便在 CMake 脚本中使用。定义变量: cmake 复制代码这里 被定义为一个字符串变量,值为 。引用变量: cmake 复制代码这行代码中, 将打印 ,因为 被替换为了变量 的值。cmake复制代码在这个例子中:有时你可能会遇到嵌套的 ,这是 CMake 处理复杂变量引用的
2024-08-14 16:07:38
653
原创 Halide AOT模式
这种模式会提前,会提前编译好,变成dll什么的,可接受任何输入的参数运行。然后这样调用,必须要make一下前一个file,才有后面的.h。
2024-07-03 17:57:48
249
原创 为什么circular buffer 要是8的倍数
综上所述,选择8的倍数(即2的幂次方)的缓冲区大小可以显著优化性能,简化硬件设计,并更好地利用处理器缓存,从而在许多应用场景中成为常见的选择。
2024-07-03 17:22:21
354
原创 How to atomically update a maximum value?
c++ - How to atomically update a maximum value? - Stack Overflow
2024-06-21 19:07:17
141
原创 warning LNK4042: 对象被多次指定;已忽略多余的指定
然后另一个dll用到了这个obj,还用了这句,target_precompile_headers(${TARGET_NAME}_cpp REUSE_FROM algos_obj) 就会出问题。cmake_pch.obj : warning LNK4042: 对象被多次指定;因为有些cpp中删掉了include .h 也可以编译通过。当algos_obj中用到了预编译头文件的cmake_pch.obj。
2024-03-28 14:54:43
358
原创 默认库“LIBCMT”与其他库的使用冲突;请使用 /NODEFAULTLIB:library
这个问题可能是由于链接器发现了在链接时存在冲突的符号,这些符号在默认的运行时库 "LIBCMT" 和其他库中都有定义。当链接器找到多个定义相同的符号时,就会报告冲突。冲突可能是因为你在链接时使用了不同版本的库,或者是因为你的代码中使用了某些特定于库的功能,导致了符号冲突。通过排除默认库并确保使用统一的库版本,可以帮助解决这些问题。选项来排除默认库 "LIBCMT" 的使用,以便在链接时不再考虑它。这样,你可以确保链接器使用其他库中的定义,从而解决符号冲突问题。解决这个问题的常见方法之一是通过使用。
2024-03-28 14:36:12
1057
原创 cmake使用预编译头文件功能后,不需要include相关文件了
2. 类似于VS里创建的项目,即.cpp显式#include "stdafx.h",那就不需要写这些include了。1. 类似于vision,即.cpp未显式include "xx_pch.h",最好还是写上这些include。在obj中的.h 文件就不需要再include 对应的文件了。一般来说,相比于编译时间,更影响开发效率的是IDE的解析时间。重复写,不增加编译时间。
2024-03-28 11:53:52
459
原创 多个数字二进制加法
https://www.google.com/search?q=three+binary+numbers+addition&sca_esv=274934f892c43701&sca_upv=1&ei=2cPqZZ_CAcrK2roPiKqq2A0&oq=three+binary+nu&gs_lp=Egxnd3Mtd2l6LXNlcnAiD3RocmVlIGJpbmFyeSBudSoCCAAyBBAAGB4yBhAAGAgYHjIGEAAYCBgeMggQABgIGB4YDzIGEAAYBRgeMgYQABg
2024-03-08 15:57:58
244
原创 make_shared_for_overwrite
不过这个仅限于内置类型。如果是用户写的,就会增加自动初始化(调用客户写的初始化)。这个函数用来malloc数组,但不初始化。
2024-02-21 19:53:48
230
原创 halide package cmake的设置方式
3 然后设置一下那个Halide_DIR就可以了。2 把提前下载好的halide放到一个位置。里面用到halide。这时会提示找不到package。按照那个提示做就行。
2024-02-19 17:52:26
217
原创 扣库的函数经验
有的库确实可以提出来的比如这个库根据自己的需要是可以,把内容抠出来的,重新build的。我就自己新建了一个vs的工程,然后把源文件弄进来build。缺哪个文件就把哪个文件加到工程里。
2024-02-01 11:35:02
327
原创 类形设计经验
但是每个形状都有共同的成员,也有各自的成员。也有个别的类型有相同的成员。这样的优点是:不用在各自的子类中有相同的成员。里面有所有类型的成员变量。所有子类,有自己的接口访问自己各自的成员。这个类提供公用成员访问接口。然后所有类型继承这个基类。
2024-01-17 14:46:34
367
原创 代码结构:为何重要算法不和接口编译到一个dll里面
比如,有时单独改一个接口,只要重新构建那个接口的dll就可以了。如果大家都写在一个dll里面,那么每次改一下接口,就需要重构整个算法模块。2 每个算子的dll我们理解,内容主要是其接口的实现。而真正的算法内容是在上面的algorithm.dll中。3 所以这种dll的拆分也好,或者cmake中的obj,就有这种好处。就是将build的单元解耦开。提升build时的效率。1 需要每个算子是一个dll。优点是方便业务上,针对不同的算子精细化的更新,或者售卖。这里是vision master的例子。
2024-01-12 11:14:13
439
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人