跟我一起自己写编译器-123.引言
nexthexonextbutterflyvolantisyearnyiliashokaindigoapollolandscapecactusmateryicarusfluidmaterial
1. 引言想做编译器很久了,大学期间留下了不少遗憾,没有实现自己的编译器,没有实现自己的JVM,没有实现自己的数据库,当然这其中有很多原因,比如学院的要求太松,比如自己也不够主动,经过两个多月的学习,笔者的Pava1.0以及Pava编译器已经发布,这篇Blog主要介绍理论,将引导读者一步一步构建一个自己的编译器。
2. 学习重点开发编译器我能学到什么?编译器本身吗?其实不对,我们设计编译器的时候,会遇到很多问题,解决这些问题的方法才是最终重要的东西。
3. 编译器的流程从头开发一个编译器是非常困难的,这涉及到很多知识点,这一部分主要介绍现代编译器的架构。
龙书上把编译器分为前端和后端两个部分,源代码首先经过前端转化为中间代码,中间代码经过后端转化为汇编文件。此后的工作就不是编译器的管理范围了,接下来由汇编器和链接器将汇编文件转化为可执行文件。
12graph LR 源代码 --编译器前端-- ...
Educational Codeforces Round 112 (Rated for Div. 2)
nexthexonextbutterflyvolantisyearnyiliashokaindigoapollolandscapecactusmateryicarusfluidmaterial
比赛链接https://codeforces.com/contest/1555
1. A. PizzaForces1.1. 题意6元15个物品,8元20个物品,10元25个物品
现在需要买至少n个物品,问需要多少钱
1.2. 做法首先看单价,发现他们都相同,然后就是尽量不要多买了。
如果n比15,20,25的最小公倍数的两倍还要大,则多出的这一部分,可以考虑直接购买6元的,剩下的小范围dp即可
核心思想: 大范围贪心,小范围dp
notes: 注意一定是至少两倍以上才能贪心
1.3. 代码1234567891011121314151617181920212223242526272829303132333435#include <bits/stdc++.h>using namespace std;int main() { std::ios::sync_with ...
Codeforces Round #734 (Div. 3)
nexthexonextbutterflyvolantisyearnyiliashokaindigoapollolandscapecactusmateryicarusfluidmaterial
比赛链接https://codeforces.com/contest/1551
1. A. Polycarp and Coins1.1. 题意给你一个数n,你要把他拆为$c_1+2c_2$的形式,你需要最小化$c_1$和$c_2$的差
1.2. 做法对模3的余数进行分类讨论
1.3. 代码123456789101112131415161718192021222324#include <bits/stdc++.h>using namespace std;int main() { std::ios::sync_with_stdio(false); cin.tie(); int step; cin >> step; while (step--) { int n; cin >> n; ...
UML图表指引
nexthexonextbutterflyvolantisyearnyiliashokaindigoapollolandscapecactusmateryicarusfluidmaterial
UML
统一建模语言(英语:Unified Modeling Language,缩写 UML)是非专利的第三代建模和规约语言。UML是一种开放的方法,用于说明、可视化、构建和编写一个正在开发的、面向对象的、软件密集系统的制品的开放方法。UML展现了一系列最佳工程实践,这些最佳实践在对大规模,复杂系统进行建模方面,特别是在软件架构层次已经被验证有效。
摘自: 维基百科,自由的百科全书
类图类图主要描述的是类与类之间的关系,这些关系分为泛化关系(generalization)、实现关系(realize)、聚合关系(aggregation)、组合关系(composition)、关联关系(association)、依赖关系(dependency)
泛化关系泛化即类的继承,自行车继承车,猫继承动物,
所以自行车是车的泛化,猫是动物的泛化,男人是人的泛化 (箭头应该是空心)
1234classDiagr ...
VK Cup 2021 - Elimination (Engine)
nexthexonextbutterflyvolantisyearnyiliashokaindigoapollolandscapecactusmateryicarusfluidmaterial
比赛链接VK Cup 2021 - Elimination (Engine)
1. A. Binary Decimal1.1. 题意给你一个十进制数,你要把它拆成多个只由0和1组成的十进制数之和,问最少拆几个。
1.2. 做法答案就是十进制数每个位上的数中的最大值
1.3. 代码1234567891011121314151617181920#include <bits/stdc++.h>using namespace std;int main() { std::ios::sync_with_stdio(false); cin.tie(); int n; cin >> n; while (n--) { int x; cin >> x; int mx = 0; ...
Codeforces Round #729 (Div. 2) - E1
nexthexonextbutterflyvolantisyearnyiliashokaindigoapollolandscapecactusmateryicarusfluidmaterial
题目大意:你需要计算有多少对满足长度为n的排列$p$和$q$,满足$p$字典序>$q$ 且 $inv(p)<inv(q)$,答案取模
$inv$ 为逆序对个数
做法:设$f(i,j)$为长度为$i$、逆序对个数为$j$的排列的个数 , 考虑第一个数字为$t$
$f(i,j) = \sum_{t \in [1,i]} f(i-1,j-t+1)$
一个填$u$,另一个填$v$ $u<v$
$$\begin{aligned}ans[i] \&= i * ans[i-1] + \sum_{1<=u<v<=i, x+u>y+v} f(i-1,x)\cdot f(i-1,y) \&= i * ans[i-1] + \sum_{x-y>v-u, 1<=u<v& ...
通过开源项目获取jetbrains全家桶License
nexthexonextbutterflyvolantisyearnyiliashokaindigoapollolandscapecactusmateryicarusfluidmaterial
JetBrains License不要用破解版本的JetBrains软件OK?凭自己的能力获取他的License不行吗?
先来看看这个页面,这里介绍了开源项目的定义
满足开源定义。
正在积极开发中,即在过去 3 个月内定期提交新代码提交。
不提供开源软件的付费版本或围绕开源项目的任何商业服务(例如付费支持、咨询等)。
不由商业公司或组织(非政府组织、教育、研究或政府)资助的。
不为核心项目开发商付钱。
换句话说,只要你有一个在过去 3 个月内定期提交的开源项目,且非商业模式,你就可以获取JB的License
然后你就来这里申请
几天后就能给你结果了
redis源码
nexthexonextbutterflyvolantisyearnyiliashokaindigoapollolandscapecactusmateryicarusfluidmaterial
版本使用6.2.4
sds.h sds.c内存对齐__attribute__((__packed__))可以让编译器对结构体不进行内存对齐,详细参考
1234567891011121314151617181920212223242526#include <stdint.h>#include <stdio.h>struct __attribute__((__packed__)) sdshdr64 { uint64_t len; /* used */ uint64_t alloc; /* excluding the header and null terminator */ unsigned char flags; /* 3 lsb of type, 5 unused bits */ char buf[]; ...
Flink学习
nexthexonextbutterflyvolantisyearnyiliashokaindigoapollolandscapecactusmateryicarusfluidmaterial
运行源码我们将运行1.13.0版本的Flink,其scala环境为2.12
Step1. 获取学习项目1git clone https://github.com/fightinggg/flink-src-study.git --recursive
在这个项目中,笔者把flink源码作为了一个git submodule放置于文件夹flink中,用来临时查看,当然我个人不建议看这些代码,因为这个文件夹太大了,IDE都不能很好的处理他。
然后就可以直接运行了
Step2. Enjoy It现在你可以直接从这里进入flink的控制台http://localhost:8081, 你也可以直接在ideal中调试flink。
Step3. Debug自己设断点就好了。
使用Flink下面使用flink-examples-streaming_2.12-1.13.0来演示
执行环境这个包下的所有的ex ...
自己动手写Docker
nexthexonextbutterflyvolantisyearnyiliashokaindigoapollolandscapecactusmateryicarusfluidmaterial
容器与开发语言容器随着云计算领域的兴起,容器这个词出现了,但是什么是容器?
容器英文名Container,是基于Linux Namespace以及Cgroups技术实现的具备隔离特性的一组进程。
OK,他是一组具备隔离特性的进程。
虚拟机虚拟机是使用Hypervisor技术提供的虚拟化硬件的操作系统。
OK,虚拟机是一个操作系统。
操作系统和进程的区别操作系统是管理软件、硬件的一组进程。
GO这里不做介绍(其实我只能看懂一点点Go代码,没时间学,后面有机会再出这方面的Blog吧)
基础技术Linux NamespaceNamespace即为名称空间,这是一个树状的结构,父名称空间可以看到子名称空间的所有内容,反之则不行。这类似于Spring框架的父子Beanfactory。
Linux 一个实现了6个不同的Namespace
Namespace 类型
系统调用参数
备注
...