中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

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

都江堰市| 徐闻县| 邛崃市| 海安县| 吉安县| 宁陕县| 镇坪县| 清新县| 乾安县| 雷波县| 临泉县| 时尚| 洛宁县| 凤山市| 丰顺县| 马边| 高唐县| 紫金县| 古丈县| 海口市| 铜川市| 普兰县| 中江县| 江陵县| 大荔县| 西乡县| 娄底市| 庐江县| 涞源县| 墨竹工卡县| 秦皇岛市| 鄂托克前旗| 康保县| 昌都县| 黄山市| 凌源市| 平果县| 辉南县| 新安县| 锡林郭勒盟| 广元市|