Delphi与C#之父:技术理想zen架构之父开发传奇

Anders Hejlsberg(安德斯-海森博格) 坐在自己的办公室,双眼直直的盯着前方。他要做一个决定,决定自己未来的命运和理想。这是1996年一个普通的下午,几个小时前,他刚与比尔-盖茨结束了 一次愉快的午餐,同为软件界的精英,他们相谈甚欢,盖茨给他开出三百万以上的年薪和数万股的微软股票。这是一个诱人的条件,但更重要的是,盖茨许诺他可以 有充分的时间和资源投身自己感兴趣的技术方向。
Anders在犹豫,他是否真的要离开已经工作了十三年的Borland。从Turbo Pascal、SideKick再到Delphi,Borland是Anders辉煌的起点,他在这里成为人们敬仰的软件大师,并一手铸就了 Borland传奇;在Borland,Anders有太多美好的回忆和未完成的理想。
Anders Hejlsberg
然而,随着1994年Philippe Kahn(Borland公司创始人)的离去,Anders渐渐失去了最强有力的支援;Borland的新任CEO Delbert Yocam希望加强Delphi在IDE市场的王者地位,因为Delphi才是Borland最主要的财务来源;但Anders已经看到Java和虚拟机 语言的潜力,与其在已有的产品上徘徊不前,他更想专注于新产品Borland Java(后来的JBuilder)的研发;Borland的管理层的技术短视和Anders的技术追求显得如此格格不入;Anders回忆那段经历时曾 说&那时,我感觉自己并不是不可缺少的人&。
风靡一时的Turbo Pascal
Borland的内部矛盾很快引起了微软的注意,Anders在开发界的名头和对技术的理解使微软急不可耐,甚至对Borland使用了最直接 的攻击。微软人力部门派遣加长型的大轿车到Borland大门口找Anders吃饭,并开出了年薪百万美元以上的条件;在苦等无应、按捺不住之下,很快就 再次联系Anders,这次给出的条件是两百万美元,但依然没能打动Anders。微软开始思索金钱以外的东西。第三次,比尔-盖茨亲自出马,除了开出三 百万的价码,还给Anders完成技术理想的许诺。
经过短暂的犹豫,Anders完成了自己的决定,这个决定足以像Turbo Pascal和Delphi那样再次振动整个开发界;因为这个决定,促成了VJ++、C#和微软.NET战略的诞生。
Visual J++
1996年,Anders正式加盟微软,成为Visual J++和WFC(Windows基础类库)的架构师。他的第一个项目与其在Borland的技术理想相当接近,在微软知名的Visual Studio平台上打造一个基于虚拟机的语言和像Delphi一样彻底解放程序员生产力的IDE。这就是J++语言和VJ++开发工具。我们知道,编程语 言和IDE的开发相当考验一个架构师的功力,作为用汇编打造Turbo Pascal和亲手开发Delphi的软件大师(自Anders离开Borland后,Delphi的底层架构在三年内一直无人可以修改),Anders 不负众望,微软很快在新版Visual Studio 6.0版本中引入了J++;微软平台的程序员找到了击败Java阵营的工具。
在相当一段时间里,J++成为微软抗衡Java的最有力武器;同时,由于Anders对Java的一些想法,改进后的J++甚至吸引了一大批 Java程序员。后来由于微软在Java开发工具授权问题上和Sun公司的纠纷以及Borland公司对微软大张旗鼓的挖角的报复,迫使微软停止了 Visual J++的后续开发。在Borland对微软和Anders个人的起诉书上写有这样一句话:&Anders正在帮助微软开发Delphi for Java&。
作为Anders在微软的第一个产品,J++曾一度取得成功;但最后的纠纷使Anders意识到,商业环境的变化已经无法再像当年做 Pascal那样随意,想要完成自己的梦想,必须帮助微软打造自己的技术平台和编程语言,而这门语言不是C++,因为他不想受C++标准委员会的限制;这 门语言也不是Java,因为他看到Java不完美的地方和商业纷争;Anders要的,是运行在独立平台上的一门完美语言 。
VJ++之后,Anders作为.NET概念的发起人之一,被任命为微软.NET的首席架构师主持开发工作。众所周知,.NET框架最初是个模 糊的概念,即使是推出.NET战略一年之后,开发者依然无法看清.NET的技术愿景。其实,Anders也在不断的思考,从Turbo Pascal到Delphi再到现在的.NET,所有这一切都是致力于对开发者生产力的解放;但在微软,他要做的是平衡技术理想和商业价值的关系;还好, 比尔盖茨履行了他当年的诺言,Anders可以按照他的想法打造.NET;程序员出身的盖茨相信,好的技术必然会带来好的商业价值。
在经过不断的反思和讨论之后,Anders确定了.NET未来的走向:一个致力于敏捷软件开发、快速应用开发、平台无关性和网络透明化的软件开 发平台。.NET将是微软为下一个十年对服务器和桌面型软件工程迈出的第一步。它应该包含许多有助于互联网和内部网应用迅捷开发的技术。
这就是我们现在所看到的.NET,更重要的是,为了实现这一平台,Anders需要一门新的编程语言,它既要像Java一样通过虚拟机实现平台 的跨越,还要避免一些开发者普遍抱怨的Java语言存在的缺点;同时,这门语言的革新将使得程序员可以同时进行Windows应用软件和网络应用软件以及 组件和服务的开发。这门语言就是C#。
& .NET已成为微软的基础技术架构
Anders曾笑称自己&把上世纪末和本世纪初的全部献给了C#&。作为C#的架构师,Anders对其倾注了自己的全部精力。2003年,在 Channle 9的一次访谈中,《Java编程思想》的作者Bruce Eckel向Anders证实一段传闻:&我听说C#是一个工程师小组在一个屋子里设计出来的? &,Anders苦笑作答:&是的。4年来,我们一直呆在这个屋子里。现在,每周一、三、五,我们仍然在这里会面。&
我们可以想象Anders为使C#只允许单一继承,同时保证一个类可以实现多个接口功能的苦苦思索;也可以想象他为C#支持完整反射的反复论证;这一切都是为了他的技术理想,而这个理想自大学时代开发Turbo Pascal时就未曾变过。
现在,我们已经看到了.NET和C#的成功,这不仅体现在每期的编程语言排行榜上,在Windows平台和众多.NET开发的网站上,.NET和C#现在已经无处不在。在Delphi的辉煌过后,Anders正在用自己的理想续写新的技术传奇。
阅读(...) 评论()Delphi分割字符串的函数ExtractStrings(转)
Delphi分割字符串的函数ExtractStrings
Delphi分割字符串的函数ExtractStrings,分割的同时还可以去空字符串和去空白(可以自定义).
ExtractStrings Routine Fills a string list with substrings parsed
from a delimited list.
[Delphi] function ExtractStrings(Separators: TSysCharS
WhiteSpace: TSysCharS Content: PAnsiC Strings: TStrings):
Description Use ExtractStrings to fill a string list with the
substrings of the null-terminated string specified by Content.
Separators is a set of characters that are used as delimiters,
separating the substrings. Carriage returns, newline characters,
and quote characters (single or double) are always treated as
separators. Separators are ignored when inside a quoted string
until the final end quote. (Note that quoted characters can appear
in a quoted string if the quote character is doubled.)
WhiteSpace is a set of characters to be ignored when parsing
Content if they occur at the beginning of a string.
Content is the null-terminated string to parse into
substrings.
Strings is a string list to which all substrings parsed from
Content are added. The string list is not cleared by
ExtractStrings, so any strings already in the string list are
preserved. ExtractStrings returns the number of strings added to
the Strings parameter. Note:
&ExtractStrings does not add empty strings
to the list.
Separators 参数指定一组分割符,所有的子串都是用它们分割的。但是成对的引号内的分割符会被忽略(参看下面的例子)。
WhiteSpace 参数指定每个子串开头被忽略的字符s。
Content 参数就是被分割的“源”串了。
Strings 参数用于接收分割后的各个子串。它的原有内容不会被清空。别忘了Create哦。
另外,EctractStrings不会把(忽略WhiteSpaces后的)空串加入到Strings中。
写个例子吧:
ABC|...& DEF|#### GHI|"不会被分开|#"
不会被分开|#
四个子串可以用下面的代码:
& ASource: PC
& ACount: I
& AStrings: TStringL
& ASource :=
''ABC|...& DEF|#### GHI|"不会被分开|#;
& AStrings := TStringList.C
ACount := ExtractStrings([''|''], ['' '', ''#'', ''.''], ASource,
AStrings);
{do any further processing}
/for AStr in AStrings do
//& Writeln(AStr);
AStrings.F
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。按道理来说Anders Hejlsberg已经违反了保密协议了吧
[问题点数:50分,结帖人chichenzhe]
按道理来说Anders Hejlsberg已经违反了保密协议了吧
[问题点数:50分,结帖人chichenzhe]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
相关帖子推荐:
本帖子已过去太久远了,不再提供回复功能。来自C#之父的编程语言趋势预测
  程序设计离不开编程语言,但是编程语言在国内的大环境中似乎一直是个二等公民,许多人也认为,语言的讨论完全是不入流的,但其实编程语言与工具、框架或开发方法等一样,都对生产力有着重要的影响。
  事实上,语言的发展历史比其他方面更为悠久,并且在过去十几年,甚至最近几年中都依然在不断的碰撞和演变。期间一些新的语言诞生了,而另一些在当时看来阳春白雪的语言和编程范式也重新获得了重视。
  Anders Hejlsberg是微软的Technical Fellow,担任C#编程语言的首席架构师,也参与了.NET Framework、VB.NET和F#等语言的设计与开发,《Delphi与C#之父:技术理想架构开发传奇》一文详细介绍了Anders Hejlsberg在微软的编程传奇之路。
  几个月前,Anders在比利时TechDays 2010及荷兰DevDays 2010分别作了一场演讲,阐述了他眼中的编程语言的发展趋势及未来方向,本文便对他的观点进行了总结。
  大约25~30年前,Anders开发了著名的Turbo Pascal,这是一套集语言、编译器及开发工具于一体的产品,也是Anders进入编程语言领域的起点。Anders谈到,当年Turbo Pascal所用的Z-80和如今的计算机已经不可同日而语。与那时相比,如今的机器已经有大约10万倍的外部存储容量,1万倍的内存大小,CPU速度也有大约1000倍的提高。但是,如果我们比较如今的Java代码及当年的Pascal代码,会发现它们的差别其实并不大。
  Anders认为编程语言的发展非常缓慢,期间当然出现了一些东西,例如面向对象等,但是远没有好上1000倍。事实上,近几十年来的努力主要体现在框架及工具等方面(如图1)。例如.NET Framework里有超过一万个类和十万个方法,与Turbo Pascal相比的确有了超过1000倍的增长。类似的,现在的IDE包含了无数强大的功能,例如语法提示、重构、调试器等。与此相比,编程语言的改进的确很不明显。
  在过去50~60年的编程历史中,编程语言的抽象级别不断提高,人们都在努力让编程语言更有表现力,这样就可以用更少的代码完成更多的工作。我们一开始使用汇编,然后使用面向过程的语言(如Pascal和C),然后是面向对象语言(如C++),随后便进入了托管时代,语言运行于受托管的执行环境上(如C#和Java),它们的主要特性有自动垃圾收集、类型安全等。Anders认为这样的趋势还会继续下去,还会有抽象级别越来越高的语言。另一方面,编程语言往往都倾向于构建于现有的工具上,而不会从头写起。现在出现的编程语言,例如F#、Scala和Clojure等,都是基于现有框架构建的,每次从头开始的代价实在太高。
  在Anders眼中,如今影响力较大的趋势主要有三个(如图2),分别是声明式的编程风格(包括领域特定语言、函数式编程)、动态语言(最重要的方面是元编程能力)以及多核环境下的并发编程。此外随着语言的发展,原本常用的面向对象语言、动态语言或是函数式等边界也变得越来越模糊,例如各种主要的编程语言都受到函数式语言的影响。因此,多范式程序设计语言也是一个愈发明显的趋势。
  声明式编程与DSL
  目前常见的编程语言大都是命令式(Imperative)的,例如C#、Java或C++等。这些语言的特征在于,代码里不仅表现了“做什么(What)”,而更多表现出“如何(How)完成工作”这样的实现细节,例如for循环、i += 1等,甚至这部分细节会掩盖我们的最终目标。
  在Anders看来,命令式编程通常会让代码变得十分冗余,更重要的是由于它提供了过于具体的指令,这样执行代码的基础设施(如CLR或JVM)没有太多发挥空间,只能老老实实地根据指令一步步地向目标前进。例如,并行执行程序会变得十分困难,因为像“执行目的”这样更高层次的信息已经丢失了。因此,编程语言的趋势之一,便是能让代码包含更多的“What”,而不是“How”,这样执行环境便可以更加聪明地去适应当前的执行要求。
  关于声明式的编程风格,Anders主要提出了两个方面,第一个方面是DSL(Domain Specific Language,领域特定语言)。DSL不是什么新鲜的玩意儿,我们平时经常接触的SQL、CSS、正则表达式等都属于DSL。有的DSL可能更加专注于一个方面,例如Mathematica、LOGO等。这些语言的目标都是特定的领域,与之相对的则是GPPL(General Purpose Programming Language,通用目的编程语言)。
  Martin Fowler将DSL分为外部DSL和内部DSL两种。外部DSL有自己的特定语法、解析器和词法分析器等,它们往往是一种小型的编程语言,甚至不会像GPPL那样需要源文件。与之相对的则是内部DSL。内部DSL其实更像是种别称,它代表一类特别API及使用模式。
  XSLT、SQL等都可以算作是外部DSL。外部DSL一般会直接针对特定的领域设计,而不考虑其他方面。James Gosling曾经说过:每个配置文件最终都会变成一门编程语言。一开始你可能只会用它表示一点点东西,慢慢地你便会想要一些规则,而这些规则则变成了表达式,后来你可能还会定义变量,进行条件判断等,而最终它就变成了一种奇怪的编程语言。这样的情况屡见不鲜。现在有一些公司也在关注DSL的开发。
  例如以前在微软工作的Charles Simonyi提出了Intentional Programming的概念,还有JetBrains公司提供了叫做MPS(Meta Programming System)的产品。最近微软也提出了自己的Oslo项目,而在Eclipse世界里也有Xtext,所以如今在这方面已经有不少尝试。由于外部DSL的独立性,在某些情况下也会出现特定的工具,辅助领域专家或是开发人员编写DSL代码。还有一些DSL会以XML方言的形式提出,利用XML方言的好处在于有不少现成的工具可用,这样可以更快地定义自己的语法。
  内部DSL往往只代表一系列特别的API及使用模式,例如LINQ查询语句及Ruby on Rails中的Active Record声明代码等。内部DSL可以使用一系列API来“伪装”成一种DSL,利用一些流畅化的技巧,例如像jQuery那样把一些方法通过“点”连接起来,而另一些也会利用元编程的方式。内部DSL还有一些优势,例如可以访问语言中的代码或变量,以及利用代码补全、重构等母语言的所有特性。
  DSL的可读性往往很高。例如,要筛选出单价大于20的产品,并对所属种类进行分组,降序列出每组的分类名称及产品数量。如果是用命令式的编程方式,可能是这样的:
  var groups = new Dictionary(); foreach (Product p in products) { if (p.UnitPrice &= 20) { if (!groups.ContainsKey(p.CategoryName)) { Grouping g = new Grouping(); g.Name = p.CategoryN g.Count = 0; groups[p.CategoryName] = } groups[p.CategoryName].ProductCount++; } } var result = new List(groups.Values); result.Sort(delegate(Grouping x, Grouping y) { return x.Count & y.Count ? -1 : x.Count & y.Count ? 1 : 0; });
  显然这些代码编写起来需要一点时间,且很难直接看出它的真实目的,换言之,“What”几乎完全被“How”所代替了。这样,一个新的程序员必须花费一定时间才能理解这段代码的目的。但如果使用LINQ,代码便可以改写成:
  var result = products Where(p =& p.UnitPrice &= 20) GroupBy(p =& p.CategoryName) OrderByDescending(g =& g.Count()) Select(g =& new { Name = g.Key, Count = g.Count() });
  这段代码更加关注的是“How”而不是“What”,它不会明确地给出过滤的操作方式,也没有涉及到创建字典这样的细节。这段代码还可以利用C# 3.0中内置的DSL,即LINQ查询语句来改写:
  var result = from p in products where p.UnitPrice &= 20 group p by p.CategoryName into g orderby g.Count() descending select new { Name = g.Key, Count = g.Count() };
  编译器会简单地将LINQ差距语句转化为前一种形式。这段代码只是表现出最终的目的,而不是明确指定做事的方式,这样便可以很容易地并行执行这段代码,如使用PINQ则几乎不需要做出任何修改。
  函数式编程
  Anders提出的另一个重要的声明式编程方式便是函数式编程。函数式编程历史悠久,如当年的LISP便是函数式编程语言。除了LISP以外还有其他许多函数式编程语言,如APL、Haskell、ML等。函数式编程在学术界已经有过许多研究,大约在5~10年前许多人开始吸收和整理这些研究内容,想要把它们融入更为通用的编程语言。现在的编程语言,如C#、Python、Ruby、Scala等,都受到了函数式编程语言的影响。
  使用命令式编程语言写程序时,我们经常会编写如x = x + 1这样的语句,此时我们大量依赖的是可变状态,或者说是变量,它们的值可以随程序运行而改变,可变状态非常强大,但随之而来的便是“副作用”问题,例如一个无需参数的void方法,它会根据调用次数或是在哪个线程上进行调用对程序产生影响,它会改变程序内部的状态,从而影响之后的运行效果。而在函数式编程中则不会出现这个情况,因为所有的状态都是不可变的。事实上对函数式编程的讨论更像是数学、公式,而不是程序语句,如x = x + 1对于数学家来说,似乎只是个永不为真的表达式而已。
  函数式编程十分容易并行,因为它在运行时不会修改任何状态,因此无论多少线程在运行时都可以观察到正确的结果。假如两个函数完全无关,那么它们是并行还是顺序执行便没有什么区别。
  当然,现实中的程序一定是有副作用的,例如向屏幕输出内容,向Socket传输数据等,因此真实世界中的函数式编程往往都会考虑如何将有副作用的代码分离出来。函数式编程默认是不可变的,开发人员必须做些额外的事情才能使用可变状态或是危险的副作用,与之相反,C#或Java必须使用readonly或final来做到这一点。此时,使用函数式编程语言时的思维观念便会有所不同。
下一篇:&&[]
与C#,编程语言,趋势,预测相关的新闻有:
? 您将承担一切因您的行为、言论而直接或间接导致的民事或刑事法律责任
? 留言板管理人员有权保留或删除其管辖留言中的任意内容
? 本站提醒:不要进行人身攻击与无聊谩骂。谢谢配合。
ヨC#涔剁缂绋璇瓒块娴
绋搴璁$涓寮缂绋璇锛浣绋璇ㄥ藉澶х澧涓技涔存釜浜绛锛璁稿浜轰璁や负锛璇璁ㄨ瀹ㄦユ锛浣跺缂绋璇涓伐枫妗舵寮规绛涓凤藉浜у瑕褰卞
浜瀹涓锛璇灞姣朵归㈡翠负涔锛骞朵ㄨ骞达虫杩骞翠腑戒跺ㄤ纰版婕翠浜扮璇璇浜锛涓浜ㄥ剁ラ虫ョ介璇缂绋寮拌寰浜瑙
Anders Hejlsberg井杞Technical Fellow锛浠C#缂绋璇棣甯舵甯锛涔涓.NET FrameworkVB.NETF#绛璇璁捐涓锛Delphi涓C#涔讹虫舵寮浼濂涓璇浠缁浜Anders Hejlsbergㄥ井杞缂绋浼濂涔璺
涓锛Andersㄦ╂TechDays 2010峰DevDays 2010浜涓烘璁诧杩颁浠间腑缂绋璇灞瓒垮ユ瑰锛渚垮浠瑙硅琛浜荤
澶х害25~30骞村锛Anders寮浜Turbo Pascal锛杩濂璇缂璇ㄥ寮宸ュ蜂浣浜у锛涔Anders杩ョ绋璇棰璧风广Anders璋帮褰骞Turbo PascalㄧZ-80濡浠璁$哄凡缁ヨ璇涓f剁告锛濡浠哄ㄥ凡缁澶х害10涓澶ㄥㄥ1涓瀛澶уCPU搴澶х害1000楂浣濡浠杈濡浠Java浠g褰骞寸Pascal浠g锛浼瀹浠宸跺骞朵澶с
Anders璁や负缂绋璇灞甯哥村跺虹浜涓浜涓瑗匡渚濡㈠瀵硅薄绛锛浣娌℃濂戒1000浜瀹涓锛杩骞存ョ涓昏浣ㄦ跺宸ュ风归(濡1)渚濡.NET Framework瓒杩涓涓涓被涓涓规锛涓Turbo Pascal告纭浜瓒杩1000澧裤绫讳技锛ㄧIDE板己澶х斤渚濡璇绀恒璋璇ㄧ涓告锛缂绋璇硅纭涓俱
ㄨ50~60骞寸缂绋涓缂绋璇借薄绾у楂锛浜轰滑藉ㄥ璁╃绋璇存琛ㄧ锛杩峰氨浠ョㄦ村浠g瀹村宸ヤ浠寮濮浣跨ㄦ缂锛跺娇ㄩ㈠杩绋璇(濡PascalC)锛跺㈠瀵硅薄璇(濡C++)锛究杩ヤ绠℃朵唬锛璇杩琛浜绠$ц澧涓(濡C#Java)锛瀹浠涓昏规фㄥ炬堕绫诲瀹ㄧAnders璁や负杩风瓒胯浼缁х画涓锛杩浼借薄绾уヨ楂璇涓归缂绋璇寰寰藉惧浜寤轰宸ュ蜂锛涓浼浠ご璧枫ㄥ虹缂绋璇锛渚濡F#ScalaClojure绛锛芥轰妗舵寤虹锛姣浠ご寮濮浠d环瀹ㄥお楂
Anders间腑锛濡浠褰卞杈澶х瓒夸富瑕涓涓(濡2)锛0缂绋椋(瑰璇芥板绋)ㄦ璇(瑕归㈡缂绋藉)浠ュ澶哥澧涓骞跺缂绋姝ゅ璇灞锛父ㄧ㈠瀵硅薄璇ㄦ璇芥板杈圭涔寰瓒ヨ妯$锛渚濡绉涓昏缂绋璇藉板芥板瑷褰卞姝わ澶寮搴璁¤瑷涔涓剧瓒裤
澹版绋涓DSL
甯歌缂绋璇澶ч芥戒护寮(Imperative)锛渚濡C#JavaC++绛杩浜璇瑰ㄤ浠g涓浠琛ㄧ浜浠涔(What)锛村琛ㄧ衡濡浣(How)瀹宸ヤ杩风瀹缁锛渚濡for寰i += 1绛锛宠ㄥ缁浼浠缁
Andersワ戒护寮绋甯镐璁╀唬寰浣锛撮瑕变渚浜杩浜蜂浠わ杩锋ц浠g虹璁炬(濡CLRJVM)娌℃澶ョ┖达借瀹瀹版规浠や姝ユ板杩渚濡锛骞惰ц绋搴寰伴撅涓哄ц杩锋撮灞娆$淇℃凡缁涪澶变姝わ缂绋璇瓒夸涓锛渚挎借浠g村What锛涓How锛杩锋ц澧渚垮浠ユ村板搴褰ц瑕姹
充0缂绋椋硷Anders涓昏轰涓や釜归绗涓归㈡DSL(Domain Specific Language锛棰瑰璇)DSL涓涔伴匡浠钩剁父瑙SQLCSS姝e琛ㄨ揪寮藉浜DSLDSL芥村涓娉ㄤ涓归渚濡MathematicaLOGO绛杩浜璇芥瑰棰锛涓稿GPPL(General Purpose Programming Language锛ㄧ缂绋璇)
Martin Fowler灏DSL涓哄DSLDSL涓ょ澶DSL繁瑰璇瑙fㄥ璇娉ㄧ锛瀹浠寰绉灏缂绋璇锛充浼GPPLf烽瑕婧浠躲涓稿DSLDSL跺村О锛瀹浠h〃涓绫荤瑰API浣跨ㄦā寮
XSLTSQL绛藉浠ョ浣DSL澶DSL涓存瀵圭瑰棰璁捐锛涓朵归James Gosling剧杩锛姣釜缃浠舵缁戒涓ㄧ绋璇涓寮濮浣藉浼ㄥ琛ㄧず涓圭逛瑗匡㈡㈠颁渚夸宠涓浜瑙锛杩浜瑙浜琛ㄨ揪寮ヤ借浼瀹涔杩琛′欢ゆ锛缁瀹灏卞浜涓绉濂缂绋璇杩风靛薄瑙涓椴ㄦ涓浜涔ㄥ虫敞DSL寮
渚濡浠ュㄥ井杞伐浣Charles Simonyi轰Intentional Programming姒蹇碉杩JetBrains渚浜MPS(Meta Programming System)浜у杩寰蒋涔轰繁Oslo椤圭Eclipse涓涔Xtext锛浠ュ浠ㄨ归㈠凡缁涓灏灏璇变DSLэㄦ浜典涔浼虹瑰宸ュ凤杈╅涓瀹舵浜哄缂DSL浠g杩涓浜DSL浼浠XML硅褰㈠猴╃XML硅濂藉ㄤ涓灏宸ュ峰杩峰浠ユ村揩板涔繁璇
DSL寰寰浠h〃涓绯诲瑰API浣跨ㄦā寮渚濡LINQヨ璇Ruby on Rails涓Active Record澹版唬绛DSL浠ヤ娇ㄤ绯诲APIモ浼涓绉DSL锛╃ㄤ浜娴宸э渚濡jQueryf锋涓浜规杩光杩璧锋ワ涓浜涔浼╃ㄥ缂绋瑰DSL杩涓浜浼匡渚濡浠ヨ瑷涓浠g浠ュ╃ㄤ唬琛ュㄣ绛姣璇规с
DSL璇绘у寰寰楂渚濡锛瑕绛哄浠峰ぇ浜20浜у锛骞跺灞绉绫昏琛缁锛搴烘绫诲绉板浜у伴濡ㄥ戒护寮缂绋瑰芥风锛
var groups = new Dictionary(); foreach (Product p in products) { if (p.UnitPrice &= 20) { if (!groups.ContainsKey(p.CategoryName)) { Grouping g = new Grouping(); g.Name = p.CategoryN g.Count = 0; groups[p.CategoryName] = } groups[p.CategoryName].ProductCount++; } } var result = new List(groups.Values); result.Sort(delegate(Grouping x, Grouping y) { return x.Count & y.Count ? -1 : x.Count & y.Count ? 1 : 0; });
剧惰浜浠g缂璧锋ラ瑕涓规堕达涓寰剧存哄瀹锛㈣涔锛What涔ㄨHow浠f夸杩凤涓涓扮绋搴蹇椤昏辫垂涓瀹堕存界瑙h娈典唬浣濡浣跨LINQ锛浠g渚垮浠ユ瑰锛
var result = products Where(p =& p.UnitPrice &= 20) GroupBy(p =& p.CategoryName) OrderByDescending(g =& g.Count()) Select(g =& new { Name = g.Key, Count = g.Count() });
杩娈典唬村虫敞How涓What锛瀹涓浼‘扮鸿婊ょ浣瑰涔娌℃娑板寤哄歌风缁杩娈典唬杩浠ュ╃C# 3.0涓缃DSL锛LINQヨ璇ユ瑰锛
var result = from p in products where p.UnitPrice &= 20 group p by p.CategoryName into g orderby g.Count() descending select new { Name = g.Key, Count = g.Count() };
缂璇ㄤ绠板LINQ宸璇杞涓哄涓绉褰㈠杩娈典唬〃烘缁锛涓‘瀹浜瑰杩蜂究浠ュ瀹规板苟琛ц杩娈典唬锛濡浣跨PINQ涔瑕轰换浣淇广
Anders虹涓涓瑕澹版绋瑰究芥板绋芥板绋涔锛濡褰骞寸LISP渚挎芥板绋璇やLISP浠ュ杩朵璁稿芥板绋璇锛濡APLHaskellML绛芥板绋ㄥ宸茬杩璁稿绌讹澶х害5~10骞村璁稿浜哄濮告跺寸杩浜绌跺瀹癸宠瀹浠ユ翠负ㄧ缂绋璇ㄧ缂绋璇锛濡C#PythonRubyScala绛锛藉颁芥板绋璇褰卞
浣跨ㄥ戒护寮绋璇绋搴讹浠父浼缂濡x = x + 1杩风璇锛姝ゆ舵浠ぇ璧舵锛璇存瀹浠煎浠ラ搴琛瑰锛舵甯稿己澶э浣ョ渚挎ㄢ锛渚濡涓涓扮void规锛瀹浼规ㄦ版ㄥ釜绾跨涓杩琛璋ㄥ绋搴骇褰卞锛瀹浼瑰绋搴ㄧ舵锛浠褰卞涔杩琛ㄥ芥板绋涓涓浼虹杩涓碉涓烘舵芥浜瀹涓瀵瑰芥板绋璁ㄨ村板涓搴锛濡x = x + 1瀵逛板瀹舵ヨ锛浼间釜姘镐涓虹琛ㄨ揪寮宸层
芥板绋瀹规骞惰锛涓哄ㄨ琛朵浼淇逛换浣舵锛姝ゆ璁哄灏绾跨ㄨ琛堕藉浠ヨ瀵版纭缁濡涓や釜芥板ㄦ筹d瀹浠苟琛杩『搴ц渚挎病浠涔哄
褰讹瀹涓绋搴瀹ㄧ锛渚濡灞杈哄瀹癸Socket浼杈版锛姝ょ瀹涓涓芥板绋寰寰戒濡浣灏ㄧ浠g绂诲烘ャ芥板绋榛璁ゆ锛寮浜哄蹇椤诲浜棰澶浜戒娇ㄥ舵遍╃涓稿锛C#Java蹇椤讳娇readonlyfinalュ拌涓广姝ゆ讹浣跨ㄥ芥板绋璇剁缁磋蹇典究浼涓
瀹瑰井/寰俊
姣ュご°涓璧璁硅璁锛ㄥぉ璺韪井ャ绉骞辫竟璧璁缃灏姐句浜缃绮涓浜ㄥ涓TechWeb瀹瑰井寰ㄧ虫敞
冲ㄦ轰璧璁璁绉锛崇涓堕寸娣卞害ラ锛璇峰虫敞TechWeb瀹瑰井淇″甯锛1.ㄦ烘乏渚т缁寸锛2.ㄦ坊锛绱㈠虫敞TechWeb
稿崇璧璁锛
ㄦ杈规璁捐版nubia Z9杩ュ凡缁ㄥ藉涓甯锛涓杩浜瑕甯烘剧朵姝...
涓S6绯诲iPhone 6浠ヨ浜哄虫敞娆炬轰璋Counterpoint...
榄MX5ㄥ伐淇¢ㄨ锛杩娆炬版鸿舵涓轰浜轰滑虫敞广涓浠宸ヤ俊ㄥ...
江绀炬ラ锛规宸茬涓界寮涓iPhone缂搴杩浣夸腑藉ㄤ涓瀛e害涓鸿...
65ユ绔ラ锛璋锋(寰)戒ㄤ骞村涔ㄤ腑藉版鸿繁搴...
瀵规ㄦ寰缃HTC灏瑁50%娑HTCㄤ汉澹澶╁版氮绉锛骞惰〃绀H...
板濂冲村垮ぇ浣娲诲ㄥ冲版ワ525ヨ527ユ达跺绘100宸★濂卞......
MT2扮绔哄藉遍甯瀹讹扮涓宕璧凤妗剁浠ヨ......
濉浼濂绛惧拌遍界锛澶у垮版涔冲瀵逛涓朵遍杩涓浜绾缁......
濂杩规寮扮瀹朵滑杩ユ父瑕褰舵ф涓涓㈣璞缃灏......
Copyright 漏
All rights reserved.
璇烽╀寮剧浜
瑕杞版氮寰锛璇
瑕杞QQ绌洪锛璇
Copyright &
All rights reserved.
/浜灞娴锋灞澶妗缂:

我要回帖

更多关于 zen架构之父 的文章

 

随机推荐