Atitit.ide技术原理与实践attilax总结
Atitit.ide技术原理与实践attilax总结
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:1466519819@qq.com
转载请注明来源: 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
Atitit.ide技术原理与实践attilax总结的更多相关文章
- Atitit.异步编程技术原理与实践attilax总结
Atitit.异步编程技术原理与实践attilax总结 1. 俩种实现模式 类库方式,以及语言方式,java futuretask ,c# await1 2. 事件(中断)机制1 3. Await 模 ...
- Atitit 管理原理与实践attilax总结
Atitit 管理原理与实践attilax总结 1. 管理学分类1 2. 我要学的管理学科2 3. 管理学原理2 4. 管理心理学2 5. 现代管理理论与方法2 6. <领导科学与艺术4 7. ...
- Atitit.log日志技术的最佳实践attilax总结
Atitit.log日志技术的最佳实践attilax总结 1. 日志的意义与作用1 1.1. 日志系统是一种不可或缺的单元测试,跟踪调试工具1 2. 俩种实现[1]日志系统作为一种服务进程存在 [2] ...
- Atitit.gui api自动化调用技术原理与实践
Atitit.gui api自动化调用技术原理与实践 gui接口实现分类(h5,win gui, paint opengl,,swing,,.net winform,)1 Solu cate1 Sol ...
- Atitit 网络爬虫与数据采集器的原理与实践attilax著 v2
Atitit 网络爬虫与数据采集器的原理与实践attilax著 v2 1. 数据采集1 1.1. http lib1 1.2. HTML Parsers,1 1.3. 第8章 web爬取199 1 2 ...
- Atitit.软件兼容性原理与实践 v5 qa2.docx
Atitit.软件兼容性原理与实践 v5 qa2.docx 1. Keyword2 2. 提升兼容性的原则2 2.1. What 与how 分离2 2.2. 老人老办法,新人新办法,只新增,少修改 ...
- Atitit 游戏的原理与概论attilax总结
Atitit 游戏的原理与概论attilax总结 1. 游戏历史2 1.1.1. 盘点PC游戏史上最重要的50款游戏2 1.1.2. 回味人类文明进程 五款经典的历史游戏2 2. 游戏类型(主要分为6 ...
- Atitit.软件兼容性原理与实践 v3 q326.docx
Atitit.软件兼容性原理与实践 v3 q326.docx 1. 架构兼容性1 2. Api兼容性1 2.1. 新api vs 修改旧的api1 3. Web方面的兼容性(js,html)1 3 ...
- Atitit 自然语言处理原理与实现 attilax总结
Atitit 自然语言处理原理与实现 attilax总结 1.1. 中文分词原理与实现 111 1.2. 英文分析 1941 1.3. 第6章 信息提取 2711 1.4. 第7章 自动摘要 3041 ...
随机推荐
- 【干货分享】流程DEMO-加班与调休
流程名: 加班.调休 业务描述: 加班: 工作日加班可以申请调休,也可以申请支付加班费.原则上都应申请调休:周末加班原则上申请调休:法定节假日加班支付加班费. 加班申请以半小时为单位. 当月加班不能 ...
- keepalive的不足,如何处理
MySQL(或者其它服务)的keepalived高可用监控脚本 开发脚本需求:我们知道,keepalive是基于虚拟ip的存活来判断是否抢占master的机制的,但是如果我们做了MySQL的keepa ...
- CSS命名规范——BEM思想(非常赞的规范)
人们问我最多的问题之一是在CSS类名中“--”和“__”是什么意思?它们的出现是源于BEM和Nicolas Gallagher... BEM的意思就是块(block).元素(element).修饰符( ...
- NoSql1 在Linux(CentOS)上安装memcached及使用
前言: 今天是初五,生活基本要从过年的节奏中回归到正常的生活了,所以想想也该想想与工作有关的事情了.我之前在工作中会经常使用memcached和redis,但是自己一直没有时间系统的好好看 ...
- WPF - 属性系统 (2 of 4)
属性更改回调 前一章的示例中,对各个参数的设置都非常容易理解.如果我们仅仅需要创建一个独立的依赖项属性,那么上面所提到的创建依赖项属性的基础知识足以满足需求.但是事情往往并非如此完美.在一个系统中,很 ...
- Leetcode 笔记 110 - Balanced Binary Tree
题目链接:Balanced Binary Tree | LeetCode OJ Given a binary tree, determine if it is height-balanced. For ...
- [Java面经] 关于面试的二三事.
今天终于闲下来了, 那么也好总结下这几天面试的经历.四天的时间一共面了七家, 有一家是自己推迟了没有去.声明:如若转载请注明出处:http://www.cnblogs.com/wang-meng/p/ ...
- CentOS 搭建openVPN
1.安装前准备 # 关闭selinux setenforce 0 sed -i '/^SELINUX=/c\SELINUX=disabled' /etc/selinux/config # 安装open ...
- 关于安卓6.0权限申请 PermissionDog
最近在一家公司实习,项目中需要用到适配安卓6.0以上的系统,我本来是想用其他人已经写好的权限申请框架来实现的,但是发现跟我的需求有点小区别,所以就自己写了一个 这个权限申请的帮助类很小,只有一个jav ...
- 编写Windows服务疑问1:操作过程
Windows 服务开发平时不太受人关注,毕竟那是高大上的项目类型,平常需求也用不上,很多老掉牙的家伙也只知有WinForm,仍不知有WPF,更别说Windows 服务了,正如陶渊明所写的,“不知有汉 ...