查看开机启动项
1 | systemctl list-unit-files |
会看到有两列,左侧是服务的名字,右侧是服务的状态,enabled代表开机自启
1 | UNIT FILE STATE |
禁用开机启动项
1 | systemctl disable kubelet |
启用开机启动
1 | systemctl enable kubelet |
1 | systemctl list-unit-files |
会看到有两列,左侧是服务的名字,右侧是服务的状态,enabled代表开机自启
1 | UNIT FILE STATE |
1 | systemctl disable kubelet |
1 | systemctl enable kubelet |
经过了前面的LL语法分析,现在我们进入到了LR语法分析,LR语法分析也是一套算法,这里主要介绍两个,一个是SLR算法,领个是LR1算法。
LR语法分析本质上为从左到右自底向上算法,从左到右一个一个读入字符,然后按照产生式进行规约,直到规约出文法开始的符号。
LR语法分析最重要的就是移入和规约。下面举一个例子来理解移入和规约。
1 | 加法:( |
文法的种类有很多,正则文法,上下文无关文法,上下文有关文法。
这一块内容就是我们平时所用到的正则表达式的文法,他的词是各个字符。
上下文无关文法涉及到4个定义
例子
1 | 加法: |
上诉文法可以接受 1+2, 我们只需要把1和2视为number,即可,此时的词法单元就是1,2,+
由于高级程序设计语言基本可以被视为上下文无关文法,文法的语法分析有很多算法,后面会依次对他们进行介绍。
词法分析,如其名,只分析词语,即token,词是一个文法的最小单元。至于什么是文法,后面会介绍,这里不需要过多忧虑。
比如我们有一个代码,这个代码和c/c++很相似(但是这个是pava代码,读者目前可以理解为c代码),这是一个计算斐波那契数列的代码,他的词法分析结果是什么呢?
1 | int fib(int x){ |
下文的代码就是词法分析结果, 词法分析器从源文件依次读取,然后分割出最小的词法单元,
想做编译器很久了,大学期间留下了不少遗憾,没有实现自己的编译器,没有实现自己的JVM
,没有实现自己的数据库,当然这其中有很多原因,比如学院的要求太松,比如自己也不够主动,经过两个多月的学习,笔者的Pava1.0以及Pava编译器已经发布,这篇Blog
主要介绍理论,将引导读者一步一步构建一个自己的编译器。
开发编译器我能学到什么?编译器本身吗?其实不对,我们设计编译器的时候,会遇到很多问题,解决这些问题的方法才是最终重要的东西。
从头开发一个编译器是非常困难的,这涉及到很多知识点,这一部分主要介绍现代编译器的架构。
龙书上把编译器分为前端和后端两个部分,源代码首先经过前端转化为中间代码,中间代码经过后端转化为汇编文件。此后的工作就不是编译器的管理范围了,接下来由汇编器和链接器将汇编文件转化为可执行文件。
1 | graph LR |
为什么编译器要分为两个部分?为什么要分出前端和后端?实际上这样的架构做好以后,只要我们为$m$种源代码编写一个前端,为$n$种架构的机器编写后端,则我们可以组成$n*m$种编译器。当一个新类型的源代码或者新架构的机器出现时,我们可以以更快的速度对编译器进行更新,从而支持这些源代码或机器。另一方面,如果想要对源程序进行优化,编译器前端负责优化吗?还是编译器后端负责优化?这其实是优化器的工作,优化器的输入是中间代码,输出也是中间代码。
https://codeforces.com/contest/1555
6元15个物品,8元20个物品,10元25个物品
现在需要买至少n个物品,问需要多少钱
首先看单价,发现他们都相同,然后就是尽量不要多买了。
如果n比15,20,25的最小公倍数的两倍还要大,则多出的这一部分,可以考虑直接购买6元的,剩下的小范围dp即可
核心思想: 大范围贪心,小范围dp
notes: 注意一定是至少两倍以上才能贪心