编译器开发: 利用图的拓扑排序算法,计算源代码文件之间的依赖关系

原创 2006年05月22日 23:10:00

    我们平常所使用的主流编译器,都具有多源代码文件支持.例如把一些类定义在相应的文件中,要使用到这些类时,需要包含定义这个类的文件(如C++),或引用类所在的名字空间(如JAVA),或将这个文件作为单元引用(如Object Pascal)
    当我们自己要实现一个支持多源代码文件的编译器时,需要在编译某个源代码文件之前,先编译这个源代码所引用到的文件.例如有一个源文件 a.src,里面定义了一个类,内容如下:
class List
{
    public void Add(Object obj)
    {
      ...
    }
}
然后有一个源文件b.src,里面用到了List类,内容如下:
using "a.src"

class Test
{
    public static main(String argv[])
    {
        List objs = new List;
        List.Add(10, 20);  //有语法错误
    }
}
在编译b.src时,如果a.src文件未被预先编译,编译器将无法识别List类,也无法判断List类是否具有成员函数Add,以及对Add的调用参数列表是否正确等.这时就需要先分析b.src引用了哪些文件,这些文件又引用到了其它哪些文件,并优先编译处于引用列表顶端的文件,并以此类推.
    例如存在下面几个源代码文件A, B, C, D, E. 引用关系如下:
A引用: B, C
B引用: D, E
C引用: B, E
D引用: E
E没引用其它文件,这里需要的编译顺序应该如下:
E D B C A

另外,在文件引用关系中不能出现互相引用,这样会导至无法编译.

    在了解了为什么要计算源代码依赖关系后,就可以开始实现具体的算法了,可以把这一步放在词法分析之后,语法分析之前来做. 因为词法分析之后,可以很容易的分析出一个源文件引用了哪些其它源文件,如果把这一步放在预处理中专门来做的话,同样需要做去注释,拆词等工作,产生了不必要的重复.
    计算源代码依赖关系的算法比较简单,可以先把所有源代码文件看成一个个的顶点,一个顶点(源代码文件)如果引用了另一个顶点,就增加一条从当前顶点到被引用顶点的出边,当增加完所有顶点的出边后,正常情况下这些顶点就形成了一个有向无环图如下图:(如果出现了环,说明源代码文件中产生了错误的循环引用)


    此时采用图的无后继顶点优先拓扑排序方法即可,无后继是指出度为0(即没有出边),即每次删除图中出度为0的顶点和顶点的入边,一直删到没有出度为0的顶点为止,如果删除的顶点数小于图中所有的顶点数,则此图有环,并报错.算法描述如下:
//G为图
void FirstTopSort(G)
{
    while(G中有出度为0的顶点)
    {
       从G中找一个出度为0的顶点v且输出v;
       从G中删去v及v的所有入边
    }
    if(输出的顶点数目 < G的顶点数)
          printf("源代码文件存在循环引用!");
}
示意图如下:
先删除第一个出度为0的顶点E和E的入边,并记录E

此时D出边为0,删除D和D的入边,并记录D

再删除和记录B

再删除和记录C,最后是A
记录的顺序即是结果 E D B C A

拓扑排序关键路径算法C语言完整代码

  • 2016年01月17日 16:05
  • 2KB
  • 下载

题二 源代码编译:拓扑排序

一、题目时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 在网易游戏的日常工作中,C++ 是一门常用的语言。面对众多的 C++ 代码,等待源文件编译的漫长时间是个令...
  • Scythe666
  • Scythe666
  • 2016年03月19日 11:42
  • 646

拓扑排序的原理及其实现

本文将从以下几个方面介绍拓扑排序: 拓扑排序的定义和前置条件和离散数学中偏序/全序概念的联系典型实现算法 Kahn算法基于DFS的算法 解的唯一性问题实际例子 取材自以下材料: http:...
  • dm_vincent
  • dm_vincent
  • 2012年07月04日 13:27
  • 161861

依赖在代码中的几种表现形式

1.依赖关系用虚线加箭头表示,依赖关系是五中关系中耦合最小的一种关系 2.依赖关系的三种表现形式(以动物和水为例): (1)Water类是public的,Animal类可以调用它。 (2)w...
  • u013046597
  • u013046597
  • 2015年02月09日 19:11
  • 1424

六、图的拓扑排序

一、概述   对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若 ∈E(G),则u在线性序...
  • jazywoo123
  • jazywoo123
  • 2012年09月14日 09:46
  • 809

拓扑排序算法详解

一、定义:是将一个有向无环图G的所有的顶点排成一个线性序列,使得有向图中的任意的顶点u 和 v 构成的弧属于该图的边 集,并且使得 u 始终是出现在 v 的前面。通常这样的序列称为是拓扑序列。 ...
  • shao1996
  • shao1996
  • 2016年11月10日 20:25
  • 667

拓扑排序的原理及其实现

原博客链接:http://blog.csdn.net/dm_vincent/article/details/7714519 本文将从以下几个方面介绍拓扑排序: 拓扑排序的定义和前置条件 ...
  • sdfgdbvc
  • sdfgdbvc
  • 2016年04月22日 09:45
  • 538

拓扑排序实例

在前面的文章《深度优先搜索 》中介绍了拓扑排序,这里看两道相关题目 1.Course Schedule There are a total of n courses you have to take...
  • cumtwyc
  • cumtwyc
  • 2016年03月09日 10:31
  • 448

有向图的拓扑排序——基于邻接矩阵

http://blog.csdn.net/jinzhao1993/article/details/51778468 1. 拓扑排序的概念 定义:将有向图中的顶点以线性方式进行排序。即对于任...
  • taotaoah
  • taotaoah
  • 2016年10月06日 21:46
  • 858

拓扑排序 topsort()

/** 不知道topsort 排序有没有专门的算法,不过今天贴这个挺简单的,也好理解 拓扑排序就是,给出一系列的需求关系,求一个序列,这个序列完全满足这里面 的全部需求,直到...
  • zcube
  • zcube
  • 2015年09月05日 10:15
  • 633
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:编译器开发: 利用图的拓扑排序算法,计算源代码文件之间的依赖关系
举报原因:
原因补充:

(最多只允许输入30个字)