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