??xml version="1.0" encoding="utf-8" standalone="yes"?>久久久久波多野结衣高潮,2021国产精品午夜久久,日本免费久久久久久久网站http://www.shnenglu.com/vczh/category/14937.html【QQQ?43056143Q已满)Q?04254078】【MSNQvczh@hotmail.com】【EmailQvczh@163.com?/description>zh-cnThu, 24 Feb 2011 17:02:50 GMTThu, 24 Feb 2011 17:02:50 GMT60写程序真他妈爽啊http://www.shnenglu.com/vczh/archive/2011/02/25/140618.html陈梓?vczh)陈梓?vczh)Thu, 24 Feb 2011 16:54:00 GMThttp://www.shnenglu.com/vczh/archive/2011/02/25/140618.htmlhttp://www.shnenglu.com/vczh/comments/140618.htmlhttp://www.shnenglu.com/vczh/archive/2011/02/25/140618.html#Feedback3http://www.shnenglu.com/vczh/comments/commentRss/140618.htmlhttp://www.shnenglu.com/vczh/services/trackbacks/140618.htmlVczh Library++ 3.0的第一个Release的Demo?br>
vle.exe大概已经做完了,现在checkin了一个vlscript.dll的框Ӟ但是q没有实现里面的具体的函数。到时候这个用C#写的demo׃(x)调用C++写的vlscript.dllQ来实现乌龟d功能?br>
q个破IDE的代码在“Tools\Release\VleSource\VlTurtle\VlTurtle.csproj”Q大家有兴趣的话可以M载。打开那个solutionQ然后用release~译Q然后再release目录下执行Deploy.bat之后Q就可以F5看到效果了?br>
此时的心情简直无以u比?br>


陈梓?vczh) 2011-02-25 00:54 发表评论
]]>
开发自qIDEQ十二)http://www.shnenglu.com/vczh/archive/2010/12/05/135505.html陈梓?vczh)陈梓?vczh)Sun, 05 Dec 2010 02:59:00 GMThttp://www.shnenglu.com/vczh/archive/2010/12/05/135505.htmlhttp://www.shnenglu.com/vczh/comments/135505.htmlhttp://www.shnenglu.com/vczh/archive/2010/12/05/135505.html#Feedback16http://www.shnenglu.com/vczh/comments/commentRss/135505.htmlhttp://www.shnenglu.com/vczh/services/trackbacks/135505.htmlVczh Library++ 3.0的IDE工程里实C用户自定义类型变l(抄C#的娃哈哈Q鼠标移动到对象上会(x)出tooltip、显C函数参数提C和Code snippet的功能了。由于我?a style="TEXT-DECORATION: underline" href="http://www.shnenglu.com/vczh/archive/2010/11/22/134302.html" target=_blank>语法?/a>的每一个节炚w包含了它在源代码中的位置Q所以鼠标指向一个字W的时候,可以计算Z在语法树(wi)的位|,从而可以查C的声明的语法?wi)节点,再用声明节点的位|就可以把声明的代码复制出来昄在tooltip上面了:(x)

    同样的方法可以用来实现显C函数参数。这个比tooltip要复杂一点,因ؓ(f)要吧语法?wi)的声明重新l织成代码才能显C出来,而且q有模板函数的类型问题。不q现在有两个功能还没实玎ͼW一个是在没输入的时候移动光标不?x)更新参敎ͼq只是个问题。另一个是对一个函数指针调用的时候做提示Q这个还要进一步考虑。下图显C的是对一个模板函数做参数提示的时候,参数的类型会(x)自动特化Q?br>

    接下来就是code snippet了。Code snippet是一个强大的功能Q可以让你免除一些无谓的手指的劳动。Visual Studio里面提供了大量的code snippetQ不q在q里我暂时只提供for和forr两种Q用来输入for循环。下面是使用code snippet输入一个for循环的全q程Q?br>











    Code snippet是一个比较复杂的功能Q在q里我只实现了上下文无关的一些特性。Visual Studio里面的就更ؓ(f)高了,他在插入一个类名的时候,可以Ҏ(gu)上下文来判断是否需要出现完整的namespace。当然由于现在我用来做intellisense的语aq没有这么复杂的元素Q所以也无从做起了?br>
    所有的代码可以?a style="TEXT-DECORATION: underline" target=_blank>Vczh Library++ 3.0里面扑ֈ。这文章的代码?a style="TEXT-DECORATION: underline" href="http://www.shnenglu.com/vczh/archive/2010/11/07/132876.html" target=_blank>Q十Q?/a>的时候的代码已经大ؓ(f)不同了。经q一pd的重构,intellisense功能最l被做成一个灵zȝ插g形式Q所有的l节都可以更改,甚至qcode snippet那个黄色的输入位|都可以再往上画东西。因为在开发intellisense的时候发CNativeX语言语法上一个二义性,因此NativeX的语法也做了一处小修改。而且我趁着q个时候重构了所有NativeX的测试用例,把在C++里面构造语法树(wi)Ҏ(gu)了用一pdmake file和反函数ƈq行的方式直接用NativeXProvider~译、运行main函数q与记录在index文g中的l果q行比较的方法?br>
    接下来可以做的事情就比较多了。首先我要开始完成NativeX的调试功能,其次我要拿Microsoft SQL Server那个复杂的T-SQL来研I一个从文法产生intellisense代码Q是的,你没看错Q是intellisense代码Q的Ҏ(gu)Q最后要在intellisense上实现NativeX的重构。对于那个自动生成intellisense代码的算法,目前q仅仅出于YY阶段Q当然生成出来的也只能是上下文无关的intellisense。譬如说帮你列出数据库里面的所有表啦,或者帮你列出前面声明过的变量啦Q不属于自动生成的范围。不q自动生成的intellisenseq是?x)告诉?#8220;现在需要弹出变量列表,需要提供内?#8221;的这样一U信息来让你可以往里面d一些不能自动生成的东西。当然做不做得出来那是另外一回事了,先研I研I?br>

陈梓?vczh) 2010-12-05 10:59 发表评论
]]>
开发自qIDEQ十一Q,提示关键步骤揭秘http://www.shnenglu.com/vczh/archive/2010/11/22/134302.html陈梓?vczh)陈梓?vczh)Mon, 22 Nov 2010 11:29:00 GMThttp://www.shnenglu.com/vczh/archive/2010/11/22/134302.htmlhttp://www.shnenglu.com/vczh/comments/134302.htmlhttp://www.shnenglu.com/vczh/archive/2010/11/22/134302.html#Feedback13http://www.shnenglu.com/vczh/comments/commentRss/134302.htmlhttp://www.shnenglu.com/vczh/services/trackbacks/134302.html    有两个星期没有更新博客了Q主要是最q在研究一U更灉|的代码编辑框的框架设计,修了很多bugQ还有公司的事情多了h。现在全部都解决了,因此开始写q一博客?a style="TEXT-DECORATION: underline" href="http://www.shnenglu.com/vczh/archive/2010/11/07/132876.html" target=_blank>上一?/font>文章提到了我搞定了一个智能提C的原型Q当然现在已l在Vczh Library++ 3.0上面d了鼠标指向一个对象显C声明代码和打括L(fng)时候提C函数参敎ͼ部分完成Q的功能了。今天来说一下我是如何实现这些功能的。当然我不会(x)讲所有细节,只会(x)讲重点,如何实现那个界面也不包括在这里。我要说的是Q如何立ȝ道Q意一个位|所在的代码I竟是什么东ѝ?br>
    如果你没有读q之前的几篇文章的话Q徏议去M,因ؓ(f)我之前提C一些背景,q有我实现的C#版yaccQ当然只是指功能Qƈ不兼容)Q?a style="TEXT-DECORATION: underline" href="http://www.shnenglu.com/vczh/archive/2010/10/23/130969.html" target=_blank>IDE和编译器的语法分析器的异?/font>和实C个IDE用的语法分析?a style="TEXT-DECORATION: underline" href="http://www.shnenglu.com/vczh/archive/2010/11/06/132654.html" target=_blank>要注意的地方?br>
    语法分析L产生语法?wi)或者分析树(wi)的,无论开发什么能够感应代码内容的工具Q都逃不q语法分析。因此可以肯定的是,在你敲代码的时候,IDE真的在背后生成了一|(wi)Q只不过Z要达到普通文本框的输入性能Q很多东襉K要移动到后台dQ但是ؓ(f)了瞬间响应ƈ作智能提C,有一些东西要Ud到前台做。他们之间的分界U想要界定清楚其实也不是很难?br>
    假设我们要编辑一份超大文Ӟ几万行吧Q再过要开除的哈)Q每当你打字修改它的时候,一定会(x)q行语法分析q生语法树(wi)。对于这么大规模的代码要产生语法?wi)肯定不是瞬间就能完成的Q我那个东西大概要一U钟多一点)Q因此这一步是在后台完成的。但是当你打一?."的时候,你肯定希望立d要弹出列表的内容。ؓ(f)了知道列表的内容Q你肯定得先知道那个"."出现在了什么表辑ּ里面Q以?."前面的那个表辑ּI竟是什么类型,q是M开全文分析的。但是全文分析又太慢Q所以我引入了一个技术?br>
    Z完成q个技术,你必d前台分析得到那个表达式。我们很Ҏ(gu)q道,我们是不可能{待后台分析l我们提供数据的。所以在q里我们要做的是Q缓存当前我们感兴趣的代码。在q里单化一下,如果我们只需要提供按"."弹出列表的话Q我们只需要缓存语句(statementQ就可以了。怎么做呢Q假设我们已l可以通过所在的位置得到代码的内容(下面?x)讲Q,那么我们昄可以知道光标的位|所在的语句的语法树(wi)对象I竟是什么。有了这个语法树(wi)对象Q我们就可以从代码里面直接把q个语句的代码文字复制出来,然后~存语句的代码、语句所在的全文位置和语句所在的作用域。作用域是语法树(wi)的一部分Q在做完语法分析之后Q只需要做单的语义分析建立作用域就可以计算很多东西了?span style="COLOR: red">q个~存?x)在光标位置Ud的时候更斎ͼ也会(x)在当前的全文分析l束的时候更?/strong>?br>
    一旦缓存下来之后,你往里面打了一个字W,那我不仅可以更新文本框里面的内容Q我q可以更新缓存里面的代码的内容,同时q可以知道新的缓存开始结束位|。一个语句通常都是很短的,最多也׃百来个字W,因此我们立刻在前台对它做语法分析。而且往一个语句里面打字的话,99%以上的情冉|不会(x)影响C下文的,所?span style="COLOR: red">q个语句的旧作用域对象仍然可?/strong>。这个时候我们用旧的作用域对象来Ҏ(gu)的语句做语义分析Q那么就可以知道q个语句每一个表辑ּ的类型了Q从而知道了"."前面的表辑ּI竟是什么类型。然后利用旧作用域对象,我们可以知道这个类型包含了多少成员。到了这一步,列表里面的对象就构造完毕了?br>
    然而后台的全文分析L?x)结束的Q所有的信息在这个时候就准备好了Q然后发个消息给前台让它更新~存。两U更新缓存都是用GUI的消息驱动的Q所以不可能同时发生Q只?x)先后发生。之前谈到的临时更新跟后台的全文分析是ƈ行的Q不q这个不?x)媄响我们。只要我们正处理后台跟前台的信息交换,那么整个感应的计过E就可以做得十分安全Q不?x)发生死锁。我怿q一点应该不是很难?br>
    那么Q现在回C两个最原始的问题。第一个是如何通过位置查找语法?wi)。这个很Ҏ(gu)解决Q只要在语法分析的时候把所有跟位置有关的信息都记录在树(wi)里面可以了。第二个问题是我们如何处理用户写错的代码。^时编译原理里面所教授的自动错误恢复其实是不好用的Q你看看VC++的编译器在你写错了什么东西之后,大部分的错误信息基本上都没法看,因此如何q行错误恢复肯定要我们自p行精心设计。但是问题来了,我们如何实现它呢Q显然手写语法分析器?x)让我们心烦意ؕ?gu)做不下去Q还要处处记得记录位|信?#8230;…Q,因此我们需要一个语法分析器生成器?br>
    在这里我大家去阅L博客上的两篇文章Q你可以从这两篇文章所l的链接看到一些其他的东西Q讲的是如何?a style="TEXT-DECORATION: underline" href="http://www.shnenglu.com/vczh/archive/2010/09/02/125621.html" target=_blank>l合?/font>开?a style="TEXT-DECORATION: underline" href="http://www.shnenglu.com/vczh/archive/2008/05/21/50656.html" target=_blank>语法分析?/font>。我q里l语法树(wi)d了一个新属性,也就是一U组合v来强大但是又Ҏ(gu)指定的错误恢复技术了。这里的错误恢复技术分ZU,一U是针对循环的,q个大家看代码就可以了,因ؓ(f)跟第二种——也是序列关系的文法的错误恢复——非常相|只是一个理Z的变换而已?br>
    内容是这L(fng)。假设我们需要分析下面的表达式:(x)EXPRESSION + "." + MEMBERQ那么我们L希望在残~Z全的代码里面恢复出尽可能正确的信息。我们知道一旦出C"."Q用h要写的必然是一个访问对象成员的表达式,因此我们?."那里表上记号Q变成EXPRESSION + "." + MEMBER。标记有一个副作用Q也是一旦标记所包含的语法分析成功了Q那么整条语法会(x)保证产生出指定的语法?wi)结构。如果用户出C错误Q那?span style="COLOR: red">所有的错误都会(x)被当成用户少输入了什么东西而引L(fng)。虽然这一个假讑֯于编译器来说不太合适,但是对于IDE来说昄是合适的。但是这U做法很Ҏ(gu)在分析列表结构的代码里引h循环Q所以需要做很多试来保证你的标C?x)造成问题?br>
    下面的例子也可以辅助说明q种Ҏ(gu)的有效性。D个例子,你需要做一个函数。你在写函数的过E中昄?x)?f)时或者不心?yu)些一些东襎쀔—有时候我们ƈ不是把所有的事情都想清楚了才开始写代码的。这个时候ؓ(f)了正分析出函数的结构,我们做下面的语法q标讎ͼ(x)
    FUNCTION_DECLARATION ::= TYPE + NAME + "(" + list<TYPE + NAME, ","> + ")" + COMPOSITE_STATEMENT
    VARIABLE_DECLARATION ::= TYPE + NAME + optional("=" + EXPRESSION) + ";"
    然后L保证FUNCTION_DECLARATION的优先比VARIABLE_DECLARATION更高Q我们就L可以恢复出最正确的语法结构了。这一U做法对于你?span style="COLOR: red">q箋输入代码的过E中q行正确的提C?/strong>是相当好用而且方便的?br>
    至于代码生成器本w怎么实现Q还是去Vczh Library++ 3.0下蝲代码吧?/p>

陈梓?vczh) 2010-11-22 19:29 发表评论
]]>
开发自qIDEQ十Q,我终于搞定了提示了哇哈哈http://www.shnenglu.com/vczh/archive/2010/11/07/132876.html陈梓?vczh)陈梓?vczh)Sun, 07 Nov 2010 11:11:00 GMThttp://www.shnenglu.com/vczh/archive/2010/11/07/132876.htmlhttp://www.shnenglu.com/vczh/comments/132876.htmlhttp://www.shnenglu.com/vczh/archive/2010/11/07/132876.html#Feedback23http://www.shnenglu.com/vczh/comments/commentRss/132876.htmlhttp://www.shnenglu.com/vczh/services/trackbacks/132876.html  阅读全文

陈梓?vczh) 2010-11-07 19:11 发表评论
]]>
开发自qIDEQ九(ji)Q?/title><link>http://www.shnenglu.com/vczh/archive/2010/11/06/132654.html</link><dc:creator>陈梓?vczh)</dc:creator><author>陈梓?vczh)</author><pubDate>Sat, 06 Nov 2010 04:54:00 GMT</pubDate><guid>http://www.shnenglu.com/vczh/archive/2010/11/06/132654.html</guid><wfw:comment>http://www.shnenglu.com/vczh/comments/132654.html</wfw:comment><comments>http://www.shnenglu.com/vczh/archive/2010/11/06/132654.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.shnenglu.com/vczh/comments/commentRss/132654.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/vczh/services/trackbacks/132654.html</trackback:ping><description><![CDATA[    隔了两个星期才更斎ͼ主要是因Z前有一个星期我拿来做了一个Ribbon的DEMOQ将来打用Ribbon来做IDE。另一个原因是q次ȝ的重大突破消耗了我整整一个星期的旉来完成,好久没有遇到q么困难的问题了……<br><br>    q次主要解决的问题有两个。第一个是如何从文法生成一个可以对付残~Z全的代码的语法分析器Q当然这个已l被很多论文研究q无数遍了,我就不详l解释了。第二个是如何高效的q行分析。我们知道当代码高达10000行的时候,语法分析再怎么快也得花上几U钟旉QC#写的Q已l很快了Q何况这D代码是生成?#8230;…Q的。但是用户在按下“->”的时候根本来不及{你q么几秒Q所以我惛_了一个方法?br><br>    用户写代码的时候L?x)陷入思考的Q这个时候后台的全文分析?x)跟上来Q然后标记出“当前~辑语句”部分。如果你接下来快速输入,我除了再ơ启动后台的全文分析之外Q我q会(x)针对用户的输入来修改“当前~辑语句”的字W串然后针对q小的几行代码用语法分析生一个语句列表。这L(fng)话UIU程里面的语法分析就快到可以忽略了,而且每隔几秒钟后台的全文分析׃(x)赶上然后替换最新结果。这样可以保证你在打代码的时候有99%的概率我的语义分析可以正常工作。就不能工作,也就是生不出那个下拉列表,一般来_(d)q种情况只有那些打字的APM过500的h才会(x)到Q正思h是不?x)碰到?#8230;…<br><br>    介绍了原理之后,我就来脓(chung)张图了。不q在我这个Demo里面你真的输?0000行代码还是会(x)感觉到gq的Q那是因为我Z调试Q在Tree里面每次都会(x)产生一颗^均十几万行的文本表示的全文语法树(wi)QW(xu)indows的那个文本框性能太烂?#8230;…<br><br>    p(chung)几张囑֥了,首先是输入objectQ然后输?>Q最后输入member;。写?>的时候已l出CNativeXPointerMemberExpression了,下拉列表的所有信息已l完全出来了Q哇哈哈?br><br> <div align=center src_cetemp="/images/cppblog_com/vczh/2010_CodeBox_11.jpg"><img border=0 alt="" src="http://www.shnenglu.com/images/cppblog_com/vczh/2010_CodeBox_11.jpg" width=683 height=287></div> <br> <div align=center src_cetemp="/images/cppblog_com/vczh/2010_CodeBox_12.jpg"><img border=0 alt="" src="http://www.shnenglu.com/images/cppblog_com/vczh/2010_CodeBox_12.jpg" width=683 height=287></div> <br> <div align=center src_cetemp="/images/cppblog_com/vczh/2010_CodeBox_13.jpg"><img border=0 alt="" src="http://www.shnenglu.com/images/cppblog_com/vczh/2010_CodeBox_13.jpg" width=683 height=287></div> <br> <div align=center src_cetemp="/images/cppblog_com/vczh/2010_CodeBox_14.jpg"><img border=0 alt="" src="http://www.shnenglu.com/images/cppblog_com/vczh/2010_CodeBox_14.jpg" width=683 height=287></div> <img src ="http://www.shnenglu.com/vczh/aggbug/132654.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/vczh/" target="_blank">陈梓?vczh)</a> 2010-11-06 12:54 <a href="http://www.shnenglu.com/vczh/archive/2010/11/06/132654.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>开发自qIDEQ八Q?/title><link>http://www.shnenglu.com/vczh/archive/2010/10/23/130969.html</link><dc:creator>陈梓?vczh)</dc:creator><author>陈梓?vczh)</author><pubDate>Sat, 23 Oct 2010 04:34:00 GMT</pubDate><guid>http://www.shnenglu.com/vczh/archive/2010/10/23/130969.html</guid><wfw:comment>http://www.shnenglu.com/vczh/comments/130969.html</wfw:comment><comments>http://www.shnenglu.com/vczh/archive/2010/10/23/130969.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.shnenglu.com/vczh/comments/commentRss/130969.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/vczh/services/trackbacks/130969.html</trackback:ping><description><![CDATA[     摘要:     使用了上一文章的Ҏ(gu)Q我已经用C#把NativeX语言的语法分析器写出来了。而且最q把代码文g重构了一遍,删除掉了原来的实验性工E,转而重新设计了一个比较合理的工程l构Q当然还是提交到了Vczh Library++ 3.0的页面上M。现在先来看一看给IDE使用的文法哈。现在语法分析器已经有两套了Q一套是C++写的用于开发NativeX的编译器的,...  <a href='http://www.shnenglu.com/vczh/archive/2010/10/23/130969.html'>阅读全文</a><img src ="http://www.shnenglu.com/vczh/aggbug/130969.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/vczh/" target="_blank">陈梓?vczh)</a> 2010-10-23 12:34 <a href="http://www.shnenglu.com/vczh/archive/2010/10/23/130969.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>开发自qIDEQ七Q?/title><link>http://www.shnenglu.com/vczh/archive/2010/10/17/130202.html</link><dc:creator>陈梓?vczh)</dc:creator><author>陈梓?vczh)</author><pubDate>Sun, 17 Oct 2010 09:51:00 GMT</pubDate><guid>http://www.shnenglu.com/vczh/archive/2010/10/17/130202.html</guid><wfw:comment>http://www.shnenglu.com/vczh/comments/130202.html</wfw:comment><comments>http://www.shnenglu.com/vczh/archive/2010/10/17/130202.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.shnenglu.com/vczh/comments/commentRss/130202.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/vczh/services/trackbacks/130202.html</trackback:ping><description><![CDATA[     摘要:     在词法分析器生成器写完之后,p做语法分析器的生成器了。今天完成了生成器的W一个版本。这个语法分析器生成器所做的事情是从一个C#写的文法产生出C#写的该文法对应的语法分析器。在写文法的时候你需要提供每一个文法的q回cdQ以及指定每一个属性究竟对应着文法的哪一Dcؓ(f)了方便,我提供了预定义的列表文法和左递归文法。当然我们知道手写递归下降分析器都是有套\的,用h?..  <a href='http://www.shnenglu.com/vczh/archive/2010/10/17/130202.html'>阅读全文</a><img src ="http://www.shnenglu.com/vczh/aggbug/130202.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/vczh/" target="_blank">陈梓?vczh)</a> 2010-10-17 17:51 <a href="http://www.shnenglu.com/vczh/archive/2010/10/17/130202.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>开发自qIDEQ六Q?/title><link>http://www.shnenglu.com/vczh/archive/2010/10/15/129946.html</link><dc:creator>陈梓?vczh)</dc:creator><author>陈梓?vczh)</author><pubDate>Thu, 14 Oct 2010 16:23:00 GMT</pubDate><guid>http://www.shnenglu.com/vczh/archive/2010/10/15/129946.html</guid><wfw:comment>http://www.shnenglu.com/vczh/comments/129946.html</wfw:comment><comments>http://www.shnenglu.com/vczh/archive/2010/10/15/129946.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.shnenglu.com/vczh/comments/commentRss/129946.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/vczh/services/trackbacks/129946.html</trackback:ping><description><![CDATA[     摘要:     词法分析器生成器l于做好了,因此我又M一个状态机然后生成了一个词法分析器Q因此开始研IIDE的智能提C的技术了。智能提C的技术有几个要点Q第一个是无论怎么慢都不能妨碍你打字,W二个是崩溃了也不能让IDExQ要重启分析器。因此我做了一个小实验。首先我NativeX语言的着色器跟词法分析器都做好了Q因此我要做的事情就是在你打字的时候,用另外一个线E进行词法分...  <a href='http://www.shnenglu.com/vczh/archive/2010/10/15/129946.html'>阅读全文</a><img src ="http://www.shnenglu.com/vczh/aggbug/129946.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/vczh/" target="_blank">陈梓?vczh)</a> 2010-10-15 00:23 <a href="http://www.shnenglu.com/vczh/archive/2010/10/15/129946.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>开发自qIDEQ五Q?/title><link>http://www.shnenglu.com/vczh/archive/2010/10/08/129087.html</link><dc:creator>陈梓?vczh)</dc:creator><author>陈梓?vczh)</author><pubDate>Fri, 08 Oct 2010 14:05:00 GMT</pubDate><guid>http://www.shnenglu.com/vczh/archive/2010/10/08/129087.html</guid><wfw:comment>http://www.shnenglu.com/vczh/comments/129087.html</wfw:comment><comments>http://www.shnenglu.com/vczh/archive/2010/10/08/129087.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.shnenglu.com/vczh/comments/commentRss/129087.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/vczh/services/trackbacks/129087.html</trackback:ping><description><![CDATA[     摘要:     休息了大半个月,没写自己的代码了。国庆过了,再不己写写代码就有负|感了。这文章所提到的所有工L(fng)代码都可以在Vczh Library++ 3.0的页面找到。上一文章提C一个状态机l图工具Q直到最q我l于把他的第一个部分给做好了。现在可以画图之后生一个可以供q里所描述的高亮控件所使用的着色器了。第一步我们要使用TokenizerBuilderl制一?..  <a href='http://www.shnenglu.com/vczh/archive/2010/10/08/129087.html'>阅读全文</a><img src ="http://www.shnenglu.com/vczh/aggbug/129087.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/vczh/" target="_blank">陈梓?vczh)</a> 2010-10-08 22:05 <a href="http://www.shnenglu.com/vczh/archive/2010/10/08/129087.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>开发自qIDEQ四Q?/title><link>http://www.shnenglu.com/vczh/archive/2010/09/20/127104.html</link><dc:creator>陈梓?vczh)</dc:creator><author>陈梓?vczh)</author><pubDate>Sun, 19 Sep 2010 17:58:00 GMT</pubDate><guid>http://www.shnenglu.com/vczh/archive/2010/09/20/127104.html</guid><wfw:comment>http://www.shnenglu.com/vczh/comments/127104.html</wfw:comment><comments>http://www.shnenglu.com/vczh/archive/2010/09/20/127104.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.shnenglu.com/vczh/comments/commentRss/127104.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/vczh/services/trackbacks/127104.html</trackback:ping><description><![CDATA[    接着<a style="TEXT-DECORATION: underline" href="http://www.shnenglu.com/vczh/archive/2010/09/18/126937.html" target=_blank>上一?/a>的话题。开发智能提C首要的问题是开发一个高性能的语法分析器。一个高性能的语法分析器L包含一个高性能的词法分析器的。本pd?a style="TEXT-DECORATION: underline" href="http://www.shnenglu.com/vczh/archive/2010/09/16/126706.html" target=_blank>W一?/a>已经提到了用C#和状态机写着色器?0万行代码q行着色只需要半U。鉴于我们大部分的程序文仉只是几千行,因此用相同的技术开发的词法分析器显然可以在几十毫秒内完成对文g的分析,从而再也不需要担心词法分析器的性能问题了?br><br>    着色器的状态机一般都比词法分析器的状态机单,因ؓ(f)我们L使用一个颜色来表达一些类型的记号Q譬如操作符、数字和名字一般都用同L(fng)颜色——黑Ԍ。因此我们每当支持一U新语言或者当语言升的修改IDE的时候,L要同时修改两个状态机。手写状态机是很Ҏ(gu)出错的,如同手写语法分析器也很Ҏ(gu)出错一栗语法分析器的解军_法是让你l文法来生成语法分析器的代码Q因此词法分析器和着色器也用类似的Ҏ(gu)Q给状态机生成代码?br><br>    目前q个状态机只做了一半:(x)只能ȝ态,暂时q不能指定颜色或者记L(fng)型。当然添加一个指定颜色的功能是很单的Q不q我q需要想一惛_何用囑փ来表达,让状态机昑־更清晰。今天做了一个晚上搞定了状态机的编辑程序,如图所C:(x)<br> <div align=center src_cetemp="/images/cppblog_com/vczh/2010_CodeBox_02.jpg"><img border=0 alt="" src="http://www.shnenglu.com/images/cppblog_com/vczh/2010_CodeBox_02.jpg" width=681 height=768></div> <br>    接下来就可以开发两个功能,W一个是生成着色器的代码,W二个是生成词法分析器的代码。这样就可以避免因ؓ(f)E序写错从而省下一大堆调试的时间了? <img src ="http://www.shnenglu.com/vczh/aggbug/127104.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/vczh/" target="_blank">陈梓?vczh)</a> 2010-09-20 01:58 <a href="http://www.shnenglu.com/vczh/archive/2010/09/20/127104.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>开发自qIDEQ三Q?/title><link>http://www.shnenglu.com/vczh/archive/2010/09/18/126937.html</link><dc:creator>陈梓?vczh)</dc:creator><author>陈梓?vczh)</author><pubDate>Fri, 17 Sep 2010 16:43:00 GMT</pubDate><guid>http://www.shnenglu.com/vczh/archive/2010/09/18/126937.html</guid><wfw:comment>http://www.shnenglu.com/vczh/comments/126937.html</wfw:comment><comments>http://www.shnenglu.com/vczh/archive/2010/09/18/126937.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.shnenglu.com/vczh/comments/commentRss/126937.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/vczh/services/trackbacks/126937.html</trackback:ping><description><![CDATA[    今天来说一下智能提C的初步x。智能提C需要解决的问题有两个。第一个是q速知道光标位|在与编辑中的代码相对应的抽象语法树(wi)中的位置。第二个是把当前用户可以输入的东西显C出来ƈ且提供输入的便利。第一个问题里面有两个问题,包括用你能达到的最快速度分析代码全文l成语法?wi)ƈ产生scope表,以及地在用户输入东西的时候(f)时对输入的那一块Q如何确定块的区域,q个Ҏ(gu)不同的语a以及~辑的不同位|可能需要不同的法Q进行重新分析生一小?wi)。我们L可以在全文分析没l束之前Q用上一ơ全文分析生的scope表以及这小?wi)来得到?9%正确率的上下文?br><br>    那么今天要说的就是如何用C#q行高效的全文分析。我们知道全用LALR的话不仅隑ּ发而且代码难调试难试难修改,因此q了。最好调试的代码是什么呢Q显然是递归下降法写出来的。其实代码本来没多少层,所以递归下降最多也递归十几层,也不?x)太多,ȝ来说性能q是可以接受的。但是每来一个语aq一ơ递归下降q是很惨的。好?net自带C#~译器,我们可以使用parser combinator来生成。关于什么是combinatorQ可以参?a style="TEXT-DECORATION: underline" href="http://www.shnenglu.com/vczh/archive/2010/09/02/125621.html" target=_blank>q里</a>。至于什么是parser combinatorQ我曄用C++<a style="TEXT-DECORATION: underline" href="http://www.shnenglu.com/vczh/archive/2010/04/28/113836.html" target=_blank>实现了一?/a>?br><br>    Parser combinator的好处是我们可以在C#里面把文法直接表辑և来,然后变成一个语法分析器。不q直接执行combinatorQ性能?x)受到很大媄响。怎么h能把性能降低到跟手写的差不多呢?.NETl了我们三种武器Q分别是CodeDom、Emit和Linq Expression。我比较們֐于CodeDomQCodeDom可以让我们写C#来拼Z颗巨大的代表一个C#E序的语法树(wi)Q然后用自带?net~译器去~译成dll或者cs文g。因此这个C#的parser combinator的目的就是要让我们用最妙的语法来拼出目标语言的文法,最后根据文发来产生一份C#语法分析器的代码。我们可以每ơ运行的时候都~译Z个内存的dllQ或者直接生一个cs文g然后拖进我们的工E?br><br>    我目前可能会(x)采取前一U方法:(x)也就是用parser combinator来生文法树(wi)Q然后我提供一个函数来把它转换成一份对应的C#递归下降语法分析器的代码Q跟yacc很像哈,虽然他用的是LALRQ,最后编译它。因此只需要在IDEW一ơ打开某个语言的代码文件的时候编译出q个语法分析器,在IDEx之前都可以用了?br><br>    那语法分析器要生什么语法树(wi)呢?q个q是要我们自己来解决的。不q我采取了一U比较偷懒的Ҏ(gu)。我先写了一个语法树(wi)的基c(<a style="TEXT-DECORATION: underline" target=_blank>vlpp.codeplex.com</a>后Candidate\CodeBoxControl\CodeBoxControl\CodeProvider\*.csQ,然后只要你给我一个这样子的虚c:(x)<br> <div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><span style="COLOR: #008080"> 1</span> <span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">abstract</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> ExpressionNode : CodeNode<br></span><span style="COLOR: #008080"> 2</span> <span style="COLOR: #000000">    {<br></span><span style="COLOR: #008080"> 3</span> <span style="COLOR: #000000">    }<br></span><span style="COLOR: #008080"> 4</span> <span style="COLOR: #000000"><br></span><span style="COLOR: #008080"> 5</span> <span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">abstract</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> NumberNode : ExpressionNode<br></span><span style="COLOR: #008080"> 6</span> <span style="COLOR: #000000">    {<br></span><span style="COLOR: #008080"> 7</span> <span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> Number { </span><span style="COLOR: #0000ff">get</span><span style="COLOR: #000000">; </span><span style="COLOR: #0000ff">set</span><span style="COLOR: #000000">; }<br></span><span style="COLOR: #008080"> 8</span> <span style="COLOR: #000000">    }<br></span><span style="COLOR: #008080"> 9</span> <span style="COLOR: #000000"><br></span><span style="COLOR: #008080">10</span> <span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">abstract</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> AddNode : ExpressionNode<br></span><span style="COLOR: #008080">11</span> <span style="COLOR: #000000">    {<br></span><span style="COLOR: #008080">12</span> <span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">abstract</span><span style="COLOR: #000000"> ExpressionNode Left { </span><span style="COLOR: #0000ff">get</span><span style="COLOR: #000000">; </span><span style="COLOR: #0000ff">set</span><span style="COLOR: #000000">; }<br></span><span style="COLOR: #008080">13</span> <span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">abstract</span><span style="COLOR: #000000"> ExpressionNode Right { </span><span style="COLOR: #0000ff">get</span><span style="COLOR: #000000">; </span><span style="COLOR: #0000ff">set</span><span style="COLOR: #000000">; }<br></span><span style="COLOR: #008080">14</span> <span style="COLOR: #000000">    }</span></div> <br>    那么你就可以用CodeNode.Create<AddNode>()或者CodeNode.Create<NumberNode>()来获得相应的实现了。至于CodeNode的声明是q样的:(x)<br> <div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><span style="COLOR: #008080"> 1</span> <span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">abstract</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> CodeNode<br></span><span style="COLOR: #008080"> 2</span> <span style="COLOR: #000000">    {<br></span><span style="COLOR: #008080"> 3</span> <span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000"> TextPosition Start { </span><span style="COLOR: #0000ff">get</span><span style="COLOR: #000000">; </span><span style="COLOR: #0000ff">protected</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">internal</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">set</span><span style="COLOR: #000000">; }<br></span><span style="COLOR: #008080"> 4</span> <span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000"> TextPosition End { </span><span style="COLOR: #0000ff">get</span><span style="COLOR: #000000">; </span><span style="COLOR: #0000ff">protected</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">internal</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">set</span><span style="COLOR: #000000">; }<br></span><span style="COLOR: #008080"> 5</span> <span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000"> CodeNode ParentNode { </span><span style="COLOR: #0000ff">get</span><span style="COLOR: #000000">; </span><span style="COLOR: #0000ff">protected</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">internal</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">set</span><span style="COLOR: #000000">; }<br></span><span style="COLOR: #008080"> 6</span> <span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000"> CodeNodeCollection Nodes { </span><span style="COLOR: #0000ff">get</span><span style="COLOR: #000000">; </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">set</span><span style="COLOR: #000000">; }<br></span><span style="COLOR: #008080"> 7</span> <span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000"> ICodeScope OwningScope;<br></span><span style="COLOR: #008080"> 8</span> <span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000"> ICodeScope Scope;<br></span><span style="COLOR: #008080"> 9</span> <span style="COLOR: #000000"><br></span><span style="COLOR: #008080">10</span> <span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> CodeNode();<br></span><span style="COLOR: #008080">11</span> <span style="COLOR: #000000"><br></span><span style="COLOR: #008080">12</span> <span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> T Create</span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">T</span><span style="COLOR: #000000">></span><span style="COLOR: #000000">()<br></span><span style="COLOR: #008080">13</span> <span style="COLOR: #000000">            where T : CodeNode;<br></span><span style="COLOR: #008080">14</span> <span style="COLOR: #000000">    }</span></div> <br>    因此当你往AddNode.Left赋值的时候,也就是等于在写CodeNode.Nodes["Left"]Q这是Create<T>所提供的实C。当然写q去了之后ParentNode和Scope属性就?x)立L效了。这U方法还是可以剩下你不少旉的?br><br>    今天p到这里了Q然后我得d发那个C#的parser combinatorq且惛_一个单元测试的对策Q这也是一U练?fn)哈Q,然后再l写博客了。不q中U节那一整个星期都要回家办点事情所以估计会(x)暂停? <img src ="http://www.shnenglu.com/vczh/aggbug/126937.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/vczh/" target="_blank">陈梓?vczh)</a> 2010-09-18 00:43 <a href="http://www.shnenglu.com/vczh/archive/2010/09/18/126937.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>开发自qIDEQ二Q?/title><link>http://www.shnenglu.com/vczh/archive/2010/09/17/126817.html</link><dc:creator>陈梓?vczh)</dc:creator><author>陈梓?vczh)</author><pubDate>Thu, 16 Sep 2010 18:32:00 GMT</pubDate><guid>http://www.shnenglu.com/vczh/archive/2010/09/17/126817.html</guid><wfw:comment>http://www.shnenglu.com/vczh/comments/126817.html</wfw:comment><comments>http://www.shnenglu.com/vczh/archive/2010/09/17/126817.html#Feedback</comments><slash:comments>12</slash:comments><wfw:commentRss>http://www.shnenglu.com/vczh/comments/commentRss/126817.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/vczh/services/trackbacks/126817.html</trackback:ping><description><![CDATA[    今天先放囑֓。智能完成已l开始做试验了不q距能看还差很q,所以今天先l箋谈一下着色的事情?br> <div align=center src_cetemp="/images/cppblog_com/vczh/2010_CodeBox_01.jpg"><img border=0 alt="" src="http://www.shnenglu.com/images/cppblog_com/vczh/2010_CodeBox_01.jpg" width=718 height=660></div> <br>    q就是我暂时实现的所有功能了。首先着色算法可以外挂,其次左边那个Ҏ(gu)Q大和l制均可以订Ӟ操作他的时候会(x)发生什么事情也是外挂的。着色器?#8220;断点变红”是分d两个不同的插件接口里面的Q原?a style="TEXT-DECORATION: underline" href="http://www.shnenglu.com/vczh/archive/2010/09/16/126706.html" target=_blank>上一文?/a>说过了。你们可能还?x)注意到那个灰色的框框。那个框框的是?x)被~辑器当成一个整体来对待Q不q我l对<span style="COLOR: red"><strong>q没有实现折?/strong></span>。因为在我的设计里面Q如何进行折叠应该是插g的事情,控g本n只要处理好怎么~辑和显C就行了。还有一个比较难发现的就是,我这玩意儿也是支持输入法的,输入法的H口?x)跟随光标移?#8230;…<br><br>    在开发这个东西的时候我试了两U新Ҏ(gu)。第一U是MVC。MVC开发高亮还真是Ҏ(gu)啊,不仅文字~存部分QC#也是可以_控制内存的哈Q可以独立出来,q编辑操作(各种按键鼠标l合Q其实也可以不做在控仉面。这h什么好处呢Q当然是可以q行高强度的单元试了哈。第二种是GUI自动化,光对c进行单元测试还是不够的QVisual Studio 2010?net单元试工程提供了一个Coded UI Test框架可以l我启动一个独立的外部E序QMFC写的也行QW(xu)inForm写的也行QW(xu)PF写的也行Q网都行)然后操作上面的各U控件最后拿到控仉面的信息。不q可惜的是我的文本框q没有按照Windows的UI Automation标准来实玎ͼ从而让盲h也能使用q个控gQ,因此只能q行键盘和鼠标的操作Q至于我l制的东西是什么则需要其他方法。C#跨进E怎么做最方便呢?当然是Windows Communication Foundation了哈。ؓ(f)了写_的单元测试是要不惜一切D。不q显然WCF的服务不可能做在控g里,因此我的solution下面暂时有控g工程、测试工E和被测试的“独立E序”工程了?br><br>    有了GUI自动化测试,我在q行重构的时候,可以放心的修改代码Q然后执行测试程序,d面喝杯茶。过个几分钟试工程׃(x)跟我报告一共挂掉了多少个caseQ只要修好就行了。这U方法杜l了l大多数q心引L(fng)bug。如果你在公怋用类似技术来对付你的代码的话可以有效减少工作旉Q从而让公司可以榨取更多价倹{?br><br>    操作的组合还是比较麻烦的。ؓ(f)了全套支持,我特地操作了一下Visual Studio 2010的文本框Q然后对一些我看不眼的行为经q修改之后,现在已经可以实现{LEFT, RIGHT, UP, DOWN, HOME, END, PAGEUP, PAGEDOWN, ENTER, BACKSPACE, DELETE}×{null, CONTROL, SHIFT, CONTROL+SHIFT}?4U操作方法。加上鼠标,H破半百。这么复杂的东西Q如果没有够的单元试Q也没有_的GUI自动化测试的话,随便改个什么都很有可能发生问题的。所以开发这cȝ序的时候要十分心Q一定要写单元测试?br><br>    至于着色应该怎么试呢?只要有了WCFQ就十分单了。测试程序发送两个坐标,W(xu)CF服务q回坐标之间所有字W的颜色代号p了。代h可以在测试程序跟被测E序之间U定的,所以这U方法就让测试变得十分简单了?br><br>    开发这一部分一p掉我大约四天旉Q假设不用上班每天能?个小Ӟ累计出来的)。当然^时要上班所以实际花Ҏ(gu)要多一倍不止的。其实当我在U怸d了上图C#着色器的状态机之后Q也没想到实现出来速度q么猛的。虽然着色器使用状态机来实现已l是速度最快的Ҏ(gu)了(l过大学4q写~译器的l验……不过我后来用C++做出了一个能Ҏ(gu)正则表达式在内存中生词法分析器的,比手写的更快Q,不过q是要感叹一?netC4.0q是比v当年?.0要进步无I多倍的哈。虚拟机可以在执行的时候才开始生ƈ优化x86代码Q可以让E序跑快Q非骗hQ编译原理小白请自行学习(fn)Q,q还是静态编译其所不能辑ֈ的。之前还看过channel9上面的视频讲微Y某个研究院在做一个全新的javascript引擎Q看h好像没有加进IE9betaQ,是用了动态的两阶Dprofile+optimize+codegen的方法,通过为瓶颈代码用激q优化方法,从而让M的运行和~译旉的d降到最低。生成X86什么的q是非常ȝ的,M我已l被机器码囧了半q_(d)暂时不想JIT?#8230;…当然q是q早要再Cơ的?br><br>    写到q里先觉了,下一开始说之前在纠l的q程中生的几个完成的方案。迟早都要把它给做出来的? <img src ="http://www.shnenglu.com/vczh/aggbug/126817.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/vczh/" target="_blank">陈梓?vczh)</a> 2010-09-17 02:32 <a href="http://www.shnenglu.com/vczh/archive/2010/09/17/126817.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>开发自qIDEQ一Q?/title><link>http://www.shnenglu.com/vczh/archive/2010/09/16/126706.html</link><dc:creator>陈梓?vczh)</dc:creator><author>陈梓?vczh)</author><pubDate>Wed, 15 Sep 2010 16:19:00 GMT</pubDate><guid>http://www.shnenglu.com/vczh/archive/2010/09/16/126706.html</guid><wfw:comment>http://www.shnenglu.com/vczh/comments/126706.html</wfw:comment><comments>http://www.shnenglu.com/vczh/archive/2010/09/16/126706.html#Feedback</comments><slash:comments>27</slash:comments><wfw:commentRss>http://www.shnenglu.com/vczh/comments/commentRss/126706.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/vczh/services/trackbacks/126706.html</trackback:ping><description><![CDATA[    <strong>在写q篇文章的时候,我正在尝试自己开发一个我自己认ؓ(f)能拿出去见h的IDE。当然此时此L只开展了一点点工作。所以这文章没有什么最l的指导性,而是在记录我开发IDE的思考过E。当然我觉得之前写了那么多东襉K了开了源之后介绍了我的作品让大家可以更好的理解ƈ学习(fn)以外Q其实也没有什么大的效果(除了几篇|顶的教E我个h觉得q是有点效果?#8230;…Q。因此我试做一下改变,把我的思考过E描q出来。一斚w我自己可以从一个更高的高度来审视我自己Q第二个是如果你们想从我这里拿C么,或者想教我什么,误便哈?/strong><br><br>    其实以前q不是没有开发过IDEQ只是那个IDE除了语法高亮以外什么都没有Q因此其实ƈ没有什么大的用处。个为IDE要提供给你的功能有三点:(x)提示、集成调试、辅助部|Ӏ当然在我眼中最厉害的IDE当属VisualStudio了,各种功能真是非常人性化Q而且也跟我的观点比较一_(d)(x)我只是想开发个~译器然后开发个makefilepȝ让别人可以方便一点用我的~译器而已Qؓ(f)什么我一定要用makefile来组l我的编译器源代码啊Q一炚w不方便(?br><br>    是个E序员都是这么想的哈?br><br>    IDEq是好东ѝ前几天我在<a style="TEXT-DECORATION: underline" target=_blank>vlpp.codeplex.com</a>上面checkin了一份我开发的语法高亮~辑器的雏ŞQ下载后打开Candidate\CodeBoxControl\CodeBoxControl.slnQ,完全用C#写。我的Demo也是用的C#Q外挂了一个可以分析C#的关键字、字W串和注释的代码着色器Q在我的机器上(虽然我觉得比较强大,不过我的E序也是单核的,因此其实也只?.7G的频率)着色一个将q?0万行的程序只需要半U钟。其实大家大可不必觉得C#很慢Q其实是很快的,慢的是你的内心?br><br>    当然我也做了一点优化,全文着色要半秒Q不q其实你在编辑的时候是不需要L全文着色的。所以我的着色器接口做了一点小限制Q?br>    1、你必须用状态及实现Q而且状态及的状态只能用intcd来表达?br>    2、着色必L上下文无关的?br><br>    对于2可能比较隄解。首先C#那个可以查出一个ID是不是一个类型然后变色其实根本不是着色器的Q务(Ҏ(gu)我的设计Q你可以在另一个地方(f)时更攚wԌ也能实现Q。其ơ对于一个给定的L字符串前~Q其着色效果不能跟前缀之后的Q何字W有关系?br><br>    因此我只需要记下每一行的末尾着色器当时的状态,可以从L位置开始到L位置l束q行部分着色了。因此这里就有很多的优化I间。有了这些优化之后,我用我的Demo~辑一个将q?0万行的C#文g的时候,那个q行在UIU程里面的着色算法丝毫没有让我觉得有延迟Q只有在数情况下(瞬间贴了好几万行代码Q然后按ctrl+end跛_全文最后,我不得不对你贴进ȝ东西立刻着Ԍ才会(x)让你感觉到有于半秒钟的延迟。所以我觉得q个设计已经可以辑ֈ我的要求了,因ؓ(f)我自己写的代码一般单个文仉没有过1万行Q所以偶?dng)给我一个小?.05U的延迟其实也是无所谓的……<br><br>    Z么可以进行优化呢。你可以想一下,如果我正在对某一行进行编辑,而且q一行后面的代码都已l被着色过了,那么如果你的改动都没有让行末着色器状态发生变化,那么q一行后面的所有字W都不需要更改他的着Ԍ因此我就可以只对你当前编辑的一行进行着Ԍ唯一修改的其实也只有那U多行注释,你一般也不会(x)写很多这U多行注释的Q都用的单行……Q。一百来个字W的着色基本上可以忽略Q因此无Z的文件有多大Q其实着色速度是跟你^均每行的长度有关p,只有在极数情况下才?x)跟你的行数有关pR这个时候你可以看到着色器两个限制的强大威力了吧?br><br>    那么Q当我们对一行代码进行断点的时候,代码颜色的修Ҏ(gu)如何做的呢?Zq个东西d响着色器那个强到可以忽略的效率实属杀鸡取卵,所以答案就是:(x)外挂一个控刉板接口,让你可以在显C某一行的时候(f)时修攚w一行每个字W颜艌Ӏ听h好像很媄响效率,不过我们要相信,一行代码也只有那么几十到一百来个字W,一屏幕的代码最多也׃两千个字W。Q何语a无论多慢Q对一个一两千那么长的数组赋|也是奇快无比的,何况是C#q么快的语言……<br><br>    因此我们剩下的问题就是如何实C个可以修Ҏ(gu)字颜色的普通文本框了哈。经q我?此研IӞl论是Q不要用RichTextBoxQ你自己自绘从头写一个。第二个l论Q凡是GUI最好都别用C++Q无论GUIcd多么好,一个没有内存管理器p以让你觉得很ȝ了,当然对于~译器本w我q是推荐C++的,因ؓ(f)~译器虽然算法复杂,不过l构单,所有的内存分配都是可以预测的,因此deleteh非常有信心?br><br>    最q一两个星期都在U结如何实现一个简单的上下文有关的提示功能Q至按?."?x)有个列表什么的Q。这个明天再写了Q今天只有一点点头AQ还没完全成型? <img src ="http://www.shnenglu.com/vczh/aggbug/126706.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/vczh/" target="_blank">陈梓?vczh)</a> 2010-09-16 00:19 <a href="http://www.shnenglu.com/vczh/archive/2010/09/16/126706.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.shnenglu.com/" title="精品视频久久久久">精品视频久久久久</a> <div class="friend-links"> </div> </div> </footer> <a href="http://www.jh942.cn" target="_blank">޾Ʒþò</a>| <a href="http://www.taobaoke.net.cn" target="_blank">Vþþ</a>| <a href="http://www.10711.com.cn" target="_blank">þAV</a>| <a href="http://www.ijesus.com.cn" target="_blank">ղƷ99þþþþ</a>| <a href="http://www.dxctutor.cn" target="_blank">þþƷav鶹ͼƬ </a>| <a href="http://www.sklly.cn" target="_blank">avþþþþòվ </a>| <a href="http://www.zodao.cn" target="_blank">޾ƷۺϾþ</a>| <a href="http://www.elzx.com.cn" target="_blank">ھƷþþþӰԺ</a>| <a href="http://www.rvyq.cn" target="_blank">þô̫㽶av</a>| <a href="http://www.3233567.cn" target="_blank">ѾƷþ</a>| <a href="http://www.hjpz333.cn" target="_blank">޹Ʒþ</a>| <a href="http://www.hbswmm.cn" target="_blank">þۺϸϾþúݺݺ97ɫ</a>| <a href="http://www.yc-shop.cn" target="_blank">þˬˬƬAV</a>| <a href="http://www.hotdee.com.cn" target="_blank">޹Ʒþþϼ2</a>| <a href="http://www.hbsannong.com.cn" target="_blank">޾þþһ</a>| <a href="http://www.zhengchaoyue.cn" target="_blank">þþþƷ2019ѹۿ</a>| <a href="http://www.daemontools.org.cn" target="_blank">˾þþƷһ</a>| <a href="http://www.604664.cn" target="_blank">ƷžžþƵ</a>| <a href="http://www.191c.cn" target="_blank">˺ݺۺ88ۺϾþ</a>| <a href="http://www.sfwan.cn" target="_blank">þˬˬƬAV</a>| <a href="http://www.ww0w.cn" target="_blank">þþƷAVũ帾Ů</a>| <a href="http://www.ruimen.com.cn" target="_blank">9þ9þþƷ</a>| <a href="http://www.zgwlptw.cn" target="_blank">ŷպ˾Ʒþþѿ </a>| <a href="http://www.awo6.cn" target="_blank">þùƷ99þþþþ </a>| <a href="http://www.squc.cn" target="_blank">Ʒ׾þAAAƬ69</a>| <a href="http://www.szsdhy.cn" target="_blank">þٸ۲AV</a>| <a href="http://www.uovd.cn" target="_blank">ɫɫݺɫۺϾþ</a>| <a href="http://www.xuzhou86.cn" target="_blank">þþƷһӰԺ</a>| <a href="http://www.e-zhishi.cn" target="_blank">޾ƷþþþþҲ</a>| <a href="http://www.x705.cn" target="_blank">þСƵ</a>| <a href="http://www.48zyai5o.cn" target="_blank">þ߳ˮ</a>| <a href="http://www.t6s.com.cn" target="_blank">޳˾Ʒþ</a>| <a href="http://www.5656936.cn" target="_blank">þݺҹҹ2014</a>| <a href="http://www.splh.net.cn" target="_blank">ƷŮþþþ</a>| <a href="http://www.63550.com.cn" target="_blank">þAV</a>| <a href="http://www.jiulongpu.cn" target="_blank">þþþþҹƷƷ</a>| <a href="http://www.cz27b1.cn" target="_blank">þþþùƷ</a>| <a href="http://www.rosettagetty.com.cn" target="_blank">þˬˬAV</a>| <a href="http://www.maishuhua.cn" target="_blank">þþƷѿ</a>| <a href="http://www.top119.cn" target="_blank">þѾƷƵ</a>| <a href="http://www.pynov.cn" target="_blank">þþùƷһ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>