- 博客(61)
- 收藏
- 关注
原创 自己动手写JVM——(5)类与对象机制 操作静态数据
以上代码就是实际上给静态变量赋值的过程了,找到该Field对应的SlotId,找到Field的类的Slots,并在对应的Slot设置从操作数栈顶弹出的数据。
2022-10-11 18:53:02
243
原创 自己动手写JVM——(4)类与对象机制 NEW指令的实现
类引用包含了一些可以索引到对应类的必要信息,通过这些必要信息我们可以获取该类的具体信息,这个过程就是解引用。
2022-10-09 15:29:54
411
原创 自己动手写JVM——(1) 虚拟机的构造与运行
自己动手写JVM 在class文件文件中会有Code AttributeInfo 其中包含了jvm字节码,通过解析这些字节码,翻译成对应的指令,再逐步执行这些我们已经实现好了的指令,就实现了一个有效的虚拟机
2022-10-05 21:53:45
1109
原创 c++ 内存管理 3 malloc/free 的简单实现(隐式链表/显式链表)
malloc/free#include <iostream>#include <cstdint>using namespace std;int main(int argc, char *argv[]) { int b1[4]{1, 2, 3, 4}; // 16 align int b2[5]{5, 4, 3, 2, 1}; cout << b1 << " " << b2 << endl; //cout
2021-12-26 19:38:06
1013
原创 c++ 内存管理 1 primitives
内存管理对于极致的性能至关重要 本专栏以cpp内存管理为例 粗浅地讨论一下1 new / delete 2 allocator 3 malloc/free
2021-12-25 17:47:55
798
原创 C++程序设计兼谈对象模型设计
C++程序设计兼谈对象模型设计转换函数#include <iostream>class Fraction{public: Fraction(int num, int den = 1) : m_numerator(num), m_denominator(den) {} operator double() const { return ((double)m_numerator/m_denominator); }private: int m_numerator;
2021-11-10 10:39:53
923
原创 C++面向对象高级编程
C++面向对象高级编程概览#ifndef COMPLEX_H_#define COMPLEX_H_class complex{private: double re, im;public: complex (double r = 0, double i = 0) : re (r), im (i) {} // 构造函数 complex& operator += (const complex&); // 函数声明 double real () const {retur
2021-11-10 10:26:48
2424
2
原创 学C 一篇就够了
概览项目地址https://github.com/impact-eintr/LinuxCc的历史1960 原型A语言->ALGOL语言1963 CPL语言1967 BCPL1970 B语言1973 C语言C语言特点基础性语言语法简洁 紧凑 方便 灵活(得益于指针)运算符 数据结构丰富结构化 模块化编程移植性好 执行效率高允许直接对硬件操作学习建议概念的正确性动手能力主动阅读优秀的程序段大量练习,编程是技术不是理论学习思路基本概念数据类型 运算
2021-10-26 16:21:27
1036
1
原创 动手写个网络协议栈吧2.1 一个侵入式链表的实现
链表以及golang介入式链表的实现链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer)。由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而顺序表相应的时间复杂度分别是O(logn)和O(1)。简单的说链表是一个具有逻辑顺序的线性表,每一个节点里存到下一个节点的指针。链表有啥用?因为链表插入很
2021-09-07 21:03:35
167
原创 动手写个网络协议栈吧 1 基本背景
TCPIP 和开放系统互连(OSI)模型本节先简单介绍互联网的发展史,然后讲解 TCPIP 和开放系统互连(OSI)模型,最后会介绍一下用户态协议栈的整体框架。计算机互联网发展史最开始的时候计算机是单独运算的,一般有一个大型主机放在那里,然后可以多个终端连接一个主机进行操作。那时候美国国防部认为,如果仅有一个集中的军事指挥中心,万一这个中心被原苏联摧毁,全国的军事指挥将处于瘫痪状态,其后果将不堪设想,因此有必要设计这样一个分散的指挥系统,它由一个个分散的指挥点组成,当部分指挥点被摧毁后其它点仍能正常工
2021-09-05 17:51:29
802
原创 自己动手写docker 2构建容器
构建容器linux proc 文件系统linux下的/proc文件系统是由内核提供的,它其实不是一个真正的文件系统,只是包含了系统运行时的信息(比如系统内寻、mount设备信息、一些硬件配置等),它只存在于内存中,而不占用外存空间。它以文件系统的方式,为访问内核数据的操作提供借口。实际上,很多系统工具都是简单地去读取这个文件系统的某个文件内容, 比如lsmod = cat /proc./modules当遍历这个目录的时候,会发现很多数字,这些都是为每个进程创建的空间,数字就是它们的 PID 。下面介
2021-08-30 18:38:03
455
原创 自己动手写docker 1 基础知识
基础知识Linux Namespacelinux namespace是kernel的一个功能,他可以隔离一系列的系统资源(PID UserID Network)package mainimport ( "log" "os" "os/exec" "syscall")func main() { cmd := exec.Command("bash") cmd.SysProcAttr = &syscall.SysProcAttr{ Cloneflags: syscall.CL
2021-07-05 10:40:46
621
原创 golang 实现简单的令牌桶
golang 实现简单的令牌桶令牌桶算法图示令牌桶按固定的速率往桶里放入令牌,并且只要能从桶里取出令牌就能通过,令牌桶支持突发流量的快速处理。对于从桶里取不到令牌的场景,我们可以选择等待也可以直接拒绝并返回。代码实现type TBF interface { Fetchtoken(int64) (int64, error) Returntoken(int64) (int64, error) Destory() error}type tbf_st struct { cps int
2021-06-10 21:15:40
600
转载 java程序设计 3 复用
复用代码复用是面向对象编程(OOP)最具魅力的原因之一。对于像 C 语言等面向过程语言来说,“复用”通常指的就是“复制代码”。任何语言都可通过简单复制来达到代码复用的目的,但是这样做的效果并不好。Java 围绕“类”(Class)来解决问题。我们可以直接使用别人构建或调试过的代码,而非创建新类、重新开始。如何在不污染源代码的前提下使用现存代码是需要技巧的。在本章里,你将学习到两种方式来达到这个目的:第一种方式直接了当。在新类中创建现有类的对象。这种方式叫做“组合”(Composition),通
2021-05-27 20:52:04
266
转载 Java程序设计 2 封装
封装所有优秀的作者——包括那些编写软件的人——都知道一件好的作品都是经过反复打磨才变得优秀的。如果你把一段代码置于某个位置一段时间,过一会重新来看,你可能发现更好的实现方式。这是重构(refactoring)的原动力之一,重构就是重写可工作的代码,使之更加可读,易懂,因而更易维护。包包内包含一组类,它们被组织在一个单独的namespace下例如,标准Java发布中有一个工具库,它被组织在java.util命名空间下。java.util中含有一个类,叫做ArrayList。使用ArrayList的一种
2021-05-25 21:06:08
93
转载 Java程序设计 1 初始化与清理
初始化和清除"不安全"的编程是造成编程代价昂贵的罪魁祸首之一。有两个安全性问题:初始化和清理。C 语言中很多的 bug 都是因为程序员忘记初始化导致的。尤其是很多类库的使用者不知道如何初始化类库组件,甚至他们必须得去初始化。清理则是另一个特殊的问题,因为当你使用一个元素做完事后就不会去关心这个元素,所以你很容易忘记清理它。这样就造成了元素使用的资源滞留不会被回收,直到程序消耗完所有的资源(特别是内存)。C++ 引入了构造器的概念,这是一个特殊的方法,每创建一个对象,这个方法就会被自动调用。Java采用了
2021-05-25 16:33:24
144
原创 gin框架快速入门
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title></title></head><body>{{ $v1 := 100 }}{{ if $v1 }}{{ $v1 }}{{ else }}test{{ end }}{{ range $idx,$val := . }} <p>
2021-03-20 20:39:38
457
原创 Hello JavaScript ——5.4 Vue 计算属性 内容分发 自定义事件
计算属性计算属性的重点在属性上,简而言之,他就是一个能将计算结果缓存起来的属性,相当于缓存缓存就意味着,当计算结果没有发生改变时,不需要每次都重新计算,可以提高一定的系并发量<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>HelloWorld!</title></head><body> &
2021-03-03 17:06:24
164
1
原创 Hello JavaScript ——5.2 Vue表单双绑、组件
双向绑定v-model文本框<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>HelloWorld!</title> <!--这里也可以存放--></head><body> <div id="app"> 输入: <
2021-03-02 18:49:50
85
原创 Hello JavaScript ——5.1 Vue快速入门
VueVue是一款渐进式的js框架,所谓渐进式就是逐步实现新特性的意思,比如实现模块化开发、路由、状态管理等新特性,其特点是综合了Angular(模块化)和React(虚拟Dom)的优点SOC原则(关注点分离)HTML + SCSS + JS: 视图层 给用户看的,或者刷新后台发送来的数据{{}}<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <
2021-03-02 17:54:12
130
原创 go专家编程系列(5)函数
函数函数的一生我们按照编程语言的语法定义的函数,会被编译器编译为一对对机器指令,写入可执行文件,程序执行时,可执行文件被加载到内存,这些机器指令对应到虚拟空间地址中,位于代码段,如果在一个函数中调用另一个函数,编译器就会对应生成一条call指令,程序执行到这一条指令时,就会跳到函数如后出开始执行,而每个函数的最后都有一条ret指令,负责在函数结束后条会到调用处继续执行。运行时内存的布局如图在golang中,函数栈帧布局是这样的call指令只做两件事将下一条指令的地址入栈,也就是返回地址跳
2021-03-02 10:39:33
129
原创 go专家编程系列(6)闭包
闭包函数的特殊地位函数在go中是头等对象func A(){ ...}作为参数传递func B(f func()){ ...}作为返回值func C() func() { return A}绑定到变量var f func() = C()go称这样的参数、返回值或变量为function value函数的指令在编译期间生成,而function value本质上是一个指针,但是并不直接指向函数指令入口,而是指向一个runtime.funcval结构体,
2021-03-02 08:42:14
159
原创 Hello JavaScript ——4 JQuery
JQueryjQuery引入<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.js"></script>使用公式: $(selector).action()$('p').click();$('#id1').click();$('.class1').click();鼠标事件<!DOCTYPE html><html lang="en"><h
2021-03-01 10:49:53
81
原创 Hello JavaScript ——3 面向对象
面向对象其实是基于对象创建对象闭包(难点)箭头函数(新特性)class继承原型链继承(难点)操作Dom元素插入Dom更新Dom删除Dom操作Bom元素windownavigatorscreenlocationDocumentHistory操作表单操作文件...
2021-03-01 09:00:54
108
原创 Hello JavaScript —— 2 函数
函数函数定义定义方式1function abs(x){ if (x >= 0){ return x; }else{ return -x; }}document.writeln(abs(-2));一旦执行到return代表函数结束,返回结果如果没有执行return 函数执行完也会返回结果,结果就是undefined定义方式2var abs = function(x){ if (x >= 0){
2021-02-27 18:46:11
149
原创 Hello C!\0 1 概览
概览项目地址https://github.com/impact-eintr/LinuxCc的历史1960 原型A语言->ALGOL语言1963 CPL语言1967 BCPL1970 B语言1973 C语言C语言特点基础性语言语法简洁 紧凑 方便 灵活(得益于指针)运算符 数据结构丰富结构化 模块化编程移植性好 执行效率高允许直接对硬件操作学习建议概念的正确性动手能力主动阅读优秀的程序段大量练习,编程是技术不是理论学习思路基本概念数据类型 运算
2021-02-24 10:12:20
89
原创 linux系统编程笔记——网络编程4 TCP
SOCKET编程TCP关于TCP更多细节请看TCP 的那些事儿(上)TCP 的那些事儿(下)步骤Client获取SOCKET给SOCKET取得地址发送连接收/发消息关闭Server获取SOCKET给SOCKET取得地址将SOCKET置为监听模式接受连接收/发消息关闭普通多进程版#ifndef PROTO_H__#define PROTO_H__#include <stdint.h>#define NAMEMAX 512-8-8//(UDP推荐
2021-02-24 10:04:31
165
转载 docker入门与进阶 1 安装docker
Ubuntu Docker 安装使用官方安装脚本自动安装安装命令如下:curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun也可以使用国内 daocloud 一键安装命令:curl -sSL https://get.daocloud.io/docker | sh手动安装卸载旧版本Docker 的旧版本被称为 docker,docker.io 或 docker-engine 。如果已安装,请卸载它们:$ sud
2021-02-21 21:33:31
162
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人