ide打开项目运行和调试按钮都是灰色的_如何开发一个IDE
IDE對于語言來說非常重要,讓新手能更快入門,讓老手能有更高的開發效率。所以我摸索著開發了Fanx語言的IDE。這里分享一些IDE內部工作原理和經驗。
IDE和編譯器
IDE為了實現功能,需要對源碼進行解析。經過詞法分析、語法分析、語義分析。相當于編譯器的前端,相對與編譯器來說少了優化器和代碼生成等階段。
IDE的語法解析和編譯器理論上能共享代碼。但是大部分語言編譯器在開發時都沒有考慮IDE的需求。兩者功能上還有一定差異的:
IDE一般和編譯器是獨立的軟件。當點擊工具欄編譯或者運行按鈕的時候,IDE啟動外部編譯器進程進行編譯。如果編譯器和IDE版本不匹配,可能出現IDE顯示有錯誤,但是編譯是成功的。
編輯器
我們首先需要一個文本框來編輯代碼,但是GUI框架提供的控件(例如TextArea)可能并不滿足自定義顏色的要求。我們可以自己畫一個控件,這樣可以自定義排版和著色。
比較麻煩的地方是需要自己處理鍵盤事件,處理打字和光標操作等。還有拷貝和粘貼操作要訪問系統剪貼板。中文輸入法支持可以用一個隱藏的TextField來實現。這些功能開發完成后,我們就自己造了一個TextArea的輪子出來。
語法高亮
我們只需要完成詞法分析,就能完成基本的語法高亮了。如果想要更高級的語義語法高亮,則需要等到完成語法分析或者語義分析。
語法分析和語法分析比較慢,在后臺線程進行。詞法分析比較快,在UI線程中處理。鍵盤事件中同步進行詞法分析,后臺線程的語義分析則是基于源碼文本的快照。
語義錯誤
語義分析不只是當前文件的事情,還涉及依賴的庫和項目內的其他文件。所以我們需要針對整個項目進行分析。最后把錯誤信息顯出出來。
由于語義分析是整個項目進行的,所以成本比較高。我們在文件被修改的時候進行增量編譯,只編譯分析當前文件。當然增量編譯的前提是項目首次加載時要進行一次全量編譯。如果再進一步優化可以只分析文本被修改的部分所在的函數。
跳轉到定義
按ctrl鍵并鼠標點擊符號,跳轉到符號的定義。我們在構建抽象語法樹的時候一直維護結點所在的文本位置。根據點擊位置查詢抽象語法樹得到點擊的結點。點擊的位置可能為類名,變量名,函數等,根據不同類型跳到不同的文件位置。在語義分析后我們就已經有了符號之間的引用信息。
補全提示
或者叫做自動完成。當用戶鍵入時提示輸入建議,并顯示對應API文檔。我們仍然和跳轉定義的實現一樣查詢當前光標位置的抽象語法樹結點,然后根據結點類型分不同情況做提示。例如用戶在一個變量后面輸入了“.”, 我們把這個變量在語義分析中確定的類型對應的所有方法列出來,作為候選。
需要把所有的第三方庫和其他文件的符號索引在一起,供自動完成來查詢。有時為了快速查詢可以把符號建成倒排索引或者Trie樹索引。很多腳本語言IDE實現會把這些索引持久保存,但我們為了簡單,不進行持久化,每次啟動時在后臺線程建立索引。當文件保存時觸發索引的更新。
調試
這個依賴與JVM提供的調試協議和接口。運行程序時提供調試模式的參數,則JVM啟動后監聽指定端口,并暫停程序,等待調試客戶端命令。調試客戶端在指定端口中連接被調試進程,并發出相關調試命令。他們通過socket來通信,所以遠程調試是可能的。
總結
這里說的都是針對單個語言的基本功能。從頭開發完整的IDE的工作量非常大,架構的復雜度也很大。
總結
以上是生活随笔為你收集整理的ide打开项目运行和调试按钮都是灰色的_如何开发一个IDE的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机应用能力考试xp,计算机应用能力考
- 下一篇: js 带笔锋 签字版_年轻人的第一支签字