Posts List

学习Graphviz

使用go语言开发的朋友应该对pprof不会陌生,pprof可以导出像下面这种图: 那么问题来了,这是怎么生成的呢? 答案就是――Graphviz。 Graphviz Graphviz是一个自动化绘图的工具,用于绘制DOT语言描述的图形。 QuickStart 废话不多说,先上个例子,安装配置不讲了自己找。 假设我们描述一个简单的解释器的执行流程: 1. 获取输入(getInput) 2. 解析输入字符串(parse),成功转到3,失败转到5 3. 对parse出的AST求值(evaluate),成功转到4,失败转到6 4. 输出求值结果(putResult) 5. 提示语法错误(throwSyntaxError) 6. 求值过程出现异常,比如除0等(throwRuntimeError) 创建一个文件,名为interpreter.dot,并写入以下代码: digraph Interpreter { getInput -> parse -> evaluate -> putResult; parse -> throwSyntaxError; evaluate -> throwRuntimeError; } 在终端执行以下命令: dot -Tpng interpreter.dot -o interpreter.png 于是就得到了下面这张图: 这里生成的是png格式,也可以生成其它格式的文件,比如pprof生成的就是svg格式的。 DOT语言介绍 这是Graphviz文档里的DOT语法: graph: [ strict ] (graph | digraph) [ ID ] '{' stmt_list '}' stmt_list: [ stmt [ ';' ] stmt_list ] stmt: node_stmt | edge_stmt | attr_stmt | ID '=' ID | subgraph attr_stmt: (graph | node | edge) attr_list attr_list: '[' [ a_list ] ']' [ attr_list ] a_list: ID '=' ID [ (';' | ',') ] [ a_list ] edge_stmt: (node_id | subgraph) edgeRHS [ attr_list ] edgeRHS: edgeop (node_id | subgraph) [ edgeRHS ] node_stmt: node_id [ attr_list ] node_id: ID [ port ] port: ':' ID [ ':' compass_pt ] | ':' compass_pt subgraph: [ subgraph [ ID ] ] '{' stmt_list '}' compass_pt: (n | ne | e | se | s | sw | w | nw | c | _) 详情请见:https://graphviz.