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: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总结的更多相关文章

  1. Atitit.异步编程技术原理与实践attilax总结

    Atitit.异步编程技术原理与实践attilax总结 1. 俩种实现模式 类库方式,以及语言方式,java futuretask ,c# await1 2. 事件(中断)机制1 3. Await 模 ...

  2. Atitit 管理原理与实践attilax总结

    Atitit 管理原理与实践attilax总结 1. 管理学分类1 2. 我要学的管理学科2 3. 管理学原理2 4. 管理心理学2 5. 现代管理理论与方法2 6. <领导科学与艺术4 7. ...

  3. Atitit.log日志技术的最佳实践attilax总结

    Atitit.log日志技术的最佳实践attilax总结 1. 日志的意义与作用1 1.1. 日志系统是一种不可或缺的单元测试,跟踪调试工具1 2. 俩种实现[1]日志系统作为一种服务进程存在 [2] ...

  4. Atitit.gui api自动化调用技术原理与实践

    Atitit.gui api自动化调用技术原理与实践 gui接口实现分类(h5,win gui, paint opengl,,swing,,.net winform,)1 Solu cate1 Sol ...

  5. Atitit 网络爬虫与数据采集器的原理与实践attilax著 v2

    Atitit 网络爬虫与数据采集器的原理与实践attilax著 v2 1. 数据采集1 1.1. http lib1 1.2. HTML Parsers,1 1.3. 第8章 web爬取199 1 2 ...

  6. Atitit.软件兼容性原理与实践 v5 qa2.docx

    Atitit.软件兼容性原理与实践   v5 qa2.docx 1. Keyword2 2. 提升兼容性的原则2 2.1. What 与how 分离2 2.2. 老人老办法,新人新办法,只新增,少修改 ...

  7. Atitit 游戏的原理与概论attilax总结

    Atitit 游戏的原理与概论attilax总结 1. 游戏历史2 1.1.1. 盘点PC游戏史上最重要的50款游戏2 1.1.2. 回味人类文明进程 五款经典的历史游戏2 2. 游戏类型(主要分为6 ...

  8. Atitit.软件兼容性原理与实践 v3 q326.docx

    Atitit.软件兼容性原理与实践 v3 q326.docx 1. 架构兼容性1 2. Api兼容性1 2.1. 新api  vs  修改旧的api1 3. Web方面的兼容性(js,html)1 3 ...

  9. Atitit 自然语言处理原理与实现 attilax总结

    Atitit 自然语言处理原理与实现 attilax总结 1.1. 中文分词原理与实现 111 1.2. 英文分析 1941 1.3. 第6章 信息提取 2711 1.4. 第7章 自动摘要 3041 ...

随机推荐

  1. 【干货分享】流程DEMO-加班与调休

    流程名: 加班.调休  业务描述: 加班: 工作日加班可以申请调休,也可以申请支付加班费.原则上都应申请调休:周末加班原则上申请调休:法定节假日加班支付加班费. 加班申请以半小时为单位. 当月加班不能 ...

  2. keepalive的不足,如何处理

    MySQL(或者其它服务)的keepalived高可用监控脚本 开发脚本需求:我们知道,keepalive是基于虚拟ip的存活来判断是否抢占master的机制的,但是如果我们做了MySQL的keepa ...

  3. CSS命名规范——BEM思想(非常赞的规范)

    人们问我最多的问题之一是在CSS类名中“--”和“__”是什么意思?它们的出现是源于BEM和Nicolas Gallagher... BEM的意思就是块(block).元素(element).修饰符( ...

  4. NoSql1 在Linux(CentOS)上安装memcached及使用

    前言:       今天是初五,生活基本要从过年的节奏中回归到正常的生活了,所以想想也该想想与工作有关的事情了.我之前在工作中会经常使用memcached和redis,但是自己一直没有时间系统的好好看 ...

  5. WPF - 属性系统 (2 of 4)

    属性更改回调 前一章的示例中,对各个参数的设置都非常容易理解.如果我们仅仅需要创建一个独立的依赖项属性,那么上面所提到的创建依赖项属性的基础知识足以满足需求.但是事情往往并非如此完美.在一个系统中,很 ...

  6. Leetcode 笔记 110 - Balanced Binary Tree

    题目链接:Balanced Binary Tree | LeetCode OJ Given a binary tree, determine if it is height-balanced. For ...

  7. [Java面经] 关于面试的二三事.

    今天终于闲下来了, 那么也好总结下这几天面试的经历.四天的时间一共面了七家, 有一家是自己推迟了没有去.声明:如若转载请注明出处:http://www.cnblogs.com/wang-meng/p/ ...

  8. CentOS 搭建openVPN

    1.安装前准备 # 关闭selinux setenforce 0 sed -i '/^SELINUX=/c\SELINUX=disabled' /etc/selinux/config # 安装open ...

  9. 关于安卓6.0权限申请 PermissionDog

    最近在一家公司实习,项目中需要用到适配安卓6.0以上的系统,我本来是想用其他人已经写好的权限申请框架来实现的,但是发现跟我的需求有点小区别,所以就自己写了一个 这个权限申请的帮助类很小,只有一个jav ...

  10. 编写Windows服务疑问1:操作过程

    Windows 服务开发平时不太受人关注,毕竟那是高大上的项目类型,平常需求也用不上,很多老掉牙的家伙也只知有WinForm,仍不知有WPF,更别说Windows 服务了,正如陶渊明所写的,“不知有汉 ...