IDE都會有一個goto definition和reference,但我發現往往很不精準,所以好奇它們目前都是怎麼實現的。按照道理,只要每個symbol都會一個record用來記錄這個symbol所在的文件和行號以及一些輔助信息,在build tag的時候,查找的時候生成symbol的簽名再去查表,理論上應該很準確才對。至於查找reference,是否需要記錄一個symbol所被引用的所有地方?難道問題出在語法解析解析的不好?


說得簡單一點,就是編譯一遍,什麼就都清楚了。不過IDE需要的是快速地、允許出錯的增量編譯和全文編譯的結合,這又是另一個問題了。Anders在channel 9直播解釋過。


你可以認為IDE裡面有個對應語言的編譯器,不過只使用中間步驟的語義樹什麼的,而不是編譯出目標代碼,而且要允許含有錯誤的代碼,而且速度要快。


我沒見過正式商業產品是怎麼做的,我自己倒是為一個內部DSL做過一個簡單版本的IDE plugin。如果要做得比較好的話,基本上就是一個編譯器前端。從個人經驗上看,查找變數定義跟類型關係不大(成員變數的查找還是跟類型有很大關係),主要是要把變數作用域搞正確。查找函數定義要麻煩一些,比如支持重載,泛型,變長參數的時候,需要確定哪個優先順序高。個人感覺做這個跟做編譯器最大區別在錯誤處理上。對語法正確的代碼沒區別,在有語法錯誤的情況下,還需要盡量讓沒錯誤的那部分能正常工作。

編譯型語言大多做得還不錯了,印象中Clang的結果就挺好,IDE比如Eclipse和Jetbrain很方便,動態語言更難做一些,比如ruby之流.....個人理解,通過代碼能獲取到的信息越多做得就越准,編譯型的比解釋型的准,有類型的比沒類型得好,強類型的比弱類型的好。

比如一個c/c++這種吧,一個變數通過void指針轉來轉去,就可能搞錯了,智能些的編輯器可能會給幾個跳轉選擇。


一不小心就弄錯的估計是動態語言,動態語言的靜態分析一直是個很煩人的問題,不然垠神也不會光靠一個pysonar就能吹這麼多年了,(逃

前面有些答主回答了一些靜態語言靠譜的做法,那就是編譯到一半停下來,那麼動態語言怎麼辦呢,當然是跑到一半停下來啦,(逃

再說一些愚蠢的ide是怎麼做的吧,當然是直接正則搜索啦!(興奮臉


編譯原理裡面好像講過,

這東西大約就是整個編譯器的前端了。

(也就是跟輪子哥講的那樣,編譯一遍)

具體的忘記了,很久以前的知識了。

照我說如果沒特殊的需求,你研究這個幹啥……


主流IDE都不開源吧?

也許可以參考一下Qt Creator,KDevelop,Eclipse之類的


推薦閱讀:
相关文章