跳至主要內容
gRPC入门

什么是 gRPC

前期准备

在本篇内容中,我们将通过go+gin+gRPC的组合来初步认识 gRPC,并实现一个简单的网关应用

Go 环境安装

创建项目

mkdir app-gateway
cd app-gateway
go mod init app-gateway

Chiichen原创大约 3 分钟笔记后端后端gRPCgo
利用Erased-trait进行类型擦除

为什么要类型擦除

这里的类型擦除和通常我们听到的,在 Java 里的类型擦除不太一样,这里的类型擦除是指,通过某些手段,屏蔽掉一些我们不关心的范型,从而达到统一存储的目的,这样说可能很抽象,直接看代码

pub trait Source{
    type Event
    pub fn poll(&self)->Result<Self::Event,SourceError>
}

pub struct SourceEntry<S:Source,T>{
    source:S,
    callback: Box<dyn Fn(S::Event,T)>
}

pub struct SourceList<S:Source,T>{
    sources:Vec<Rc<RefCell<SourceEntry<S,T>>>>
}

Chiichen大约 3 分钟笔记RustRust
vscode+qemu开发Linux内核

参考于QEMU 调试 Linux 内核环境搭建

获取 Linux 源码

编译 Linux 内核

cd /linux
export ARCH=x86
make  x86_64_defconfig
# 如果想要更好的clangd补全就用clang编译(make CC=clang x86_64_defconfig ) ,但是clang在部分模块可能需要特殊的编译选
# 项才能编译,所以还是推荐用默认的gcc编译,尽管这样clangd的效果会差一点

# ./scripts/config --file .config -e CONFIG_NUMA_BALANCE CONFIG_NUMA_BALANCING_DEFAULT_ENABLED CONFIG_NUMA
# Todo 还有一些nuuma_balance相关设置项要打开,不然后面要在编译时手动选择Y

Chiichen大约 2 分钟笔记Linux 内核Linux 内核开发环境
Chapter0 前言

开端

本笔记是本人研究编译器开发rcc的思考笔记,涵盖了在开发过程中的思考和记录,希望有助于其它学生/开发者

语言计划

希望结合 go 语言的指针+gc 的特性和 rust 的错误处理、枚举类型等语法特性,实现一个类似于用 gc+指针 替换掉所有权机制的 rust 语言(r 门),面向非系统场景下的编程。当然这是一个非常初步的目标(写于项目开始 2023/11/03),可能将来会有所改变,但这是初步的目标,以此为勉励吧


Chiichen原创小于 1 分钟笔记编译器编译器
Chapter1 词法分析器之Chumsky

库的选择

一开始我其实是选择的nom这个库来完成词法分析的,但是写了一段时间之后还是选择了chumsky,有几点因素在里面:

  1. 左递归问题:其实nom写起来要比chumsky优雅很多,因为前者的主题是一系列函数指针,类型很清晰,但是后者是泛型对象,一旦报错就是嵌套几十层的泛型可读性几乎为零,而且前者是PEC(Parser Expression Combinator),可以把每个函数的职责划分得很清楚,而后者是 PEG(Parser Expression Generator),相对来说没有这么优雅。但是这一切都被左递归打破了。大多数学生都知道,消除左递归的方法就是重写文法,然而重写文法会导致每个产生式之间的大量耦合,使得原来职责清晰的函数变得很答辩。而chumsky虽然也没有提供便捷的处理方法(#575)但是例如recursive闭包的存在使得这部分处理更加直接明了,相比于nom有更好的可读性
  2. 错误恢复和抛出:在编译器中,错误处理其实是很重要的一部分,这直接关系到用户的编程体验,chumsky恰恰是考虑到了这点,它有一个孪生的ariadne库,可以生成一些可视化程度较高的错误信息,而且在分析的过程中提供了错误恢复的操作,这些都是nom缺乏的

Chiichen原创大约 2 分钟笔记编译器编译器词法分析