纯粹做学习记录,如有错误非常欢迎指出(

课程笔记

lesson2

invokespecial: call constructor, call superclass methods, call private methods

invokevirtual: instance methods call(virtual dispatch)

invokeinterface: cannot optimization, checking interface implementation

invokestatic: call static methods

method signature: class name: return type method name(para1,para2)

clinit初始化类的静态属性

image-20230928234548732

类加载和初始化是两个操作,加载了不一定初始化。

1
2
3
class A{
B b = ...
}

上方的情况,b直接会被加载到内存,即使什么也没干,也没有进行new之类的操作。加载后就会初始化调用clinit的方法。而init是new的时候会调用。

lesson3

Reaching Definitions

may analysis:输出的信息可能为正确,保证了soundness,可能的情况都考虑

must analysis:输出的信息必须正确

boundary condition都可以用语义进行分析

image-20230929171619363

比如这里的第一行。因为没有definition会经过out,所以out[entry]为空

may analysis一般为空,must analysis一般为top

image-20230929174210576

很重要的两句话,data-flow value指的就是该图的八个01序列,也代表着每个block的abstract,表示了当前的block会被哪些statement作为definition

gens and kills remain unchanged

when more facts flow in IN[S],the “more” facts either

  • is killed
  • flows to OUT[S](survivors)

when a fact is added to OUT[S],through either gens,or survivors,it stays there forever

Thus OUT[S] never shrinks

As the set of facts is finite,there must exist a pass of iteration during which nothing is added to any OUT, and then the algorithm terminates

image-20230929180027173

算法在out没有任何 changes的时候停止,因为此时reach了一个fixed point也就是不动点。因为如果IN不变OUT不变,OUT不变IN不变,所以如果without changes整个系统相当于静止了。

lesson4

!!!!!视频的1h25开始多看几遍理解一下,第一遍没看懂

live Variables Analsys

注意这个图的use的意思是used before redefiniton,不是纯粹的use。解释了死代码检测的transfer function

image-20231004104852812

image-20231004105122142

实际操作一遍需要注意的地方是,首先如果backward的时候block有两个及以上的out,首先铭记公式

$OUT[B] = U_{s a suuccessor of B}IN[S];$

意思就是block的OUT是由该block的所有后继块的IN union而成的。所以我们直接找到其所有后继块的IN然后U一下就行了,接着有了OUT就可以求block的IN

Available Expressions Analysis

和表达式有关,还是一句话,跟着公式定义去走几遍,就能理解了

其中块内是expression one by one去执行的,所以可能会有顺序的差别,不同的expreesion的in是和相邻的expression相关的

image-20231004105209381

image-20231004105235624

这里意思就是,如果一个expression是available的,但是report出来是unavailable,此时是满足must的,也就是under-approximation的。实际运用的时候只是相当于少了几处优化,不会导致代码出错。

image-20231004105219416

注意这里先redefine了x,后面又生成了一个e^7x,这里是需要先进行kill再gen,最后还是会有e^7x

image-20231004105249066

最后是不能忘记的图

image-20231004105303971

实验记录

Assignment 1

10.5

研究半天没搞懂咋验证实验的,第一天基本就看看手册看看框架看看api和注释吧

10.10

中间有事没看。9号返回学校高铁上看了一集data analysis - foundmentation。今天接着看

终于看懂实验咋做的了,之前还是没看懂框架。

写了几个函数,明天结束这个实验

11.15

完成第一个实验