通用智能感知的新的和全面实施通用智能感知的新的和全面实施(A New and Full Implem

2019-05-12 21:15发布

我感兴趣的编写SQL和C#泛型启用智能感知编辑器(等人。如果可能的话!)。 我想要这样做在C#作为一个重写或扩展WPF的RichTextBox型对照。 我知道有很多可用的例子项目,我已经实现了我自己的一个基本版本; 但大部分我所遇到的(实际上我自己)的例子仅仅是基本

一对夫妇的代码示例:

  1. DIY智能感知通过yetanotherchris

  2. CodeTextBox -语法高亮和智能感知通过塔马斯Honfi另一RichTextBox控件

然而,我发现了智能感知的SQL编辑器中的一个很好的例子QueryCommander SQL编辑器中的Mikael哈坎森这似乎运作良好。 微软必须使用命令关键字的XML库,但我的问题是:如何(详细地)做微软实施其智能感知(如你型智能感知)以及如何努力会是为我创造同样的标准我自己?


编辑答:我已经成功地开发具有基本的智能感知主要是为我自己“享受”我自己的编辑器控制的一年。 我以为我会回来的提供,帮助我用我自己的发展,可用于外的开箱和免费免费提供.NET项目的列表:

  1. ICSharpCode(的WinForms)

  2. AvalonEdit(WPF)

  3. ScintillaNET(的WinForms)

  4. 查询指挥官[例如智能感知执行(的WinForms)


编辑B:后15个月有人问我仍然在寻找新的改进的编辑。 这是一个很好的...

  1. RoslynPAD就是爽!

编辑为C:2年+从这个问题,我发现了以下项目,无论是使用WPF和AvalonEdit支持。

  1. CodeCompletion为AvalonEdit使用NRefactory。 这个项目是非常好的,具有使用NRefactory全面实施智能感知的。

  2. ScriptCS ScriptCS可以很容易地编写,并用简单的文本编辑器执行C#。

Answer 1:

如何(详细地)做微软实施其作为你型智能感知?

可以向你形容照顾名称详细的任何级别,但我没有足够的时间超过一个简要的解释了。 我将解释我们如何做罗斯林。

首先,我们建立使用一种数据结构,可以有效地表示修改标流的一个不变的模式,因为明明是编辑正是有将是一个很大的。

关键的洞察力,以使其成为有效的持续性再利用是代表令牌,但的字符长度不能编辑缓冲区的字符的位置 ; 请记住,在文件的最后一个标记是要改变每一个编辑位置,但令牌的长度不会改变。 你必须不惜一切代价,如果你想成为非常大的文件有效降低总重lexings的数量。

一旦你有一个可以处理插入和删除操作,而无需重新词法每次建立一个不可改变的令牌流的整个文件的不可变的模型,你就必须做同样的事情,但对于语法分析。 这在实践中是一个相当困难的问题 。 我建议你获得计算机科学本科或研究生学历,在解析器理论的重点,如果你还没有准备好。 我们得到人们的帮助,谁做了解析理论的论文,设计算法的特定位博士。

然后,很明显,建立一个语法分析器可以分析C#。 请记住,它有分析 C#中,不正确的C#; 智能感知有工作,而该方案是在非编译状态。 因此,通过未来与修改语法具有良好的差错恢复特性开始。

好了,现在你已经有了一个分析器,可以有效地做语法分析,而无需重新词法或重新解析什么,但编辑的区域,大部分的时间,这意味着,你可以做按键之间的工作。 我忘了提,当然,你将需要拿出一些机制, 不会阻塞UI线程同时做所有这些分析应分析发生于两个按键之间的时间需要更长的时间。 新的“异步/等待”的C#5功能能这一点。 (我可以从个人的经验告诉你:小心任务和取消标记的增殖如果你不小心,就可以进入那里有未决的数万取消的任务的状态,而不是很快 。 )

现在,您已经有了一个语法分析,你需要建立一个语义分析 。 既然你只是做智能感知,它并不需要是一个特别复杂的语义分析。 (我们的语义分析必须做适合生成来自正确的程序和不正确的方案正确的错误分析代码进行分析。)不过,当然,再次它必须做破解的程序很好的语义分析,这也大大增加了复杂性。

我的建议是通过建立一个“顶级”的语义分析仪,再次使用,可以从编辑坚持的声明式源代码类型的状态编辑一成不变的模式来启动。 顶层分析仪任何史实不是一个语句或表达式:类型声明,指令,命名空间,方法声明,构造函数,析构函数,等等。 其构成了该程序的“形状”的时候,编译器生成的元数据的东西。

元数据! 我忘了元数据。 你需要一个元数据读取器。 你需要能够生产智能感知上引用类型库的表达,效果显着。 我建议使用CCI库,你的元数据读取器,而不是思考。 既然你只是做智能感知,显然你并不需要一个元数据写入。

无论如何,一旦你有一个顶级的语义分析,那么你可以写一份声明,并表达语义分析,用于分析一个给定的语句类型的表达式。 要特别注意名称查找重载解析算法。 方法类型推断会特别棘手, 尤其是里面的LINQ查询

一旦你得到了这一切,智能感知引擎应该很容易; 只是在当前光标位置计算出的表达式的类型和适当地显示一个下拉菜单。

如何努力会是我创造同样的标准我自己?

好了,我们已经有了一个团队,把它叫做十人,它可能会采取,称之为5年一起去完成从开始到结束的整个事情。 但是,我们有很多的不仅仅是智能感知引擎更多的工作要做。 这也许是工作的只有40%。 哦,还有一半的人对VB的工作,现在,我想它。 但是,这些人有可能是平均五年或十年在做这样的工作经验,所以他们就比你快将是,如果你从来没有这样做过。

所以我们可以说这应该需要大约十到二十年的全职工作,单独工作,建立了C#可以在按键之间的时间做大型程序的可接受-贴近正确分析罗斯林质量智能感知引擎。

再如果你需要首先做的博士,效果显着。

或者,你可以简单地使用罗斯林,因为这就是它的功能 。 这将带你大概几个小时,但你不要自己动手的乐趣。 它是乐趣!

你可以在这里下载预览版:

http://www.microsoft.com/download/en/details.aspx?id=27746



Answer 2:

这是微软通常会产生很大的成效的地区 - 微软开发工具真的是真棒。 并且对于销售他们的开发工具和Windows的销售数量,以具有最好的智能感知所以它是有道理的,微软投入的实物资源的埃里克介绍了他的奇妙详细的解答明显的商业优势。 不过,我认为这是值得指出的几件事情:

  1. 您的客户可能实际上并不需要所有的微软的实现提供的功能。 微软的解决方案可能是令人难以置信的超工程中, 需要提供给您的客户/用户的功能方面。 除非你真的实现一个旨在与Visual Studio竞争力的通用编码的环境中,很可能有,要么使问题简化您的使用目的的方面,或者让你做出对微软认为该解决方案的妥协他们不能做。 微软可能会花资源减少了在几百毫秒已经测量的响应时间。 这可能不是你需要做的事情。 微软花费时间提供给其他人使用代码分析的API。 这可能不是你的计划的一部分。 优先考虑你的特点,决定什么是“足够好”看起来像你,然后你的客户估计是实施的成本。

  2. 除了轴承实现,你可能实际上并没有要求明显的成本,微软也带有一定的成本,如果你没有在一个团队中工作,可能不是很明显。 没有与球队相关的巨额通讯费用。 它实际上是非常容易有五个聪明的人需要更长的时间比它采取了一个聪明的人,产生相当于溶液中得到解决。 有微软的招聘惯例,组织结构,使这种情况更可能的方面。 如果你雇佣一帮聪明人与自我,然后赋予所有的人做决策,你也可以得到成本的500%,较好的5%的溶液。 这更好的5%的溶液可能是盈利的微软,但它可能是致命的一家小公司。

  3. 从1人解决一个5人的解决方案会增加成本,但是这只是在团队内部开发成本。 微软有致力于(大约)的设计,开发和测试,即使是单一功能独立的团队。 跨越这些边界的节点之间的项目相关的通信具有比在每个学科的更高的摩擦。 这不仅增加了人与人之间的交流成本,但同时也导致了较大的团队规模。 而更重要的是 - 因为它不是12个人的一个团队,但不是5个人的3个队,有3倍的上行通信成本。 微软已选择继续沿用,可能没有转化为其他公司类似的成本更多的成本。

在这里我的观点是不是描述微软作为一个低效率的公司。 我的观点是,微软使一吨约礼聘决策,团队组织,设计和实施,从约盈利能力和风险假设根本就不适用于没有微软这样的公司开始。

在智能感知的事情方面,有思考这个问题的各种方法。 微软正在生产一种非常通用的,可重复使用的解决方案,不只是解决了智能感知,而且还针对代码导航,重构,以及其他各种用途代码分析。 你不需要做的事情同样的方式,如果你唯一的目标是让开发人员更容易,而无需太多类型输入代码。 靶向特性不会多年的努力和有创造性的事情,如果你不只是提供了一个API,你可以做各种各样的,但实际上你控制UI了。



文章来源: A New and Full Implementation of Generic Intellisense