Atitit.ide技術原理與實踐attilax總結

来源:http://www.cnblogs.com/attilax/archive/2016/09/23/5902102.html
-Advertisement-
Play Games

Atitit.ide技術原理與實踐attilax總結 1.1. 語法著色1 1.2. 智能提示1 1.3. 類成員outline..func list1 1.4. 類型推導(type inference): 1 1.5. Remote debug1 1.6. debugging api包一個gui就 ...


 

Atitit.ide技術原理與實踐attilax總結

 

 

1.1. 語法著色1

1.2. 智能提示1

1.3. 類成員outline..func list1

1.4. 類型推導(type inference)1

1.5. Remote debug1

1.6. debugging api包一個gui就夠了 1

1.7. expression evaluation 2

1.8. Java Compiler API2

1.9. Ide每部分代碼數統計3

 

 

1.1. 語法著色

語法高亮要靠parser,跳轉到定義處編譯器要提供symbol和源碼位置字典,重構編譯器要重寫ast, 要支持調試視窗里運行表達式甚至直接調用函數,這個要運行時支持。編譯

1.2. 智能提示

1.3. 類成員outline..func list

1.4. 類型推導(type inference)

1.5. Remote debug

,attach上去調

 

1.6. debugging api包一個gui就夠了

 

1.7. expression evaluation

這種黑魔法一樣的東西(僅針對編譯型語言這麼說,解釋型應該會容易很多),當初應該花了大量的精力開發;

 

作者::  ★(attilax)>>>   綽號:老哇的爪子  全名::Attilax Akbar Al Rapanui 阿提拉克斯 阿克巴 阿爾 拉帕努伊  漢字名:艾龍,  EMAIL:[email protected]

轉載請註明來源: http://www.cnblogs.com/attilax/

 

1.8. Java Compiler API

 

 

 我主要關註的是編譯器,所以下麵就編譯器與IDE多聊幾句。

當然,現實中開發一個IDE還真的有可能得去實現源語言的編譯器。

上面提到的SharpDevelop/MonoDevelop,目前新的版本已經改為基於微軟的Roslyn編譯器來提供C#支持,語法高亮、錯誤提示、智能提示等都做得很好了。但其早期版本其實非常弱,只有所謂“語法高亮”,可以參考這個文檔。後來為了實現智能提示等功能總算決定實現個真正的C# parser。不過它並沒有基於任何現成的編譯器來支持IDE功能,而是自己寫了一個,上面的書中第12章就是介紹這個parser的,不過寫得有點亂嗯。

Eclipse的Java開發環境(JDT)為例,它要實現準確的語法高亮和語法錯誤提示,就得按照Java語法實現一個完整的parser;它要實現實時的語義錯誤提示,就得按照Java語義實現一個完整的語義分析器,而且為了良好的用戶體驗,它可能要內建更多的對錯誤模式的檢查和提示。做到這裡,離一個完整的Java源碼編譯器也就只剩一個很簡單直觀的代碼生成器(code generator)了。於是Eclipse做了ECJ——Eclipse Compiler for Java,整合在Eclipse JDT中。
在此基礎上,Eclipse JDT還有項目模型,將項目里的各種資源都用一個統一的模型管理起來,從workspace到project、package、file然後裡面的class/interface這樣一直下去。在class/interface層面上這個模型用的就是ECJ的AST。

其實如果有一個現成的對IDE支持良好的編譯器的話,實現一個IDE就不必費那麼多事自己去寫編譯器。但是Eclipse誕生時,主流的Java源碼編譯器javac並不開源,而IBM當時主流的Java源碼編譯器Jikes是用C++寫的,要整合在用Java寫的Eclipse里不太方便,所以才要自己寫。
有了這個編譯器之後,Eclipse倒是可以做許多“非常規”的事情。例如說它可以為有錯誤的源碼文件生成Class文件,而且這個Class文件可以一直執行到源碼里有錯的地方然後拋出異常——這種事情javac就不太可能會去做。

後來javac開源了,而且開放出許多便於IDE實現自身功能的API出來(例如Java Compiler API),後來的Netbeans就乾脆直接用javac來實現語法高亮、報錯等各種功能了。背後的故事可以參考這篇博文:NetBeans IDE 6.0

而一個反例就是微軟的Visual Studio里的C++支持。Visual C++自身是個優秀的優化編譯器,但它的前端部分(詞法/語法/語義分析+中間代碼生成)的歷史非常非常“久遠”,原始設計並未考慮支持IDE的功能,所以Visual Studio IDE里的C++支持其實用的是另一套完全不同的C++ parser(購買自EDG),既增加了複雜度又無法保證兩套parser之間完全的相容性。
當然微軟也早就意識到了這個問題。近來,隨著對C++14的支持,微軟大幅更新了其Visual C++編譯器的前端(參考Rejuvenating the Microsoft C/C++ Compiler),按照這個路子走下去的話,在IDE里替換掉EDG的C++ parser改為直接用Visual C++自己的,興許也是可能的未來。

 

 

 

1.9. Ide每部分代碼數統計

分類

包含內容

源碼行數

Code Analysis

代碼模型、分析和生成相關

123957

IDE

IDE程式和界面相關

62940

Visual Editor

可視化編輯器

30760

Text Editor

文本編輯器

20264

Tools

版本控制和幫助等輔助工具

11556

Language

語言綁定,包括C#,VB等

9292

Debugger

調試器

9238

Framework

Asp.Net Mvc等框架支持

8513

Misc

雜項

2289

Builder

構建和MsBuild相關

1774

Data

資料庫支持

1396

對應的圖表:

項目分析

可見整個IDE最複雜的部分在於代碼模型的處理,代碼數量幾乎是第二名(IDE)的兩倍之多,占整個項目代碼的比例也接近 50% 了。我沒有進一步分析,不過大概可以想象,代碼編輯時的文本著色、語法提示、代碼生成、輔助分析、重構等功能應該都與此相關。如果真的想自己寫一個IDE的話,這一部分肯定是個難啃的硬骨頭。

參考資料

IDE的現實分析 - 對“開發一個IDE難度有多大”問題的回答 _ Shuhari的博客.html

開發一個IDE難度多大_ - 編程 - 知乎.html

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 20幾歲,怕什麼。 自己的感覺 說一個自己最近使用AngularJS的感受,我們之前使用mvc進行項目開發都是瞭解和經常使用HTML的幫助類,來完成我們前端大部分代碼的編寫,其實在我沒有接觸AngularJS之前對於這種方法還是很喜歡的,畢竟它是將.aspx頁面革命掉的東西,但是隨著項目中使用... ...
  • 2016年9月22日凌晨,微信宣佈“小程式”問世,當然只是開始內測了,微信公眾平臺對200個服務號發送了小程式內測邀請。那麼什麼是“小程式”呢,來看微信之父怎麼說 看完之後,相信大家大概都有些明白了吧,對於開發者來說或許都有些小激動吧,畢竟多關註一些新東西沒什麼不好。那麼問題是“小程式”只有200個 ...
  • 開頭不講"Hello Word",讀盡詩書也枉然 : Word 操作組件介紹 - Spire.Doc 【博主】反骨仔 【原文地址】http://www.cnblogs.com/liqingwen/p/5898368.html 序 本打算過幾天簡單介紹下組件 Spire.XLS,突然發現園友率先發佈了 ...
  • 原文地址:http://yacare.iteye.com/blog/2010049 很多伙伴在更新VS2010,或者卸載VS2012安裝2010後,建立Win32 Console Project/MFC項目時會出現"LINK : fatal error LNK1123: 轉換到 COFF 期間失敗: ...
  • 招聘鏈接:https://job.cnblogs.com/offer/53380/ 工作地點:北京-海澱 工作年限:1年 學歷要求:本科 招聘分類:移動開發工程師 工資範圍:面議 1、扎實的 C#基礎 2、熟練掌握 xaml 頁面開發,懂得響應式佈局 3、至少1年 uwp開發經驗 4、掌握 C/C+ ...
  • 1 java數據類型。8種基本類型,3種引用類型 基本類型(也稱:原始類型):byte、short、int、long、char、float、double、boolean 引用類型:類,介面,數組 2 java基本數據類型 Java 基本類型共有八種,基本類型可以分為三類,字元類型char,布爾類型b ...
  • 像我們搞電腦這塊的,都知道這麼一件事,當前的電腦編程語言主要分為兩大塊,一為面向過程,二為面向對象。Java就是一門純面向對象的語言。學習了一個月左右的Java,在下對於Java當中的類和對象有了基本的認識。接下來我就來談談自己的看法,各位大神勿噴,新手小白敬上。 既然談到類和對象,首先,我們要 ...
  • Atitit 自動化gui 與 發帖機 技術 1.1. Gui tech1 1.2. 自動化軟體測試1 1.3. selenium attilax1 1.4. 圖形腳本語言Sikuli1 1.5. Dom1 1.6. Jsbridge1 1.7. Browser tech1 1.1. Gui tec ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...