- 博客(279)
- 资源 (13)
- 问答 (1)
- 收藏
- 关注

原创 计算机知识结构梳理
有关自身经历的一些想法从事计算机及相关工作已有20年,每每想起自身学习的过程,心里总觉得有些曲折,其中既有自身认识的问题,也有学校课程安排的问题。自身问题不想多谈,毕竟每个人所面对的环境和生活不一样。谈及学校的课程安排,我倒有不吐不快之感。计算机专业往往采取教授编程语言开始,然后安排大量课时给如英语,大学物理,数学课程。中间穿插模拟电路,数字电路,汇编语言,操作系统等相关课程。每每想起总觉得前后不搭,大学最后的课程安排又让人觉得过于追求即时效果而缺少基础研究。回想走过的弯路,心中不免烦乱,加之工作要求,
2022-02-09 22:00:20
7259
原创 C++虚函数表
本文介绍了使用Visual Studio和GDB调试工具分析C++类内存布局的方法。通过在VS中配置/d1 reportAllClassLayout命令,可以输出类的内存结构。文章重点分析了三种情况:无虚函数类、带虚函数类以及继承类。通过反汇编和内存监视,展示了虚函数表(__vfptr)的结构,说明虚函数调用机制。对于继承类,详细演示了基类函数被覆盖时的内存布局变化。调试结果表明,虚函数表指针位于对象首地址,其中保存了虚函数的调用地址。
2025-05-26 10:33:13
387
原创 openjdk底层(hotspot)汇编指令的内存分布
本文介绍了内存分段机制及其在JVM中的实现。通过CodeSection类模拟内存中的段结构,详细说明了其关键属性如_start、_end、_limit等的作用。在JVM中,CodeBuffer类用于管理不同类型的CodeSection(常量段、指令段、桩代码段),并展示了指令插入指令段(_insts)的具体过程。文章还通过gdb调试示例,演示了如何在实际运行中查看CodeSection的内存布局,说明其起始地址对齐和段长度设计对CPU访存性能的优化。
2025-05-25 23:04:03
881
原创 openjdk底层(hotspot)汇编指令调用(五)——内存访问
在aarch64架构下,src\hotspot\cpu\架构文件夹中的文件如assembler_xx.hpp和register_xx.hpp等,主要涉及寄存器定义和汇编编码函数的实现。文章进一步探讨了计算机中寄存器和内存之间的数据访问方式,特别是在x86架构下的访存模型。通过具体示例,如movl %rdi, (%rbp),展示了如何将寄存器中的数据存储到内存中,或从内存加载数据到寄存器。此外,文章还介绍了x86架构中的基地址、变址和比例因子等概念,并说明了如何在hotspot的x86访存模型中通过Addre
2025-05-20 11:01:00
539
原创 C#接口的setter或getter的访问性限制
在C#中,可以通过限制setter的访问性来实现只对外提供getter,而属性的赋值只能在内部进行。例如,在LibA命名空间中定义一个接口ITranslation,其中MyDict属性的setter被标记为internal,这样外部只能读取该属性,而不能直接设置。在LibB中实现该接口时,setter只能在内部使用。通过反射动态创建对象时,可以在LibA中访问setter进行赋值。这种设计适用于需要控制属性访问权限的场景,确保属性的安全性。
2025-05-19 15:07:38
320
原创 openjdk底层(hotspot)汇编指令调用(四)——发送指令到内存
文章主要讨论了JVM如何将指令发送到代码段中执行。首先,JVM通过软件模拟计算机行为,将内存分为数据段和代码段。在指令编码完成后,JVM通过assembler_aarch64.hpp文件中的add函数将指令发送到代码段。
2025-05-15 11:43:33
481
原创 openjdk底层(hotspot)汇编指令调用(三)——编码
本文以AArch64架构的add x0,x1,x2指令为例,详细介绍了如何实现指令编码。
2025-05-13 16:55:22
467
原创 雅思口语 Part 1 Math
雅思口语King在回答关于数学的问题时,首先强调了数学在日常生活中的重要性,特别是在没有计算器的情况下,乘除法在计算折扣价格时非常有用Math Do you think mathematics is important? Well,Yes. From my personal perspective, mathematic is of great importance for us in our daily lives since it can help us to r...
2025-05-13 15:33:12
1153
原创 C++的构造函数和析构函数
构造函数和析构函数在C++中分别用于对象的初始化和清理。构造函数在对象创建时自动调用,其名称必须与类名相同;析构函数在对象销毁时调用,名称前加~符号。对象的生命周期由{}界定,构造函数在对象声明时调用,析构函数在对象离开作用域时调用。例如,在函数内部,对象的创建和销毁顺序遵循最近{}原则,即先创建的对象后销毁。通过合理使用构造函数和析构函数,可以确保资源的正确分配和释放。
2025-05-12 17:05:20
240
原创 openjdk底层(hotspot)汇编指令调用(二)——寄存器定义
通过面向对象编程思想,定义了寄存器类和汇编器类,分别用于管理寄存器的名称、值以及汇编指令的编码规则。为了支持多平台,OpenJDK在share/asm目录下抽象了寄存器和汇编器的基类。
2025-05-12 10:13:37
1035
原创 openjdk底层(hotspot)汇编指令调用(一)——汇编指令及指令编码基础
计算机通过识别0和1的电信号执行指令,早期程序员直接使用二进制编程,但易出错且不便记忆。为此,厂商定义了汇编指令,如x64平台的push %rbx对应二进制0x53。
2025-05-11 20:58:23
1004
原创 JVM局部变量表和操作数栈的内存布局
局部变量表(locals)包括了函数内部的临时变量和形参,另外还包括了当前函数的this指针操作数栈实现了Java虚拟机的栈式操作在openjdk的实现中,局部变量表位于解释栈的高地址处,用locals寄存器定位局部变量表并根据偏移值获取值;操作数栈位于解释栈的低地址,用sp寄存器定位实现字节码逻辑。
2025-05-07 11:19:12
514
原创 栈是如此重要——C函数栈传参
可以看到add2的函数栈在构建时,在rbp的高8位是回到main函数的地址(RA)。在C的main函数调用add2函数前,将第一个参数和第二个参数分别放在了rdi和rsi寄存器中,那么在进入add2的汇编片段时,这2个寄存器将会将值放在内存栈中。由于是O0选项进行的gcc编译,因此对C程序不做优化,上述汇编是将内存栈空间作为过渡,将值传递给参数寄存器。,当main调用add2时会传2个参数到add2执行的汇编片段,那么这2个参数是如何在栈上布局的呢?在进入add2之前,栈的形式如下。
2025-04-30 16:46:19
416
原创 栈是如此重要——C函数栈
栈为先进后出的数据结构在《数据结构》中有C的栈实现算法,然而很少看到对于栈有什么作用的描述。考虑一个场景,当CPU在计算时需要将某些值临时保存,待当前需要处理的事情处理完毕之后,重新把这些数据还原。此时应该怎样做?典型的应用就是函数调用,比如add2(2,3);return 0;在上述程序中,add2会调用add3函数,当调用add3函数前,计算机必须保留下add2函数的位置,以便在add3结束之后可以返回到add2处理的位置。此时,栈就起到了记录现场的作用。
2025-04-27 11:22:31
692
原创 字节,字节码,字节码文件,字节码指令
计算机一般是一个字节一个字节的读取数据,使用字节进行编码符合计算机的读取数据的流程。第三,使用通用的字节码指令针对的是纯软件的虚拟机,其内容与平台无关。因此使用字节码的程序很方便移植,甚至可以说不需要任何操作,直接放在有Java虚拟机的机器上运行即可,实现了。这些字节根据Java虚拟机规范的要求在不同的位置表达不同的意思。由于电路实现上的原因,计算机的计数方式为二进制,即由0和1组成。为了方便的表示字节,一般采用16进制的形式。生成的.class文件为01组成的文件,使用vs code的。
2025-04-24 09:43:37
946
原创 关于编译和调试OpenJDK的一些问题
由于`OpenJDK`的编译环境是跟操作系统紧密相关的,所以,当分析`OpenJDK`代码的时候,首先应该阅读`README.md`,确定当前阅读的`OpenJDK`能够在哪些环境下进行编译和调试。这里将一些基本需要解决的问题进行阐述。
2025-04-21 14:25:11
567
原创 在Ubuntu 18.04下编译OpenJDK 11
链接: https://pan.baidu.com/s/1QAdu-B6n9KqeBakGlpBS3Q 密码: 8lho不同版本的jdk会要求在不同版本的Ubuntu下编译,不要用太高版本的Ubuntu或者gcc,特别是gcc,这个跟glibc的版本还绑定,如果gcc版本太高,则glibc版本也高,也会影响openjdk的编译。gcc7,freetype2可以直接使用apt-get install安装先configure,再makeconfigure可以参考openjdk/doc/building.htm
2025-04-21 13:50:36
490
原创 Java虚拟机(JVM)平台无关?相关?
平台无关是因为其执行过程是由纯软件实现的栈式计算机实现,而平台相关是因为Java虚拟机的具体操作跟平台指令和操作系统相关。不仅如此,为了能够实现**“一次编译,处处执行”**,Java虚拟机还能根据不同的操作系统进行适配,对于有些与操作系统和CPU结合的部分,也提供了不同的实现。所以,如果有程序要实现一个加法,那么在计算机底层执行时,其执行的内容是不一样的。上生成的.class文件,其内容是一样的。Tape是输入数据,Program是针对这些数据进行计算的程序,中间横着的方块表示的是机器的状态。
2025-04-17 17:25:21
837
原创 C++的*了又*
先看下面一段代码主函数这里首先在堆中创建了一个HeapWord对象的空间,然后其首地址放入heapword中然后又在堆中创建一个HeapWord对象的空间,然后其首地址放入p中然后声明一个变量p1,该对象指向一个指针,该指针指向的是HeapWord类型。
2025-04-11 16:30:30
204
原创 Unable to create an object of type ‘DbContext‘. For the different patterns supported at 原因
如果没有设置为“始终复制”则可能导致其配置文件无法复制到bin目录下,则。有可能是代码中设置数据库连接的文件没有设置为“始终复制”时找不到对应的数据库连接。
2024-08-19 14:00:26
972
原创 如何在asp.net mvc的视图中判断Model的一个属性为null
假设Model.InstFormatID为空。因为最后渲染成html的时候会变成下面的代码。所以得绕一下,改动代码如下。使用如下代码是不能判断的。
2024-05-20 16:52:50
360
原创 JQuery删除指定行
在增加行的js代码中指定函数delInst进行删除行操作。注意,这里传$(this)参数作为当前行的引用。,然后调用JQuery的remove操作即可。
2024-02-05 09:36:32
670
原创 JQuery的$(this)在if之后会变化
此时用浏览器调试发现,每选择一次下拉框就会导致链接字符串变长。$(this)`了。此时不再有链接长度变长的情况。
2024-01-22 16:47:38
513
原创 运算符的优先级(规矩是人定的)
先乘除后加减的本质就是运算符的结合性9+5*2等价于9+(5*2)这里要注意一个问题,无论是都是左结合的。因此加减法的产生式为乘除法的产生式为现在问题是如何把上述两个产生式混合在一起,并且符合先乘除后加减。
2024-01-02 22:38:03
727
原创 运算符的结合性(形神兼备)
在编译原理中,产生式就是权威。表达式如果以某产生式进行语法分析,那么就只能按照它的方式进行表达,且不能具有二义性。但是,在表达式中有时会涉及打括号的问题。很多时候,在原表达式中打括号和原表达式等价。比如但有时候却不等价 ,比如在编译原理中,括号代表了运算符的结合性,如果运算符以左侧为标准则被称为左结合的,此时在左侧打括号和不打括号等价。反之亦然。
2023-12-26 23:41:57
904
原创 二义性(说话装X有罪)
上述二者都是二义性表达,在离散数学上来看都不具有唯一表示。在《编译原理(第二版)》中对二义性有这样的定义一个文法可能有多棵语法分析树能够生成同一个给定的终结符号串,这样的文法称为具有二义性(ambiguous)。注:ambiguous,在英文中是模糊的意思。那么反言之,如果表达式不具有二义性则应为一个文法如果有且只有一棵语法分析树可以生成给定的终结符号串,那么该文法不具有二义性。有关语法分析树的内容参见语法分析树(先看例子再看定义)-优快云博客说话要说明白,意思表达要唯一,不要没事装逼!
2023-12-25 15:17:07
1010
原创 语法分析树(先看例子再看定义)
如果非终结符A有一个产生式A->XYZ,那么在语法分析树种就可能有一个标号为A的内部结,该结点有3个子结点,从左到右标号分别为X、Y、Z。如图给定一个上下文无关文法,则该文法就有一颗语法分析树(parse tree)
2023-12-23 23:16:59
1219
原创 编译器语法推导(1)基本定义(逐句举例对照)
在中,我们讲到了两个概念,分别是终结符号和非终结符号。回忆一下二者。词法单元,不可再变词法变量,尚未确定比如其终结符号为if, (), {}非终结符号为expr, stmt。
2023-12-22 09:46:13
434
原创 什么是文法产生式(尽量写简单了)
一个典型的if-else语句可由下述构造规则表达其中变量名全称stmtstatementexprexpression比如if(i==0){return 1;涉及术语产生式(production)终结符号(terminal)if, (), {}非终结符号(nonterminal)expr, stmt上下文无关文法(context-free grammar)由四部分构成终结符号集合:也被称为”词法单元“非终结符号集合:也称为”语法变量“产生式集合。
2023-12-21 16:10:34
970
原创 什么是DAG(只讲概念不讲算法)
编译器的目的是将源程序编程目标代码(汇编)放入计算机执行。这里有一个问题,世界上有很多不同架构的CPU,比如x86,ARM等。不同架构的CPU有不同的汇编。于是上图带来的问题是直接从源程序翻译成不同架构CPU的目标代码工作量太大且容易出错。正确的做法是在和中间加一层作为桥梁,将其衔接起来。
2023-12-21 11:24:15
1118
原创 Selector选择器在AspNetCore中的用法
项目编辑过程中会选择其所属的上级项目,而上级项目在数据结构中是以ParentID的方式表达,而非Project类型,用户不会记录也不应该记录ID值,因此应提供Selector项目下拉框供用户选择。但是MVC的Razor页面绑定数据时绑定的时单个对象或者IEnumerate集合对象,因此,如果在页面上绑定项目列表则成为完成的难题。
2023-09-07 14:42:06
241
原创 How to resolve the update problem tracking instance in many-to-many in EFCore 7.0.10
【代码】How to resolve the update problem tracking instance in many-to-many in EFCore 7.0.10。
2023-09-01 14:17:06
159
原创 openjdk11 compiling failure undefined JvmtiSampledObjectAllocEventCollector::object_alloc_is_safe_to
【代码】openjdk11 compiling failure undefined JvmtiSampledObjectAllocEventCollector::object_alloc_is_safe_to。
2023-05-26 14:34:31
192
VS2005最简单的OpenGL例子
2010-02-12
ARM汇编语言的系统号调用例程
2020-09-27
图形学DDA画直线算法
2010-02-12
TA创建的收藏夹 TA关注的收藏夹
TA关注的人