|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
那做企业软件是不是最好用J2EE?假如只是想写几句实验代码,VisualStudio显得有点牛鼎烹鸡。因而一些开辟者会选择轻量级的编纂器,如Notepad++,来满意编写剧本的必要。OlegShilo向我们先容了他的项目,一个优异的基于CS-Script的Notepad++的插件。
InfoQ:CS-Script是甚么?它与一般的C#有甚么区分?Oleg:复杂来讲,CS-Script是一个基于CLR的运转时情况,能够实行用C#编写的剧本。值得注重的是,CS-Script并非一个注释器,而是封装了微软或MonoC#编译器的shell。因而它与一般的C#没有甚么分歧。实践上,它的剧本引擎面向的也是ECMA兼容的“纯真功效”的C#,与用VisualStudio或MonoDevelop编译成程序集的C#没有甚么区分。
形貌CS-Script最复杂的体例是:我们能够用C#编写算法,编译成程序集,然后间接实行该程序集,或在宿主使用程序中加载并实行。但CS-Script能够跳过编译阶段,而当即加载并实行代码,将C#代码当作剧本来处置。换句话说,运转时的C#剧本就是一个静态编译的程序集。
固然,实践情形要比这庞大很多,并且CS-Script供应了浩瀚吸引眼球的特征:自界说JIT编译、省略类的语法、主动定名空间到程序集的映照、接口对齐等。
CS-Script如今已9岁了,而且有一批用户。MediaPortal或FlashDevelop就是基于CS-Script构建的。它还被用于AutoCAD插件、主动化和呆板人、游戏和划定规矩引擎。
CS-Script遭到了Python的启示和影响。只管它们面临的是完整分歧的运转时范式,但CS-Script仍是从Python自创了很多有效的设法,如多剧本实行、预编译等等。 InfoQ:为何会为Notepad++创立一个插件?Oleg:缘故原由有良多。在Windows上开辟的程序员很少有没传闻过Notepad++的。对良多人来讲,它是“必备”的源代码编纂器。可以获此殊荣,Notepad++是当之无愧的,由于它具有优异的架构和近乎完善的完成。但除这些赞誉,它另有必定的上升空间。
我以为Notepad++的“主动补全”功效另有点大略,还不敷以成为智能的代码帮助工具。它只是按文件范例分组的一些“高频词”罢了。
我深信如许一个很牛的编纂器应当变得更好。因而我决意为Notepad++完成一个C#的智能感知办理计划。
我想让Notepad++能具有与VisualStudio同种级其余智能感知。同时还包含“转到界说”、“查找援用”、“显现办法信息”、“增加短少的‘using’”和代码格局化。这就是这个插件出生的启事。智能感知相干的功效基于NRefactory,但插件的中心是CS-Script。而且因为插件利用了剧本引擎,因而能够在Notepad++中间接实行C#代码。
当完成完成后,我又催生了其他一些设法。因而又公布了另外一个Notepad++插件(NppScript)。它利用C#剧本对Notepad++自己举行主动化。实践上每一个如许的剧本本身,加上一些相干的插件特征(工具条图标、快速键、菜单项),都能够当作是一个插件。上面的截图展现了这一设法。
(点击图象缩小)
另外一个缘故原由是由于CS-Script。只管有了VisualStudio扩大和WindowsExplorerShell扩大,我仍是以为CS-Script不敷美满,没有一个专门的富编纂器。我固然晓得VisualStudio供应了无与伦比的“编纂才能”,但它也不是“银弹”。我想让C#和CS-Script用户具有一个壮大且轻量级的编纂器,不必要思索任何部署和license的成绩。
3年前我乃至仔细地实验着开辟如许一款编纂器。我花了大批工夫对SharpDevelop做反向工程,而且几近完成了一个为C#量身定做的编纂器(代码名为UltraSharp)。它是一个基于编纂器的自界说的WinForm,包装了NRefactory5预览版。但其功能和编纂功效都不克不及让人中意。因而我保持了这个项目,转而专注于在VisualStudio中集成CS-Script。我固然获得了乐成,但仍然心仪永世收费、功能出色、轻量级的Notepad++。
关于这个插件,我另有一个不太分明但却激烈的念头。我们一样平常事情云云庞大。框架、工场、形式、计划准绳……我们几近健忘了编程的兴趣。我不止一次地在文章中看到先容批量重定名工具、下载器、目次同步工具或仅仅是又一个MP3文件标签构造工具。这些工具经常是为了引出全功效的使用程序开辟(或部署计划),但在良多情形下,一样的工具能够仅用几行代码完成: - foreach(stringfileinDirectory.GetFiles(".","*.mp3")){varmp3=TagLib.File.Create(file);stringdir=Path.GetDirectoryName(file);stringfileName=string.Format("{00}.{1}.mp3",mp3.Tag.Track,mp3.Tag.Title);File.Move(file,Path.Combine(dir,fileName));}
复制代码在Notepad++中可使用CS-Script.Npp插件来实行上述代码。它乃至能够筹办一些剧本,可以在没有安装Notepad++的PC上运转。
我以为Notepad++和CS_Script让我们无机会只存眷代码,而不必忧虑代码的基本布局,不必思索在那里保留项目文件或寻觅方才编译的可实行文件。乐在码中。 InfoQ:创立一个Notepad++插件都包括哪些内容?Oleg:传统的Notepad++插件开辟请求用C++编写代码。只管我用C++没成绩,但我仍是更喜好C#。因而我用NppPlugin.NET作为插件容器。必要出格指出的是,这个插件宿主计划能够文雅地应对互操纵的应战。它只是一个特别的VS项目模板,包括一些伶俐的预编译举动,能够注进特别的导出标记。因而,非托管的宿主使用程序(如Notepad++)能够在不借助任何包装器的情形下,间接承载一个一般的程序集。该项目模板还供应了一个接口(布局、常量),供应在其他插件中存在的一切Notepad++功效。
我利用了另外一个第三方办理计划是ICSharpCode.NRefactory(属于SharpDevelopIDE)。它是最成熟的剖析C#代码和构建语法树的开源办理计划。别的,它还完成了代码主动补全。但实践上它几仍是有点庞大。
NRefactory没有文档。只管作者供应了充实的代码示例,这貌似是一个更好的选择。但一切示例都是SharpDevelp独有的,假如不利用SharpDevelopUI控件套件的话,它们没法供应任何匡助。我花了大批工夫和精神对API举行反向工程,并终极乐成将其集成到Notepad++插件中。
另有一个应战是完成代码格局化。我做出了一个困难的决意,完成本人的格局化办理计划,而不是利用NRefactory内置的格局化。这是由于NRefactory的格局化其实不完整(最少我利用的版本是如许),并且关于非尺度的语法(如没有类的C#剧本)不敷天真。
在触及到用户交互时,我复制了VisualStudio的一切次要用户体验:办理计划扫瞄器、输入面板,CodeMap等等。 InfoQ:假定某公司创立了一个小型的DSL供外部利用。您以为让一个开辟者创立他们本人的Notepad++插件是不是可行?这是不是必要全部团队的勉力?
[quote]Oleg:这固然取决于开辟的范围。办理计划由以下几个逻辑部分构成:插件基本、语法高亮、语法剖析和用户交互撑持。
插件基本能够说是最复杂的部分。NppPlugin.NET能承当年夜部合作作。因而完整能够由单个开辟者弄定。假如开辟需求不重,乃至可使用NppScripts(Notepad++主动化插件)。全部基本布局不到100行代码。NppScripts公布时自带了一个剧本示例,能够完成自界说的主动补全——同意特定高低文补全倡议的主动补全功效。
语法高亮在年夜多半情形下能够经由过程定制内嵌的Notepad++款式来完成。某些高亮义务没法由定制完成,那末就必要本人开辟完全的Lexar(一般用C++开辟)。但也只必要一个开辟者便可。
语法剖析器的事情量与语法的庞大度成反比。因而像DOS指令如许复杂的语法只必要一团体。但像C#如许庞大的语法就一定必要一个团队了。只管CS-SCript.Npp是一团体完成的,不外幸亏我没有任何刻日。
为DSL撑持用户交互也非常复杂。年夜多半情形下只必要主动补全的弹出框和一些设置把持台。一样也是一团体的事情量。固然,除非DSL的庞大性请求在运转时举行麋集的用户交互。
在经过全球个人PC市场占有90%的微软对asp.net不断优化与整合后,asp.net与微软自身平台的动用上更加的高效,加上asp.net在应用上非常容易上手,相信asp.net仍会是最多客户选用的脚本语言,并会在未来几年继续领跑。 |
|