我更简单的死码卸妆

Mut*_*han 2 c algorithm dead-code

我正在以一种非常简单的方式对死代码去除器进行刺激.

为此,我的想法是,

步骤1:逐行读取输入的C-Program并将其存储在双链表或数组中(因为删除和插入比文件操作更容易).

怀疑:我的方法是否正确?如果是这样,如何最小化每次遍历链接列表.

第2步:分析读取字符串将并行完成,并创建表以维护变量名称及其详细信息,函数及其调用等,

步骤3:将对变量表中的每个条目进行搜索,并且变量将被其时间的值替换(就像它一样).(例如)

i=0;
if(i==3) will be replaced by if(0==3).
Run Code Online (Sandbox Code Playgroud)

但在像......这样的情况

get(a);
i=a;
if(i){} 
Run Code Online (Sandbox Code Playgroud)

在这里,'我'将不会被替换,因为它取决于另一个变量.'a'不会被替换,因为它取决于用户输入.

怀疑:如果用户输入是if(5*5 + 6){print hello;},那肯定是不必要的检查.如何解决这个表达式来简化代码{print hello; }

步骤4:将搜索字符串if(0),while(0)等,并使用堆栈,移除动作块.if(0){//这将被删除*/}

步骤5 :(例如)函数foo(){/**/} ... if(0)foo(); ...,删除所有死代码后,检查函数表中的foo()条目以获得no.of.times它在代码中被引用.如果为0,则必须使用相同的堆栈方法删除该函数.

步骤6:在剩余的函数中,除了'}'之外,将删除返回语句下面的行(如果有的话).这种删除一直持续到功能结束.使用堆栈标识函数的结尾.

第7步:我将假设我的无死代码现已准备就绪.将链接列表或数组存储在输出文件中.

我的问题是...... 1.我的想法是否有意义?还是可以实施?如何改进此算法?

虽然我试图实现这个想法,但我必须更多地处理字符串操作而不是删除死代码.有没有办法减少此算法中的字符串操作.

Hen*_*olm 7

不要这样做.C是一种自由形式的语言,并且尝试逐行处理它将导致支持C的一个子集,这个C子集非常受限制,因此它不值得使用.

你需要做的是编写一个合适的解析器.关于那方面有很多文献.找出你的学校在其编译器构建课程中使用哪本教科书,并完成这项工作 - 或者只是选修课程!只有当你解析了解析器时,你才开始考虑语义.然后在抽象语法树而不是字符串上进行工作.或者,找到一个已经编写并经过测试的C解析器,您可以重复使用(但是为了将它与您自己的处理集成,您仍然需要学习很多).

如果您最终自己编写解析器,并且仅用于您自己的启发,请考虑使用比C更简单的语言作为主题.尽管C at核心在语言方面相当紧凑,但是获取声明语法的所有细节都是非常棘手的,并且可能会使您从实际感兴趣的内容中贬低.预处理器的存在本身就是一个问题这使得设计有意义的源到源转换变得非常困难.

顺便说一句,你描绘的转换在行业中被称为"常量传播",或者(在更具野心的变体中,当它们具有不同的常量输入时将克隆函数和循环体)"部分评估".谷歌搜索这些术语可能很有趣.