Graphvizをさらに試す

Graphvizで木が簡単に描けそうなので、関数呼び出ししているプログラムの依存関係の絵を描くことを試みる。手元の適当なプログラムで試す。Fortranのコードなので、関数ではなくサブルーチンだけど。

各サブルーチンの中で呼ばれているサブルーチンを洗い出して、呼ぶ方と呼ばれる方の関係をまとめた。その関係をDOT言語の形式で書きだす。

下はソース。Pythonで記述。

import os

moji1 = '      SUBROUTINE'
moji2 = '      CALL '
D2 = {}
all_files = [x for x in os.listdir('.') if x[-1]=='f']
dot_file = open('./test.dot', 'w')

for one_file in all_files:
    L = open(one_file, 'r').readlines()
    tmp = []
    for iline in L:
        sub_start_line = iline.find(moji1)
        sub_end_line = iline.find('(')
        if sub_start_line != -1:
            sub_name = iline[len(moji1):sub_end_line]

        call_start_line = iline.find(moji2)
        call_end_line = iline.find('(')
        if call_start_line != -1:
            call_name = iline[len(moji2):call_end_line]
            if len(call_name) == 6:
                tmp.append(call_name)

    D2[sub_name] = tmp

dot_file.write('digraph test {\n')
dot_file.write('size="6,6";\n')
dot_file.write('node [color=lightblue2, style=filled];\n')

for SUB in D2.keys():
    for NAM in D2[SUB]:
        string = '"' + SUB + '" -> "' + NAM + '";\n'
        dot_file.write(string)
dot_file.write('}\n')
dot_file.close()

test.dotというファイルができるので、それをGveditでRunする。
結果の図↓

お、分かりやすく描けるな。プログラムを目で追うよりも構造が感覚的に理解できる。