亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

go-callvis源碼是什么

發布時間:2021-10-14 14:57:21 來源:億速云 閱讀:107 作者:iii 欄目:編程語言

這篇文章主要介紹“go-callvis源碼是什么”,在日常操作中,相信很多人在go-callvis源碼是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”go-callvis源碼是什么”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

go-callvis 是一個可視化調用調用鏈路圖的靜態源碼分析工具

https://github.com/ofabry/go-callvis

它的實現非常簡潔

 examples        handler.go      output.goMakefile        analysis.go     go.mod          images          version.goREADME.md       dot.go          go.sum          main.go

首先看下main.go文件

首先解析了一系列參數然后調用

  Analysis = new(analysis)  if err := Analysis.DoAnalysis("", tests, args); err != nil {    log.Fatal(err)  }

最后起了一個http服務,可以支持在線可視化

type analysis struct {  opts   *renderOpts  prog   *ssa.Program  pkgs   []*ssa.Package  mains  []*ssa.Package  result *pointer.Result}

定義在analysis.go文件里,重點是通過下面這個函數進行代碼分析的

func (a *analysis) DoAnalysis(  dir string,  tests bool,  args []string,) error

調用

  "golang.org/x/tools/go/packages"

里面的

  initial, err := packages.Load(cfg, args...)

加載包里面所有的文件,然后調用

"golang.org/x/tools/go/ssa/ssautil"

里面的

  prog, pkgs := ssautil.AllPackages(initial, 0)  prog.Build()

對源碼進行ssa轉化

然后找到入口的main函數

mains, err := mainPackages(pkgs)

就是判斷包名和函數名

 p.Pkg.Name() == "main" && p.Func("main")

然后用

"golang.org/x/tools/go/pointer"

的指針分析,進行依賴分析

result, err := pointer.Analyze(config)

至此,完成了源碼的依賴分析,然后應用dot語言,轉化成圖像。

func outputDot(fname string, outputFormat string) {  // get cmdline default for analysis  Analysis.OptsSetup()
 if e := Analysis.ProcessListArgs(); e != nil {    log.Fatalf("%v\n", e)  }
 output, err := Analysis.Render()

SSA在Go1.7中被引入,這個特性對編譯器的性能有很大的提高,但是也導致編譯過程有些減速。下面來結合網上的資糧和書籍,簡單說明一下SSA以及SSA的應用。

SSA 代表 static single-assignment,是一種IR(中間表示代碼),要保證每個變量只被賦值一次。這個能幫助簡化編譯器的優化算法。

 y := 1
y := 2
x := y

比如上面這段代碼,y = 1其實是不可用的,這個要通過定義的可達分析來確定y是要用1還是2,而SSA有一個標識符可以稱之為版本或者“代“。

 y1 := 1
y2 := 2
x1 := y2

這樣就沒有任何間接值了。用SSA表示的好處是對于同一個變量的無關使用表示成不同“代”,可以方便很多編譯器的優化算法的實現。

指向分析是一種用于分析指針和內存引用所指向的變量或內存地址的靜態代碼分析技術。指向分析技術是很多更為復雜的代碼分析技術的基礎,例如編譯優化,代碼缺陷檢測以及指針修改影響分析。

指向分析,是指通過對源程序的分析近似地求出源程序中指針表達式所指向的目標。

到此,關于“go-callvis源碼是什么”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

杨浦区| 阿克苏市| 呼伦贝尔市| 常德市| 巍山| 宁晋县| 屏边| 广汉市| 平乐县| 宜阳县| 虎林市| 岫岩| 北海市| 德惠市| 锦屏县| 高青县| 中卫市| 福州市| 辰溪县| 木里| 克东县| 监利县| 吉首市| 色达县| 文山县| 镇康县| 永寿县| 巫溪县| 洪雅县| 左贡县| 芒康县| 西峡县| 莱州市| 太原市| 霸州市| 青铜峡市| 新河县| 灵丘县| 白玉县| 唐河县| 霍城县|